无需登录 数据私有 本地保存

CSS 级联层 (@layer) 优先级可视化 - 层叠顺序对比

13
0
0
0
CSS @layer 优先级可视化
点击层卡片查看详情并编辑
最高优先级 ↑ — 越靠上优先级越高(针对普通声明)
最低优先级 ↓
提示:层声明顺序越靠后,优先级越高(!important 则相反)
选择一个层进行编辑

👈 点击左侧的层卡片来编辑其属性

实时预览元素
预览文本 Preview
最终生效样式将显示在此元素上
常见问题与知识点

@layer 是 CSS 级联层规则,允许开发者将样式组织到不同的"层"中,显式控制样式优先级。它解决了大型项目中不同来源样式(如第三方库、组件库、工具类、自定义样式)之间的优先级冲突问题。通过声明层的顺序,可以优雅地决定哪些样式优先,而无需依赖选择器特异性的"军备竞赛"。

层优先级由声明顺序决定:后声明的层优先级高于先声明的层。例如 @layer base, components, utilities; 中,utilities 优先级最高。此外,未分层样式(即不在任何 @layer 中的样式)优先级高于所有分层样式。这使得开发者可以安全地将第三方样式放入低优先级层,而自己的样式保持未分层以获得最高优先级。

在层内部,!important反转优先级:较早声明的层中的 !important 声明会覆盖较晚声明的层中的 !important 声明。但未分层样式中的 !important 仍然拥有最高优先级。完整优先级从高到低为:① 未分层 !important → ② 分层 !important(早声明 > 晚声明)→ ③ 未分层普通样式 → ④ 分层普通样式(晚声明 > 早声明)。

有三种主要语法:① 预声明顺序:@layer base, components, utilities;(仅定义顺序,不包含样式);② 块级定义:@layer base { ... }(定义顺序即声明顺序);③ 导入时指定层:@import url('theme.css') layer(theme);。可以混合使用,但预声明必须放在任何块级定义之前。匿名层也支持:@layer { ... },每次使用都会创建一个新的匿名层。

截至 2024 年,@layer 在所有主流现代浏览器中都得到良好支持:Chrome 99+、Firefox 97+、Safari 15.4+、Edge 99+。全球覆盖率超过 94%。对于不支持 @layer 的旧浏览器,分层样式会被当作普通样式处理(按出现顺序应用),通常不会导致灾难性后果。可以使用 @supports 进行渐进增强。

层可以嵌套,使用点号分隔:@layer framework { @layer base { ... } @layer theme { ... } },外部可通过 @layer framework.base { ... } 访问。嵌套层的优先级在父层内部独立计算。这在大型设计系统中非常有用,可以在一个大的层内再细分子层级,而不会影响其他大层之间的优先级关系。

层的优先级先于选择器特异性。即使低优先级层中使用了极高特异性的选择器(如 #id .class > [attr]),也无法覆盖高优先级层中的简单选择器(如 .class)。只有在同一层内,选择器特异性才起作用。这意味着 @layer 从根本上改变了 CSS 级联的决策顺序,将"层优先级"插入到了"来源和重要性"与"特异性"之间。

推荐的分层策略:@layer reset, vendor, base, components, utilities, overrides;。其中 reset 放 CSS 重置,vendor 放第三方库,base 放全局基础样式,components 放组件样式,utilities 放工具类(如 Tailwind),overrides 放必要的覆盖。自己的业务样式可以放在未分层区域以获得最高优先级,或者放在 overrides 层中统一管理。这能极大减少特异性冲突和维护成本。