规范默认值与继承
最底层的 Level 1 是每个属性的 initial value——规范规定的初始值,不针对任何标签(四层模型见四层默认样式)。但这里有个常被忽略的分叉:属性分两类——
可继承(inherited):如 color、font-size、line-height。若元素自己没设,它会自动取父元素的 computed 值,一路往子孙流——这就是你在 <body> 上设一次 color 全站文字都变色的原因。
不可继承(non-inherited):如 margin、padding、border、background。元素没设时直接用属性的 initial value,不看父元素——否则给容器加一道 border,所有后代都会跟着出现边框,布局会失控。
注意 unset 的双重行为:它的解析结果取决于属性——属性可继承时它等于 inherit(取父值),属性不可继承时它等于 initial(回到初始值)。切到不同属性、把孙设成 unset 对比。
1 · 常见属性:继承还是不继承
| 属性 | 可继承? | 为什么这样设计 |
|---|---|---|
color / font-* / line-height |
✓ 是 | 排版属性,通常希望整片文字统一,设一次即向下传递 |
text-align / letter-spacing / white-space |
✓ 是 | 同上,都属于「文字怎么排」 |
visibility / cursor / list-style |
✓ 是 | 语义上应对整棵子树一致生效 |
margin / padding / border |
✗ 否 | 盒子尺寸,继承会让每层都叠加,导致布局失真 |
background / width / height |
✗ 否 | 每个盒子各管各的,不该被父级强加 |
display / position / float |
✗ 否 | 布局角色由元素自身决定 |
经验规则:排版相关的属性多半可继承,盒模型 / 布局相关的多半不继承。不确定时,用上面的 demo 或 MDN 每个属性页的「Inherited」字段确认。