css前端

CSS 继承与重置:initial、inherit、unset 怎么选

把 initial、inherit、unset 的差异放到真实 CSS 场景里讲清楚,并说明哪些属性默认会继承、哪些不会,避免把重置和继承写反。

·更新于 ·阅读约 5 分钟·计算中...
CSS 继承与重置:initial、inherit、unset 怎么选

理解 initialinheritunset 最有效的方式,不是背定义,而是先问“这个属性本来会不会继承”。因为 unset 的行为就取决于这一点。文本颜色、字体这些通常会继承;宽高、边距、背景、定位这些通常不会。

在这里插入图片描述

目录

三个关键字先看结论

关键字 作用 适合什么时候用
initial 设回属性初始值 明确要“重置为默认规则”
inherit 强制拿父元素当前值 明确要和父元素保持一致
unset 可继承属性时像 inherit,否则像 initial 不想手动判断继承规则时

最容易误解的是:initial 不是“恢复浏览器当前看到的样子”,而是“恢复这个属性在规范里的初始值”;inherit 也不是“像平时那样自然继承”,而是无论该属性本来是否可继承,都强制继承父值。

哪些属性通常会继承

大体上,和文本呈现强相关的属性会继承:

  • color
  • font-family
  • font-size
  • font-weight
  • line-height
  • text-align
  • letter-spacing
  • word-spacing
  • visibility
  • cursor

所以这种写法很常见:

article {
  color: #d4d2cb;
  line-height: 1.8;
}

子元素大多会自动沿用这些值,不需要你一层层重复写。

如果你发现字号和间距的相对关系很混乱,往往不是 inherit 没写,而是根字号、em / rem 体系本身没理顺。这个问题可以配合看 rem 与根字号指南

哪些属性通常不会继承

布局和盒模型属性通常不会继承:

  • width
  • height
  • margin
  • padding
  • border
  • display
  • position
  • top / right / bottom / left
  • background
  • overflow
  • transform
  • z-index

这是合理的。否则父元素一改 display: flexposition: relative,所有子元素都跟着继承,布局会非常难控制。

initial、inherit、unset 的真实差异

先看一个最容易理解的可继承属性:color

<div class="parent">
  <p class="a">initial</p>
  <p class="b">inherit</p>
  <p class="c">unset</p>
</div>
.parent {
  color: royalblue;
}

.a {
  color: initial;
}

.b {
  color: inherit;
}

.c {
  color: unset;
}

结果通常是:

  • .a 回到颜色初始值
  • .b 继承父元素的 royalblue
  • .c 因为 color 本来可继承,所以效果等同于 inherit

再看一个不会继承的属性:margin-left

.parent {
  margin-left: 40px;
}

.a {
  margin-left: initial;
}

.b {
  margin-left: inherit;
}

.c {
  margin-left: unset;
}

此时:

  • .a 回到初始值
  • .b 会强制拿到父级 40px
  • .c 因为 margin-left 默认不继承,所以效果更像 initial

这就是为什么 unset 常被理解成“按属性继承特性自动选边站”。

什么时候该用 inherit

inherit 适合你明确知道“这个子元素就该和父元素一致”的场景,比如 SVG 图标继承文本颜色:

.button {
  color: white;
}

.button svg {
  fill: currentColor;
}

或者你要让某个原本不继承的属性也继承:

.card {
  border-radius: 16px;
}

.card img {
  border-radius: inherit;
}

这里比重复写 16px 更稳,也避免以后父元素改半径时忘记同步。

什么时候该用 initial

当组件被包在很多上层样式里,而你想明确切断某个继承结果时,用 initial 更直接:

.editor {
  text-align: center;
}

.editor code {
  text-align: initial;
}

不过要注意,initial 是回到属性初始值,不一定等于“浏览器默认展示结果”。所以用它前最好知道该属性的初始行为。

什么时候该用 unset

unset 更像一个中性选择,适合做通用组件重置:

.button-reset {
  all: unset;
}

或者针对单个属性:

.field {
  color: unset;
  margin: unset;
}

它的优点是不需要你逐个判断属性是否可继承;缺点是团队里如果大家不清楚继承规则,读代码时会多一步脑内判断。

实战里怎么选

  • 想恢复属性自己的默认规则:initial
  • 想明确跟父级同步:inherit
  • 想让浏览器按继承规则自动决定:unset

如果你是在处理动画或覆盖层问题,不要把层级、图层和继承混在一起。z-index 失效通常和继承没关系,而是 Stacking Context 与 z-index 规则;动画卡顿更多是 重排与重绘

参考资料

9 分钟

css中的3d使用:深入理解 CSS Perspective 与 Transform-Style

和是 CSS 3D 变换中不可或缺的两个属性。赋予了场景深度,模拟了观察者的视觉体验;而则决定了子元素如何在 3D 空间中呈现。掌握这两个属性的用法,将为您的网页设计带来更丰富的视觉层次和更具吸引力的交互体验。现在,不妨动手尝试一下,释放您的创意,打造出令人惊叹的 3D 世界吧!

10 分钟

深入理解CSS对齐属性:align-items, align-self, justify-items, justify-self

属性作用对象方向适用布局覆盖关系容器垂直Flex/Grid被align-self覆盖align-self子项垂直Flex/Grid覆盖容器水平Grid被覆盖子项水平Grid覆盖记忆口诀想调垂直用align,想调水平用justify容器设置用-items,单个调整用-selfGri

2 分钟

重排与重绘:CSS 动画为什么会卡

把浏览器渲染中的样式计算、布局、重绘和合成拆开解释,说明哪些 CSS 属性更容易触发布局开销,以及为什么 transform 和 opacity 通常更适合做动画。

订阅 FreeMac

每周精选:免费 Mac 软件评测、可信来源更新、替代方案和少折腾指南。