项目里加了一行 @import 'reset',页面上的按钮全变成没有边框的灰块,h1 和正文一样粗,列表前面的圆点也没了。同事说这是正常现象,reset 就是干这个的。问题在于它干得有点多。
reset 和 normalize 不是一回事
reset 的思路是把浏览器默认样式全部抹平,从零开始写;normalize 保留有用的默认值,只修各浏览器不一致的地方。前者干净,但把该留的也去掉了;后者麻烦一点,表单控件和标题字号却是正常的。选哪个,看项目要不要自己定义全部样式。
一份能用的 SCSS 骨架
不用抄网上一整套几百行的 reset,下面几行覆盖了绝大多数麻烦:
*, *::before, *::after { box-sizing: border-box; } body, h1, h2, h3, p, ul, ol, figure { margin: 0; } ul, ol { padding: 0; list-style: none; } img, svg { display: block; max-width: 100%; }写成 SCSS 的好处是能拆成变量。列表样式要不要清、标题字号保不保留,用一个布尔变量控制,几个项目引同一份文件,改一行就换风格。
引入方式也有讲究。@use 替代 @import 之后,变量和 mixin 的作用域更清楚,不会重复加载。老项目继续用 @import 也能跑,只是每次编译多读一遍文件,文件大了编译时间会明显变长。
几处常被改坏的地方
outline 被写成 none,键盘 Tab 走一遍完全看不到焦点,这是无障碍问题,不是审美问题。button 的 background 和 border 一起清掉,用户分不清哪里能点。table 少了默认的 border-collapse,表格线会变成双线。这几条要么别写,要么在组件层补回来。
还有字号。把 h1 到 h6 的 font-size 全设成 100%,语义还在,视觉层级没了,后面每个标题都得手写大小。真要统一,就在同一份文件里把标题字号变量定义好,一处改全局变。
什么时候干脆不写
用 Tailwind 这类带 preflight 的框架,基础重置它已经做了,再叠一层 reset 只会互相打架。小项目里写十行 box-sizing 加 margin 归零就够。判断标准很朴素:这一行样式去掉之后,浏览器默认表现是不是真的碍事。