← How does CSS work · 样式从哪来 / Cascade Layers:@layer 待审核 6 / 6
cascade · @layer

Cascade Layers:@layer

前面几页讲的都是「同一层里值怎么定」(见四层默认样式)。但 author origin 内部还能再分层:@layer 把你的 CSS 分进若干有序的 cascade layer。cascade 比较优先级时,layer 的先后顺序在 specificity 之前就先分胜负——后声明的 layer 整体赢过先声明的,哪怕它里面的选择器 specificity 更低。

  • 层的顺序由第一次出现的次序决定;一句 @layer reset, base, theme; 就能预先钉死顺序,后面块写哪都不影响。
  • 越靠后的 layer 优先级越高。同一元素被多层命中时,先看在不在更高的 layer,轮到 specificity。
  • 没进任何 layer 的「unlayered」规则,优先级高于所有 layered 规则(可理解为永远排在最后一层之后)。

注意默认这局:三条规则里 specificity 最高的是 #demo #lk(在 reset 层),最低的是 #demo a(在 theme 层)。可链接最后是 theme 的紫色——specificity 最低的那条反而赢了,仅因 theme最后一层。把 reset 拖到末尾,赢家直接换成橙色;但它赢不是因为 id 选择器 specificity 高,而是因为此时它在最后一层。

开 unlayered 看:那条 #demo a.lk 没写在任何 @layer 里,于是无视层顺序一直赢——这就是「unlayered > 所有 layered」。所以迁移老代码时,把第三方/旧样式塞进低优先 layer、自己的新样式留在 unlayered,就能不依赖提高 specificity 也稳定覆盖。

1 · 两条容易判断错的规则

场景 结果 为什么
layered vs unlayered(都不带 !important unlayered 赢 unlayered 排在所有 layer 之后
两条都带 !important 层顺序反转 !important 下:越靠前的 layer 反而越高,且 important-unlayered 最低

revert-layer 的关系:本页讲层之间怎么比;四个 CSS-wide 关键字里的 revert-layer 则是在分层 CSS 里把某属性退回前一个 layer 的值——一个定优先级,一个撤回本层,配套使用。

延伸阅读:MDN · @layerCSS Cascade 5 · Cascade Layers——嵌套 layer(@layer a.b)、匿名 layer、以及 !important 反转的规范定义。