CSS 层叠、继承与源顺序

把层叠全流程、继承属性与源顺序放在同一模型里,解释“最终样式从哪来”。

#type / concept #status / growing #tech / dev / frontend #resource / css

[!info] 关联笔记

CSS 层叠、继承与源顺序

这个概念为什么出现

“我写了 color,为什么是别的颜色?”答案可能是:

  • 被更具体规则覆盖
  • 被继承自祖先
  • 来自用户代理默认
  • 来自另一张样式表更靠后的同级规则
  • 来自 @layer / important 层

层叠是 CSS 的操作系统。

[!abstract] 一句话理解 最终值 = 候选声明经层叠排序后的胜者;部分属性可继承,源顺序只在同级平局时决胜。

最小可运行示例

场景:表格单元格文字颜色“来路不明”

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="utf-8" />
  <style>
    body { color: #0f172a; }          /* 继承起点 */
    .table { color: #334155; }
    .table td { /* 未设 color,继承 .table */ }
    .table td.em { color: #b91c1c; } /* 直接命中 */
  </style>
</head>
<body>
  <table class="table">
    <tr>
      <td>普通单元格</td>
      <td class="em">低库存</td>
    </tr>
  </table>
</body>
</html>

期望:普通单元格继承 .table 的灰蓝;.em 直接声明胜出为红。

结合场景关注点

  1. 继承 ≠ 选择器命中
  2. 直接声明再弱,也通常压过继承来的值。
  3. 调试先问:有没有直接命中的 color?

核心模型

层叠主线(教学)

  1. 收集所有命中该元素+该属性的声明
  2. 按来源与层(user agent / user / author,以及 cascade layers、important)排序
  3. 同层比特异性
  4. 再同则源顺序后写优先
  5. 得到指定值 → 经继承/初始值等步骤 → 计算值/使用值

继承

  • 典型继承:color font-* line-height
  • 典型不继承:margin padding border background
  • inherit/initial/unset/revert 是显式控制关键词

源顺序

只在其它条件相同时成为决胜局。把“把文件放后面”当唯一策略会与特异性打架。

@layer(现代工程)

层叠层允许框架/重置/组件/工具类在特异性之外约定优先级。Tailwind 等工具会利用层。细节随版本查阅官方。

设计动机

CSS 必须合并多来源样式且保持可覆盖性。继承减少重复文本样式;层叠提供冲突解决;源顺序提供同级确定性。

常见误区

[!warning] 常见误区:继承来的样式有特异性 继承值不参与选择器特异性比赛;被直接声明覆盖是常态。

工程实践

  • 重置样式保持低特异性
  • 设计 token 放在 :root 变量,组件消费变量
  • 工具类与组件 CSS 冲突时优先看 layer/顺序配置
  • DevTools Computed 是真相来源

本节总结

层叠回答“谁赢”,继承回答“没写时从哪来”,源顺序回答“平局怎么办”。

自测题

  1. 为什么后写的元素选择器盖不过先写的类选择器?
  2. color: inherit 解决什么?
参考答案
  1. 类特异性更高,源顺序轮不到决胜。
  2. 强制使用父元素的计算 color,而不是初始值或其它来源。

延伸阅读

资料类型支撑内容
css-cascade-5规范层叠
MDN Inheritance文档继承
创建于 2026/7/6 更新于 2026/7/15