all: unset 并非清空样式,而是将可继承属性设为 inherit、不可继承属性设为 initial,需手动补 display、字体、outline、cursor 等基础样式以防元素“塌陷”或“失能”。

all: unset 不是“清空样式”,而是按继承性切换:可继承属性(如 color、font-family)变 inherit,不可继承属性(如 margin、border、display)变 initial。它不碰浏览器 UA 默认样式(比如 <button></button> 的边框、<h1></h1> 的字号),也不能重置 direction 和 unicode-bidi。直接加就“失效”,必须补基础样式。
为什么加了 all: unset 元素突然“看不见”或“不能用了”
因为 all: unset 把很多关键非继承属性设为 initial,而这些值往往不符合视觉或交互预期:
-
border的initial是none→ 按钮边框消失,<input>变成一条线 -
outline的initial是0→ 键盘聚焦轮廓不可见,无障碍访问直接中断 -
display的initial是inline→ 原本是block的<div> 或 <code><section></section>塌缩成一行 -
cursor的initial是auto→ 按钮失去手型光标,用户无法感知可点击 -
font-family是可继承属性,unset等价于inherit→ 若父级没设字体,最终 fallback 到 UA 默认(可能不含中文字体栈),中文渲染模糊或错位 -
<del></del>、<mark></mark>、<small></small>这类纯语义标签:本就不该带强样式,加all: unset后再设display: inline+color: #666就很干净 - 自定义组件的内部 wrapper(非根节点):比如一个卡片组件里包裹文本的
<div class="content">,可以安全加 <code>all: unset,但别直接套在<input>或<select></select>上 - 需要“干净起点”的 SVG 容器(非内联 SVG 元素):避免继承外部字体/颜色干扰图标渲染
- 绝对不能用的地方:
* { all: unset; }、body、html、fieldset、legend、details—— 会破坏滚动条、焦点逻辑、屏幕阅读器语义 - 先定
display:display: block(对块级容器)、display: inline-block(需宽高控制)、display: flex(现代布局常用) - 补基础盒模型:
margin: 0、padding: 0、border: none(别依赖initial,它不可控) - 重设字体链:
font-family: system-ui, -apple-system, sans-serif(确保中文字体 fallback 正常) - 恢复可访问性基础:
outline: 2px solid transparent+outline-offset: 2px(聚焦时可见),cursor: pointer(对可点击元素) - 慎用
line-height:initial是normal(约 1.2),但不同字体下实际行高差异大,建议显式设line-height: 1.5或1.4
all: unset 适合用在哪类元素上
它只适合语义纯、样式弱、无需原生交互的标签,且必须手动补基础显示属性:
怎么补才不会让元素“塌掉”或“失能”
加 all: unset 后,必须显式声明以下几项,否则多数元素会异常:
真正“重置”不是靠一个声明完成的。all: unset 是个起点,不是终点;它省去逐个写 margin: 0、padding: 0 的功夫,但代价是必须立刻补上 display、字体、焦点、可访问性这四块地基——漏掉任何一块,元素就会在视觉或功能上出问题。











