normalize.css本质是温和校准浏览器默认样式差异,而非清零;它统一h1~h6间距行高、表单box-sizing等不一致渲染,但不处理伪元素和resize,且不设border-box,需手动补充。

不需要“重置”,你需要的是校准——normalize.css解决的不是“样式太多”,而是“同一标签在 Chrome、Firefox、Safari 里渲染结果不一致”这个真实存在的开发阻塞点。
为什么h1在 Safari 里比 Chrome 高 3px
这不是你写的 CSS 问题,是浏览器用户代理样式表(UA Stylesheet)各自定义了不同的 margin-top、line-height 和 font-size。Chrome 给 h1 设的是 margin: 0.67em 0;,Firefox 是 0.83em,Safari 还可能额外加了 line-height: 1.2 补偿。
这些差异在 flex 或 grid 布局中会直接导致卡片高度不齐、文字基线错位、对齐线偏移等线上可见问题。
-
normalize.css显式统一了h1~h6的 margin 比例和行高基准,且基于现代排版习惯微调过 - 它不改语义:
h1依然加粗、依然比p大,只是“大多少”变得可预测 - 别用
* { margin: 0; padding: 0; }试图覆盖——它连button的font-family继承都拦不住
为什么textarea在 iOS 上拖不动、input[type="number"]在 Safari 里没箭头
表单控件是跨浏览器兼容性翻车重灾区:textarea 的 resize 行为、select 下拉图标位置、checkbox 的 box-sizing 默认值,在各浏览器 UA 样式里全都不一样。
在 Linux 上通过 Chrome 挂载/VNC 自动发布小红书长笔记。Agent 撰写标题和正文后执行 xhs_publish.sh --publish --submit,触发小红书发布。
-
normalize.css统一了所有表单元素的box-sizing、字体继承、vertical-align和 margin 基线 - 但它**不处理伪元素**:iOS
select的箭头、Chromeinput[type="number"]的 spinner,仍需你手动加-webkit-appearance: none; - 它也不管
resize:Firefox 默认允许拉伸,Chrome/Safari 计算逻辑不同 → 建议显式设resize: vertical;
为什么把normalize.css放在main.css后面就失效了
它的修复靠的是层叠顺序和选择器权重。比如它设了 html { font-size: 100%; } 和 button { font-family: inherit; },但如果你的 main.css 里有 body { font-size: 16px; } 且加载在后,那 html 的基础校准就被覆盖了。
- 必须是
中第一个<link>,或构建工具里 SCSS 入口文件的第一行@import - 绝对不要复制内容粘贴到
main.css底部——它失去前置声明的意义 - CDN 链接写在
最底部、被内联<style></style>覆盖,也会导致 FOUC(闪一下)
为什么不能和reset.css混用
两者哲学相反:reset.css 是“清零”,normalize.css 是“校准”。混用等于让一个文件说“h1 应该是 2em”,另一个说“h1 字号归零”,最后谁赢取决于加载顺序和选择器权重,结果不可控。
- 典型冲突:
reset.css把blockquote的 margin 清零,normalize.css显式设为margin: 1em 40px; - 更隐蔽的问题:某些 UI 库(如 Ant Design)悄悄自带 reset 逻辑,构建产物里搜出两套
line-height值就是信号 - 判断依据很简单:项目里只允许存在一套“基础样式校准”逻辑
最常被忽略的一点是:normalize.css 不设 box-sizing: border-box。你写 width: 100% 的卡片,加了 padding 后照样撑出父容器——这得你自己紧接在它后面加 * { box-sizing: border-box; }。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










