all: unset 将可继承属性设为 inherit、不可继承属性设为 initial,故 color 等仍继承父级,margin 等归零;需配合 display、box-sizing 及显式设置关键继承属性才能真正隔离样式。

all: unset 会清除哪些样式?
all: unset 并不是“清空所有 CSS 属性”,而是把当前元素上**所有可继承属性重置为 inherit,所有不可继承属性重置为 initial**。这意味着它不会抹掉父级传下来的字体、颜色、行高这些继承值(因为它们被设为 inherit),但会把 margin、padding、border 这类非继承属性强制归零(因为 initial 对它们就是 0 或 none)。
常见误解是以为它能“完全隔离组件样式”,结果发现文字颜色、字体大小还在变——这就是因为 color、font-family 是可继承属性,all: unset 让它们继续从父级继承,没真正切断。
想彻底隔离组件样式,得配合 display: block 和独立上下文
仅靠 all: unset 不足以让组件“自带样式体系”。你通常还需要:
-
display: block(或display: inline-block等)——避免 inline 元素受周围文本流影响 -
box-sizing: border-box——防止重置后box-sizing变成initial(即content-box)引发尺寸错乱 - 显式设置
color、font-family、line-height等关键继承属性为具体值,否则它们仍随父级变 - 如果组件内含子元素,且你也想重置它们,
all: unset必须作用在容器上,并用* { all: unset; }或逐层应用(但注意性能和选择器权重)
all: unset 在实际组件封装中的典型写法
比如封装一个按钮组件,希望它不沾任何外部样式:
.my-button {
all: unset;
box-sizing: border-box;
display: inline-flex;
align-items: center;
justify-content: center;
color: #333;
font-family: system-ui, sans-serif;
font-size: 1rem;
line-height: 1.5;
background-color: #fff;
border: 1px solid #ccc;
padding: 0.5rem 1rem;
}
注意:这里手动补了 color、font-family 等,否则即使写了 all: unset,按钮文字还是会继承外层的深蓝或斜体。
另外,all: unset 会影响伪元素(如 ::before),但不会自动重置它们——需要单独加规则,例如:.my-button::before { all: unset; }
兼容性和容易踩的坑
all 属性在 IE 中完全不支持,Edge 16+、Chrome 37+、Firefox 27+ 支持。如果你的项目需兼容旧版 Edge 或 iOS Safari all: unset 会直接被忽略,导致样式失控。
另一个坑是:它会重置 direction、unicode-bidi、cursor 等冷门但关键的属性。比如按钮失去手型光标(cursor 被设为 initial 即 auto),就得手动加 cursor: pointer。
还有,all: unset 无法重置通过 @supports 或 JS 动态注入的样式,也不影响 !important 声明(除非你自己也加 !important 覆盖)。
真正要“重置一切”,往往得组合 all: unset + 显式声明核心属性 + 容器级隔离,而不是指望一行代码搞定。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











