浅谈原生CSS变量(自定义属性)

简介: 在CSS中使用变量并不是一个稀罕事,早在2007年Sass的诞生,就可以通过预处理的方式去处理变量,相继的又出现了Less和Stylus预处理器。
Hi~,我是 一碗周,一个在舒适区垂死挣扎的前端,如果写的文章有幸可以得到你的青睐,万分有幸~

写在前面

在CSS中使用变量并不是一个稀罕事,早在2007年Sass的诞生,就可以通过预处理的方式去处理变量,相继的又出现了Less和Stylus预处理器。

原生CSS直到CSS3的推出,才出现了变量 (又称为自定义属性 )的概念,现在我们就来学习一下。

基本用法

原生CSS定义变量,变量名需要使用两个减号--开始,其值可以是任何有效的CSS值。定义CSS比那里的写法与普通CSS属性的写法是一致的。语法规则如下:

element {
  --main-text-color: #333333;
}
其中 --main-text-color表示变量名, #333333表示变量值。

那原生CSS为什么采用两个减号--开始,我猜测是因为@被Less占了,$被Sass占了,它被迫选择了--

原生CSS变量是受HTML层级关系的限制的,并从其父级继承这个值。所以说最佳的实践就是定义在根伪类:root选择器上。

示例代码如下:

:root {
  --main-text-color: #FF6A00;
}

然后我们的HTML结构如下:

<h1 class="text">彼岸繁華</h1>

现在我们已经定义好了变量和HTML结构,使用CSS中的变量使用var()函数,实现如下:

.text {
  color: var(--main-text-color);
}

最终的实现效果如下:

image.png

值得注意的是 自定义属性的大小写是敏感 的,即--my-color--My-color会被认为这是两个变量。

复杂值的用法

当我们需要使用一个函数作为一个值去使用的时候,例如下面这段代码

background-image: url(./image/avatar.png);

使用变量定义的时候不应该只定义./image/avatar.png,而是将整个值作为一个变量,定义如下:

--avatar: url('./image/avatar.png');
background-image: url(./image/avatar.png);

变量的继承性

原生CSS的变量存在着继承,也就是说我们为某个父级添加一个变量,可以在子级任何访问。

HTML结构如下:

<div class="parent">
  <div class="child">彼岸繁華</div>
</div>

CSS的代码如下:

.parent {
  --color: #FF6A00;
  --font-size: 24px;
  --font-weight: 600;
}

.child {
  color: var(--color);
  font-size: var(--font-size);
  font-weight: var(--font-weight);
  margin: 32px;
}

我们在.parent 中定义的变量可以在子级的任意使用。

最终的效果如下:

image_1.png

变量的备用值

CSS的var()函数可以接受两个参数,第一个作为他的值,第二个参数作为其备用值,备用值在第一个值失效的时候使用。

这个函数只能接受两个参数,第一个参数为变量的名称,第二个参数为备用值,但是如果大于两个参数得话,第一个逗号,后面的的参数会作为一个参数使用。

第二个参数是可以进行嵌套的,示例代码如下:

.first {
    /* 当前文字的颜色为red,因为--color不在当前元素内,也不再当前父元素内 */
    color: var(--color, red);
    /* 当前文字的颜色为--main-text-color,如果--main-text-color不存在时,文字颜色为red */
    color: var(--color, var(--main-text-color, red));
    /* 当前文字的颜色为 red,white ,所以说var()只可以使用两个参数 */
    color: var(--color, red, white);
}

HTML代码如下:

<h1 class="first">彼岸繁華</h1>

通过JS获取和设置CSS变量

通过JavaScript获取和设置JavaScript变量的具体步骤如下,

  1. 获取指定DOM节点
  2. 通过getComputedStyle()方法获取当前DOM节点的CSSStyleDeclaration对象
  3. 通过CSSStyleDeclaration.getPropertyValue(变量名/属性名)获取指定的变量值
  4. 通过Element.style.setProperty() 修改或者设置一个变量的值

实现代码如下:

// 1
const child = document.getElementById('child')
// 2 3
let color = getComputedStyle(child).getPropertyValue('--color')
console.log(color) // #FF6A00
// 4
child.style.setProperty('--color', '#eeeccc')
color = getComputedStyle(child).getPropertyValue('--color')
console.log(color) // #eeeccc

总结

CSS原生支持变量可以帮助我们解决一些问题,最要的的就是CSS中的一些值得复用,例如颜色之类的。还有就是通过Less或者Cass解决不了的问题,例如我们的这个字体颜色是从服务端获取的,需要通过CSS的方式为其设置字体颜色,这样的话使用Less或者Sass解决基本是不可能的,但是有个这个东西就很好的帮助了我们解决这些问题。

掌握了原生的CSS变量配合Less或者Sass可以在开发中完成一些之前做不到的效果。

目录
相关文章
|
3月前
|
前端开发
CSS属性:盒子模型
CSS属性:盒子模型
38 0
|
3月前
|
前端开发
CSS属性
CSS属性
33 0
|
24天前
|
存储 移动开发 前端开发
高效的 HTML 与 CSS 编写技巧,涵盖语义化标签、文档结构优化、CSS 预处理、模块化设计、选择器优化、CSS 变量、媒体查询等内容
本文深入探讨了高效的 HTML 与 CSS 编写技巧,涵盖语义化标签、文档结构优化、CSS 预处理、模块化设计、选择器优化、CSS 变量、媒体查询等内容,旨在提升开发效率、网站性能和用户体验。
36 5
|
1月前
|
前端开发
CSS 浮动属性讲解和使用
本文介绍了CSS中的浮动(float)属性,包括其基本功能、属性选项及其在网页布局中的应用。浮动使元素脱离文档流,向左或右排列,周围元素随之调整。文章还详细讲解了清除浮动的方法,如使用clear属性、设置父元素高度、利用overflow属性、伪元素等,以解决因浮动导致的布局问题。最后,强调了浮动在创建复杂布局时的作用,并预告后续内容。
36 2
|
1月前
|
前端开发
CSS transition过渡属性详解
本文介绍了CSS中`transition`属性的作用、用法及实例。`transition`用于在元素属性变化时添加平滑过渡动画,通过设置`transition-property`、`transition-duration`、`transition-timing-function`和`transition-delay`等属性值,可以精细控制过渡效果。文末提供了HTML示例代码,展示了如何使用`transition`实现鼠标悬停时背景颜色的平滑变化。
44 1
|
1月前
|
前端开发 JavaScript
如何在 JavaScript 中访问和修改 CSS 变量?
【10月更文挑战第28天】通过以上方法,可以在JavaScript中灵活地访问和修改CSS变量,从而实现根据用户交互、页面状态等动态地改变页面样式,为网页添加更多的交互性和动态效果。在实际应用中,可以根据具体的需求和场景选择合适的方法来操作CSS变量。
|
1月前
|
前端开发 JavaScript 数据处理
CSS 变量的作用域和 JavaScript 变量的作用域有什么不同?
【10月更文挑战第28天】CSS变量和JavaScript变量虽然都有各自的作用域概念,但由于它们所属的语言和应用场景不同,其作用域的定义、范围、覆盖规则以及与其他语言特性的交互方式等方面都存在明显的差异。理解这些差异有助于更好地在Web开发中分别运用它们来实现预期的页面效果和功能逻辑。
|
1月前
|
前端开发 JavaScript
如何在 CSS 变量中使用函数?
【10月更文挑战第28天】虽然CSS变量本身不能像传统编程语言中的函数那样直接进行复杂的运算和逻辑处理,但通过CSS预处理器、`calc()` 函数以及与JavaScript的结合,可以在很大程度上实现类似函数的功能,提高CSS样式的灵活性和可维护性,满足各种不同的页面设计和交互需求。
|
1月前
|
前端开发 开发者 容器
CSS 变量的作用域是什么?
【10月更文挑战第28天】理解CSS变量的作用域规则对于有效地使用CSS变量来组织和管理页面样式非常重要。通过合理地利用全局作用域和局部作用域,以及掌握变量的覆盖和继承规则,可以创建更具可维护性、灵活性和可扩展性的CSS样式表,实现各种复杂的页面设计和样式需求。
|
1月前
|
前端开发 JavaScript UED