*重置不推荐因其强制遍历整个dom树,拖慢cssom构建,且无差别覆盖表单等元素导致可访问性问题;仅安全使用margin:0、padding:0、box-sizing:border-box三条声明,禁用其他属性。

为什么*重置在现代项目里基本不推荐
它确实能一次性匹配所有元素,但代价是浏览器必须遍历整个 DOM 树来应用规则——尤其当 DOM 节点超 2000 个时,CSSOM 构建延迟肉眼可感。更麻烦的是,*会无差别覆盖 input、textarea、button、fieldset 等有强默认样式的元素,导致文字贴边、表单控件失焦、列表标记消失等可访问性问题。
*只该配哪三条声明?其他一律禁用
真正安全且有意义的只有:margin: 0、padding: 0、box-sizing: border-box。这三项解决的是跨浏览器默认值差异(比如 Chrome 和 Safari 对 h1 的 margin 不同),且不会破坏语义或交互。
-
禁用
font-family、color、background:它们会污染继承链,让button失去系统原生灰度,select变成不可读的纯黑底白字 -
别碰伪元素:
*::before, *::after { box-sizing: border-box }是冗余的,现代浏览器中伪元素默认不继承box-sizing,还强制重绘所有伪节点 -
绝对不要加
!important:它会让后续调试类(如.debug-border)完全失效,且掩盖真实样式冲突
替代*的更优方案:局部作用域 + 白名单回退
把重置逻辑收束到具体容器内,再对关键控件显式“放行”,比全局暴力重置靠谱得多。
- 用作用域 class 替代顶层
*:.form-reset *比*快一个数量级,因为浏览器只需遍历.form-reset子树 - 对表单控件加白名单:
input, select, textarea, button { all: revert; }——revert会退回浏览器默认样式,而不是清空后留空白 - 需要真正归零时,优先用
all: unset而非*:.card > * { all: unset; }不影响伪元素,也不波及 Web Component 内部
哪些场景下*反而可以放心用
它不是洪水猛兽,只是不能放在生产 CSS 的顶层。两个真实可用的场合:
-
DevTools 临时调试:
* { outline: 1px solid red !important; }查布局边界很高效,但上线前必须删掉——否则会覆盖input:focus的原生焦点环 -
Shadow DOM 隔离环境:
:host * { box-sizing: border-box; }是安全的,因为作用域天然受限,且不穿透到宿主文档
真正容易被忽略的点是:哪怕你写了 *,只要没放在 CSS 文件最顶部,它的 margin 和 padding 就大概率被后面更高特异性的规则覆盖——顺序比写法更重要。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











