inherit从父元素向上查找显式声明值,非复制当前渲染值;initial按规范取初始值,不查父级或UA样式;unset依属性是否可继承分别等价于inherit或initial。

inherit 是“往上找值”,不是“复制父元素当前样式”
很多人以为 inherit 就是把父元素此刻渲染出的计算值原样拿过来,其实它走的是 CSS 继承链:从父元素开始,逐层向上查找第一个**显式声明了该属性**的祖先(包括 html),取它的声明值;如果整条链都没设,才 fallback 到浏览器 UA 样式;还找不到,才用 initial。
典型反例:div { display: inherit } 不会继承父 div 的 display: block,因为 display 不可继承,这条声明实际等价于 display: initial(即 inline)。
常见误用场景:
- 给
input写font-size: inherit,本意是让它匹配父容器字体大小——但若父容器没显式设font-size,它会一路找到body或html,甚至 fallback 到 UA 默认值 - 在 SVG 中对
position用inherit:SVG 元素不支持position,该声明无效,最终回退为static
initial 只认 W3C 规范,和浏览器默认表现可能不一致
initial 完全不查父级、不看 UA 样式,只按 CSS 规范写的“初始值”来设。这个值和你在浏览器里看到的默认效果经常对不上。
立即学习“前端免费学习笔记(深入)”;
例如:
-
margin: initial→ 值为0,但浏览器给p设的 UA margin 是1em,所以它不会恢复成你熟悉的段落间距 -
color: initial→ 规范值是canvas-text(通常渲染为黑色),哪怕父元素是color: green,子元素也一定是黑(或暗色模式下的浅灰) -
border: initial→ 等价于border: none,边框直接消失,不是“还原浏览器默认边框”
关键陷阱:initial 对 font-family 不会回退到系统字体,而是规范定义的泛型族(如 serif);对 background-color 是 transparent,不是白色。
unset 是“智能判断”,但行为完全由属性是否可继承决定
unset 不是折中方案,它是严格按规范执行的:可继承属性(如 color、font-family)就走 inherit,不可继承属性(如 margin、border、position)就走 initial。
这意味着:
-
color: unset≡color: inherit(因为color可继承) -
border: unset≡border: initial(因为border不可继承,初始值为none) -
position: unset≡position: initial≡static(position明确标记为Inherited: no)
MDN 上每个属性页都有 “Inherited: yes/no” 标记,这是你判断 unset 行为的唯一依据——别猜,去查。
all: initial 和 all: unset 的副作用远超想象
all 是个全局开关,它会一次性重置所有 CSS 属性,包括 direction、unicode-bidi、contain、cursor 这些冷门但关键的属性。
滥用后果明显:
-
all: initial→display变inline、box-sizing变content-box、cursor变auto,按钮点击反馈直接消失 -
all: unset→ 可继承属性仍继承,但touch-action、user-select等不可继承属性被清空,导致移动端手势失效、文字无法选中
真正需要“完全重置”的场景极少。多数时候,只应显式重置视觉相关属性:margin、padding、border、background、color、font 等。
最常被忽略的一点:这些关键字在 IE 全系列中都不支持,旧项目中必须加 fallback 或彻底规避。


















