前几天我收到了这个问题。我的第一反应是:奇怪的问题! 具体性是关于选择器的,而@规则不是选择器,所以…… 不相关?
为了证明这一点,我们可以在@规则内和@规则外使用相同的选择器,看看它是否会影响具体性。
body {
background: red;
}
@media (min-width: 1px) {
body {
background: black;
}
}
背景是黑色。但是…… 这是因为媒体查询提高了具体性吗?让我们将它们互换一下。
@media (min-width: 1px) {
body {
background: black;
}
}
body {
background: red;
}
背景是红色,所以不是。红色背景之所以获胜,是因为它在样式表中排在后面。媒体查询不会影响具体性。
如果感觉选择器正在提高具体性并覆盖具有相同选择器的其他样式,这很可能是因为它在样式表中排在后面。
不过,原始问题中的@keyframes
让我想了很多。当然,关键帧会影响样式。不是具体性,但如果最终覆盖了样式,它会感觉像具体性。
请参阅此 小型示例
@keyframes winner {
100% { background: green; }
}
body {
background: red !important;
animation: winner forwards;
}
您可能会认为背景应该是红色,尤其是使用!important
规则的情况下。(顺便说一下,!important
不会影响具体性;它是一个针对每个规则的设置。)在 Firefox 中它是红色的,但在 Chrome 中它是绿色的。所以这是一个需要注意的奇怪现象。(根据 Estelle Weyl 的说法,至少从 2014 年开始,这是一个错误。)
规范中没有写任何内容吗?
是的,它在 CSS 级联和继承模块(级别 3 和级别 4)中都有。级联算法首先比较样式的来源(常规样式,也称为“作者声明”,浏览器内置样式,也称为“用户代理声明”等),这些来源具有不同的优先级,只有当来源相同时,具体性才会起作用。
@keyframe
块内的样式被视为一种特殊的来源类型(“动画声明”),规范指出,它们比普通的“作者声明”具有更高的优先级,但比带有!important
的“作者声明”优先级低。因此,Firefox 的行为是正确的,而 Chrome 的行为是一个错误。Chrome 错误在这里:https://bugs.chromium.org/p/chromium/issues/detail?id=552085