我在 Lea 的测验中属于答错的 82% 的人 Lea 的测验 (推文版本)。
这是代码
:root {
--accent-color: skyblue;
}
div {
--accent-color: revert;
background: var(--accent-color, orange);
}
那么我期望 <div>
有什么背景颜色呢?
我的大脑是这样思考的
- 好吧,
--accent-color
已声明,所以肯定不是orange
(备用值)。 - 背景的值是
revert
,所以它本质上是background: revert;
- 但是
background
属性不会继承,即使你强制它继承,它也会从<body>
继承,而不是根元素。 - 所以……
transparent
。
不。
Lea
[因为该值是
revert
,所以它]取消了任何作者样式,并重置回该属性从用户样式表和 UA 样式表中获取的任何值。假设用户样式表中没有--accent-color
声明,当然 UA 样式表不会设置自定义属性,这意味着该属性没有值。由于自定义属性是继承属性(除非它们 已注册 为
inherits: false
,但此属性未注册),这意味着继承的值会向下传递,也就是——你猜对了——skyblue
。
Stephen 前几天发布了一个类似的测验
同样,我的大脑完全错误地理解了它。它是这样思考的
- 好的,
--color
已声明,所以它不是蓝色(备用值)。 - 它不是
red
,因为第二个声明将覆盖第一个声明。 - 所以,它本质上类似于
p { color: inherit; }
。 <p>
将从<body>
继承yellow
,它本来也会自然地这样做,但无论如何,它仍然是yellow
。
不。
显然,那里的 inherit
实际上是从树中设置它的下一个位置继承的,html
确实如此,所以是 green
。这实际上是正常继承的工作方式。它只是一个脑筋急转弯,因为很容易将 color
属性与 --color
自定义属性混淆。
另外,了解当你使用 @property
实际声明自定义属性时,你可以指定是否希望它继承也很有用。所以这会改变这些脑筋急转弯的游戏规则!
@property --property-name {
syntax: '<color>';
inherits: false;
initial-value: #c0ffee;
}