← How does CSS work · 样式从哪来 / Normalize vs Reset 待审核 4 / 6
level 3 & 4 · normalize / reset

Normalize vs Reset

UA 样式解决了「有默认」,但带来新麻烦:不同浏览器的 UA 样式略有出入(h1 的 margin、button 的字体、表单控件外观各家不一),而且这些默认有时也不合你的设计。于是有了你主动引入的 Level 3 / 4——它们都是普通 author 样式表,只是约定俗成跑在最前面:

Normalize(修平):保留有用的默认,只把跨浏览器的不一致和明显 bug 抹平——h1 依然大而粗、列表依然有符号。代表作 normalize.css

Reset(推平):清零几乎所有默认——margin/padding 归零、标题不再加粗放大、列表去掉符号,把一切拉回同一条起跑线,样式完全由你重建。代表作 Eric Meyer 的 reset.css

对照 User-Agent Stylesheet 页:那里「剥离 UA」用的是 all: initial,连 display:block 都没了,结构整体退化为 inline。而这里的 Reset 只清外观(margin/字号/符号),保留 UA 给的 display:block——块级结构仍在,只是外观默认值被清除。两者程度不同。

1 · 现代实践:小而精的 reset

今天很少全量引 Meyer reset(把 margin 全清零反而要到处加回来)。更常见的是一份几条规则的现代 reset,例如 Andy Bell 的 Modern CSS Reset,只挑真正值得改的:

*, *::before, *::after { box-sizing: border-box; }   /* padding 不再撑大盒子 */
* { margin: 0; }                                      /* 只清 margin, 留 padding */
body { min-height: 100vh; line-height: 1.5; }
img, picture { max-width: 100%; display: block; }
input, button, textarea, select { font: inherit; }   /* 表单控件继承字体 */

思路是「少即是多」:保留无害的默认,只清掉真正造成问题的(撑大盒子的 content-box、到处冒出的 margin、表单控件不继承字体)。Normalize 与 Reset 不是二选一的教条,而是一段你完全掌控的 author 样式。

延伸阅读:Eric Meyer's CSS Reset——经典「推平式」reset 的原文;再对照 normalize.css(修平差异)与 A (more) Modern CSS Reset(小而精),正好是本页三种取向的源头。