你不能获取一个现有的颜色值并应用alpha通道。也就是说,你不能使用一个现有的十六进制值,如#f0f0f0,给它一个alpha组件,并将结果值与另一个属性一起使用。
然而,自定义属性允许您将十六进制值转换为rgba()使用的RGB三元组,将该值存储在自定义属性中(包括逗号!),使用var()将该值替换为rgba()函数与您想要的alpha值,它将工作:
:根{
/* #f0f0f0十进制RGB */
——颜色:240、240、240;
}
身体{
颜色:# 000;
background - color: # 000;
}
#{元素
Background-color: rgba(var(——color), 0.8);
}
<p id="element">如果你能看到这个,说明你的浏览器支持自定义属性
这似乎好得令人难以置信它是如何工作的?
神奇之处在于,自定义属性的值被替换,就像在属性值中替换var()引用时一样,在计算该属性值之前。这意味着就自定义属性而言,示例中的——color值根本不是颜色值,直到某个地方出现了需要颜色值的var(——color)表达式(并且仅在该上下文中)。css-variables规范第2.1节:
自定义属性所允许的语法非常宽松。< declarations -value>结果匹配一个或多个令牌的任何序列,只要该序列不包含<bad-string-token>, <bad-url-token>, unmatched <)-token>, <]-token>,或<}-token>,或顶级<分号-token>令牌或< delimi -token>值为"!"的令牌。
例如,下面是一个有效的自定义属性:
——foo: if(x > 5) this。宽度= 10;
虽然这个值作为变量显然是无用的,因为它在任何普通属性中都是无效的,但JavaScript可能会读取它并对其进行操作。
第三部分:
如果属性包含一个或多个var()函数,并且这些函数在语法上是有效的,则必须假设整个属性的语法在解析时是有效的。它只在var()函数被替换之后,在计算值时进行语法检查。
这意味着在计算声明之前,上面看到的240,240,240值直接被替换到rgba()函数中。所以这个:
#element {
background-color: rgba(var(--color), 0.8);
}
这似乎不是一个有效的CSS,因为rgba()期望不少于四个逗号分隔的数值,变成这样:
#element {
background-color: rgba(240, 240, 240, 0.8);
}
当然,这是完全有效的CSS。
更进一步,你可以将alpha组件存储在它自己的自定义属性中:
:root {
--color: 240, 240, 240;
--alpha: 0.8;
}
代入,得到同样的结果:
#element {
background-color: rgba(var(--color), var(--alpha));
}
这允许你有不同的alpha值,你可以在飞行中交换。
1好吧,如果你在一个不支持自定义属性的浏览器中运行代码片段,那么它就是。