CSS 变量是一个很不错的特性,目前已被广泛使用,例如 Bootstrap。本文中,我将讨论一些并不常见的用法或者注意事项。
!important
在 CSS 变量中使用 !important
得注意,我们先看一个基本示例:
p {
--color: red !important;
color: var(--color);
color: blue;
}
p
会是什么颜色?你可能认为是红色,理所当然认为其等效于如下代码:
p {
color: red !important;
color: blue;
}
但事实并非如此!p
的颜色是蓝色,因为我们将得到以下内容:
p {
color: red;
color: blue;
}
这里 !important
不是颜色值的一部分,而是用于描述 --color
。
注意:自定义属性末尾可以跟随
!important
,但是会被 CSS 解析器自动从属性值中移除,而将自定义属性声明为important
。
下面是一个加深理解的例子:
p {
--color: red !important;
--color: blue;
color: var(--color);
}
以上代码最终的颜色值为红色:
我们声明了两个变量 --color
,但是第一个有 !important
,所以优先级更高;
然后 !important
被移除,red
被应用到 color
;
最终得到 color: red
。
一条重要的规则是始终将 CSS 变量(自定义属性)看做普通属性,而不是存储值的变量。
不能这样做:
:root {
--url: "https://picsum.photos/id/1/200/300";
}
.box {
background: url(var(--url));
}
应该这样做:
:root {
--url: url("https://picsum.photos/id/1/200/300");
}
.box {
background: var(--url);
}
问题的关键在于 url()
是如何被解析的。解决办法也很简单,始终在 CSS 变量中添加 url()
。
我们来看一个示例:
.box {
background: red;
background: linaer-gradient(red, blue);
}
上述代码会得到红色背景,而不是渐变色,注意这里有一个拼写错误,我们将 linear
错写为 linaer
。
然后我们引入一个变量:
.box {
--color: red;
background: var(--color);
background: linaer-gradient(var(--color), blue);
}
现在背景色是透明色。第二个声明不再是无效的了,而是一个有效值。你甚至会注意到第一个声明是无效的,因为第二个覆盖了它。
:root {
--p: 10px;
}
.box {
padding: var(--p);
}
也可以这样写:
:root {
--p: 10;
}
.box {
padding: calc(var(--p) * 1px);
}
一般来说,CSS 变量被定义为非动画属性。多亏了 @property
我们可以使用 CSS 变量来做动画(animation 和 transition)。
inherit
值看看如下代码:
<div class="box">
<div class="item"></div>
</div>
.box {
border: 2px solid red;
}
.item {
--b: inherit;
border: var(--b);
}
凭直觉,我们可能认为 .item
会继承其父元素的边框,因为 --b
包含 inherit
,但实际上并不是这样。
一个解决方案是将 inherit
用作 var()
的第二个参数,作为回退值。
.item {
border: var(--b, inherit);
}
变量值可以为空:
.box {
--color: ;
background: var(--color);
}
值必须包含一个字符,包括空格。
记住这条黄金准则:CSS 变量总是从父元素(或祖先元素)传递到子元素。不会从子元素传递到父元素或者在兄弟元素之间传递。
body {
--: red;
background: var(--);
}
CSS 变量可以只使用两个中横线。
包括下面的写法也是合法的:
body {
--📕: red;
--📗: green;
--📘: blue;
--📙: orange;
}
没错,emojis 也是合法的。
CSS 变量语法允许使用一切值,只需要以 --
开头。