CSS | 10分钟学会css原生变量

这是我参与更文挑战的第18天,活动详情查看 更文挑战

当我们项目有大量css代码时,通常就会有很多重复的值。比如同样一个颜色值可能在成千上百个地方被使用到,如果想要改这一个值,一个一个替换很显然是很不现实的。这个时候我们就需要用变量来控制了,庆幸的是,原生css本身就支持变量的使用。

声明css变量

声明变量的方式就是在变量名前面加两根连词线(–)

body{
    --main-bg-color:#99CCFF;
}
复制代码

注意

1) css变量大小写敏感, --main-bg-color --Main-Bg-Color是不同的。

2) 【css变量】也叫做【CSS自定义属性】

3) 我们需要一个地方来放置自定义属性。虽然可以在任何样式规则中指定自定义属性,但到处定义属性并不是一个好主意,这对CSS的可维护性和可阅读性是一个挑战。

【:root】 伪类代表了HTML文档的根元素,这是一个放置自定义属性的好位置,因为我们可以通过其他更具特异性的选择器来覆盖自定义属性值。

所以上面的声明最好改为:

:root{
    --main-bg-color:#99CCFF;
}
复制代码

使用css变量

利用var()函数来读取变量

.box{
    width: 100px;
    height: 100px;
    background: var(--main-bg-color);
}
复制代码

image.png

var()函数还可以用第二个参数,表示变量的默认值,如果使用的变量未声明,则会使用默认值。

image.png

注意

1) 如果变量值是数值,不能与数值单位直接连用。

错误使用:

image.png

正确使用:

利用calc()函数连接。

:root{
    --space:20
}
.box{
   margin: calc(var(--space) * 1px);
}
复制代码

2)如果变量带有单位,不能写成字符串。

错误使用:

image.png

正确使用:

:root{
    --space:20px
}
.box{
   margin:var(--space);
}
复制代码

css变量的继承

自定义属性会继承。这意味着如果在一个给定的元素上,没有为这个自定义属性设置值,在其父元素上的值会被使用。

看这一段HTML

<div class="div1">
    div1
    <div class="blue div2">
        div2
        <div class="red div3"> div3</div>
        <div class="div4"> div4</div>
    </div>
</div>
复制代码

在两个地方定义变量

.blue {
    --test:#99CCFF;
}
.red {
    --test:#FF3333;
}
复制代码

下面我们来看一下每一个的生效情况

1)对于class=”div1″,变量未定义,使用了默认值白色

image.png

2)对于class=”div2″,使用了自己元素上定义的变量,蓝色

image.png

3)对于class=”div3″,自己元素上定义的变量比父级的高,使用了红色

image.png

4)对于class=”div4″,继承了父级div2的变量,使用了蓝色

image.png

不能为元素设置一个属性,然后让它从兄弟或旁支子孙规则上获取值。属性仅用于匹配当前选择器及其子孙,这和通常的CSS是一样的。

css变量作用域

看下面的一段HTML代码

<div class="box div1" id="first">方块一</div>
<div class="box div2">方块二</div>
<div class="box div3">方块三</div>
<div class="box div4">方块四</div>
复制代码

配套的CSS

:root { --bg: blue; }
div { --bg: green; }
#first { --bg: red; }
* { background: var(--bg); }
复制代码

效果

image.png

上面代码中,三个选择器都声明了–color变量。不同元素读取这个变量的时候,会采用优先级最高的规则,因此三段文字的颜色是不一样的。

这就是说,变量的作用域就是它所在的选择器的有效范围。

JavaScript操作CSS变量

在 JavaScript 中获取或者修改 CSS 变量和操作普通 CSS 属性是一样的:

// 获取一个 Dom 节点上的 CSS 变量
element.style.getPropertyValue("--my-var");

// 获取任意 Dom 节点上的 CSS 变量
getComputedStyle(element).getPropertyValue("--my-var");

// 修改一个 Dom 节点上的 CSS 变量
element.style.setProperty("--my-var", jsVar + 4);
复制代码

CSS 变量和预处理器变量有什么区别?

在为网站设置样式的时候,为了更灵活的使用css,最常见的方法就是使用Sass和Less等预处理器。预处理器可以设置变量并在函数、循环、数学运算等中使用它们。

这是否意味着 CSS 变量无关紧要?

不完全是,主要是因为 CSS 变量与预处理器变量不同。不同之处在于 CSS 变量是在浏览器中运行的实时CSS属性,而预处理器变量最终还是被编译为常规的CSS代码。浏览器认识css变量,但是对预处理器变量一无所知。

这意味着你可以更新样式表文档中、内联样式属性和 SVG 展示属性中的 CSS 变量,或者选择使用 JavaScript 即时操作它们。但是预处理器变量做不了这些。

如果你使用Less/Sass之类的预编译工具,基本上用到的就是变量,其他高级功能,几乎不怎么用,那直接使用原生css变量就够了。

css变量

1)动态性,可以在运行时更改
2)可以方便地从js读写
3)可继承,可组合,有作用域
复制代码

预处理器

1)预处理器的变量不是动态的,在运行时不可更改
2)预处理器的变量没有作用域的说法
3)不能与js交互
复制代码

引用参考:
Using CSS custom properties
A Practical Guide to CSS Variables

小可爱看完就点个赞再走吧!???

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享