all: unset在chrome/firefox/safari中将可继承属性(如color、font-family)设为inherit,非继承属性(如margin、border、display、outline、cursor)设为initial,但不重置ua样式表定义的默认值,故button边框、input焦点轮廓等仍存在;ie及旧版android webview完全不支持该属性。

all: unset 在 Chrome/Firefox/Safari 中到底重置了哪些属性?
它不重置浏览器 UA 样式表定义的默认值,只把当前元素上所有 CSS 属性按继承性处理:color、font-family 变 inherit,margin、border、display 变 initial。但 UA 规则如 button { border: 2px outset buttonface; } 权重更高,所以按钮边框依然存在——all: unset 没“覆盖”,只是没赢过 UA 选择器。
真正被重置的是你写的样式(比如父级传来的 color),不是浏览器自带的交互支撑项。这意味着:
-
outline被设为initial(即0),键盘聚焦轮廓消失 -
cursor变auto,按钮失去手型光标 -
user-select虽仍为text,但因无视觉反馈,用户根本不会尝试选中
为什么在 IE 和旧版 Android WebView 中 all: unset 完全不生效?
IE(含 IE11)根本不识别 all 属性和 unset 关键字,整条 CSS 规则被静默丢弃,连 @supports (all: unset) 都无法检测——因为 IE 连 @supports 语法都不支持。
安卓 WebView(Android 10 及更早)同样跳过解析,不是“部分失效”,是彻底无响应。想兼容,只能手动列出关键属性:
-
margin: 0和padding: 0(不能用margin: initial,IE 不认) -
border: none(border: initial在 IE 中无效) -
font-size: 100%、line-height: normal、color: #000 -
text-decoration: none(针对a、ins)、list-style: none(针对ul/ol)
all: unset 和 all: revert 的覆盖行为差异在哪?
all: revert 才是真正能“恢复 UA 默认”的方案:它主动查找并应用浏览器 UA 样式表中对该元素定义的值。加了 all: revert 的 <button></button> 会重新拥有默认边框、手型光标、聚焦 outline;<input> 也会恢复 padding、border-radius 和 focus ring。
但注意:all: revert 不继承父级样式——如果父级设了 color: red,all: revert 下的 <button></button> 文字仍是 UA 默认深灰色,不是红色。
支持情况:Chrome 93+、Firefox 95+、Safari 14.1+ 均良好;但部分安卓 WebView(尤其 Android 10 及更早)仍不支持,需降级 fallback。
如何判断某个元素加了 all: unset 后是否真的“干净”?
不能只看代码写了什么,必须实测渲染结果。重点检查三类异常:
- 是否塌缩:
display变initial(即inline),块级容器如<div> 或 <code><section></section>会挤成一行 - 是否失能:
outline、cursor、border全归零,键盘焦点不可见、鼠标悬停无反馈 - 是否错字:
font-family是可继承属性,unset等价于inherit,若父级未设中文字体栈,中文可能模糊或 fallback 到 serif
最易被忽略的是继承链的实际路径——它可能跨多层、含 currentColor 或透明色,最终效果必须在真实 DOM 中 inspect 查看 computed styles,不能靠推测。











