接手遗留项目
程序员接手一个三年前的老项目,打开页面发现按钮和输入框在不同浏览器里歪七扭八。原团队用的是古老 reset 方案,把 h1 到 h6 的字体大小全抹平了。在工具里对比 Normalize.css 和 Sanitize.css 的差异,发现 Normalize 保留了合理的标题层级,而 Sanitize 额外修正了表单元素的 bug。最终选择 Sanitize.css 直接引用,省去逐行排查旧 reset 文件的四小时。
手写 CSS Reset 时,最怕的不是代码多,是不同浏览器对 `html`、`body` 默认内外边距的解读不一致,导致页面在 Chrome 和 Safari 上直接错位。这个页面把 Eric Meyer、Normalize.css、Sanitize.css 等主流方案的源码和覆盖率差异列在一起,点一下就能复制整段代码。所有内容静态输出,不请求任何后端,复制即用。
程序员接手一个三年前的老项目,打开页面发现按钮和输入框在不同浏览器里歪七扭八。原团队用的是古老 reset 方案,把 h1 到 h6 的字体大小全抹平了。在工具里对比 Normalize.css 和 Sanitize.css 的差异,发现 Normalize 保留了合理的标题层级,而 Sanitize 额外修正了表单元素的 bug。最终选择 Sanitize.css 直接引用,省去逐行排查旧 reset 文件的四小时。
前端在写一个微信内的 H5 活动页,发现 iOS 和 Android 上 button 的默认内边距差了 6px。翻出工具里的 Meyer Reset 和 Normalize 对比:前者把所有内边距归零,后者保留了合理的默认值。考虑到活动页有大量点击按钮,选择 Normalize 并额外用一行 `button { padding: 0 }` 覆盖,iOS 和 Android 的按钮视觉终于对齐,测试时没再被 QA 退回。
团队五人各自写页面,有人用 * { margin: 0 } 暴力清除,有人用 Normalize.css v8,导致不同模块的列表缩进和表单字号不一致。在工具里把四种主流 reset 方案的关键差异列成表格:Meyer Reset 清空所有列表样式,Normalize 保留有序列表编号但去掉无序列表圆点,Sanitize 额外处理了 `details` 和 `summary` 的显示。打印出对比表贴在工位旁,新人入职直接按规范引用,不再出现因 reset 不一致导致的样式冲突。
产品要求兼容到 IE11 和 UC 浏览器,但 Normalize.css 的最新版已放弃对 IE 的支持。在工具里筛选出支持旧浏览器的方案:发现 Reboot(Bootstrap 的 reset)在 IE11 上表现稳定,而 sanitize.css 的旧版 v11 仍保留 IE 兼容分支。最终选择 sanitize.css v11,并复制工具提供的 CDN 链接直接引入,避免了手动翻 GitHub release 找旧版本的半小时。
在做一个 Vue 组件库,组件内部的样式需要不受宿主页面 reset 影响。用工具对比发现:Normalize.css 会修改 `html` 和 `body` 的字体大小,而 CSS Remedy(Reboot 的轻量版)只调整了 `box-sizing` 和边距,不碰字体继承。组件库选择 CSS Remedy 作为基础,再通过 scoped 样式覆盖,组件在任意宿主页面下都能保持统一间距和盒模型,不再因外部 reset 导致布局错乱。
| 输入 | 输出 | 说明 |
|---|---|---|
| 选择「Normalize.css」并点击「复制代码」 | /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ html { line-height: 1.15; -webkit-text-size-adjust: 100%; } body { margin: 0; } main { display: block; } h1 { font-size: 2em; margin: 0.67em 0; } /* ...(完整代码约 400 行)*/ | 常规:Normalize.css 是最主流的选择,输出为完整 CSS 文件,用户可直接粘贴到项目入口。 |
| 选择「CSS Reset(Eric Meyer)」并点击「复制代码」 | /* http://meyerweb.com/eric/tools/css/reset/ v2.0 | 20110126 License: none (public domain) */ html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { margin: 0; padding: 0; border: 0; font-size: 100%; font: inherit; vertical-align: baseline; } /* ...(完整代码约 30 行)*/ | 常规:Eric Meyer 的 Reset 是经典方案,输出较短但会清除所有默认样式,适合需要完全从头构建样式的项目。 |
| 选择「Sanitize.css」并点击「复制代码」 | /*! sanitize.css v13.0.0 | CC0-1.0 License | github.com/csstools/sanitize.css */ *, *::before, *::after { box-sizing: border-box; } html { -webkit-text-size-adjust: 100%; -moz-text-size-adjust: 100%; text-size-adjust: 100%; } body { margin: 0; } /* ...(完整代码约 200 行)*/ | 常规:Sanitize.css 是较新的选择,保留有用默认值(如 h1 字号)同时修复浏览器不一致,输出包含 box-sizing 设置。 |
| 选择「Normalize.css」并点击「复制 CDN 链接」 | <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/normalize.css@8.0.1/normalize.css"> | 边界:工具提供 CDN 引用方式,输出为 HTML link 标签,适合快速引入到页面 head 中。 |
| 选择「CSS Reset(Eric Meyer)」并点击「复制 CDN 链接」 | <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/meyerweb/reset.css@2.0/reset.css"> | 边界:Eric Meyer Reset 的 CDN 链接使用 GitHub raw 路径,需注意某些 CDN 可能不稳定。 |
| 选择「Reboot(Bootstrap)」并点击「复制代码」 | // Reboot v5.3.0 | MIT License | github.com/twbs/bootstrap/blob/main/scss/_reboot.scss *, *::before, *::after { box-sizing: border-box; } @media (prefers-reduced-motion: no-preference) { :root { scroll-behavior: smooth; } } body { margin: 0; font-family: system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', 'Noto Sans', 'Liberation Sans', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; font-size: 1rem; font-weight: 400; line-height: 1.5; color: #212529; background-color: #fff; -webkit-text-size-adjust: 100%; -webkit-tap-highlight-color: transparent; } /* ...(完整代码约 100 行)*/ | 易错:Reboot 是 Bootstrap 的 reset 方案,输出包含字体栈和颜色变量,用户如果只想要纯 reset 可能会误选此库。 |
| 选择「Normalize.css」并点击「复制代码」(但浏览器网络离线) | (工具页面提示:无法获取代码,请检查网络连接后重试) | 易错:工具依赖 CDN 获取代码,离线时无法输出内容,页面会给出错误提示而非空白。 |
1.把 Normalize 当 Reset 用,以为会清空所有默认样式
引入 Normalize.css 后,发现 h1 还有 margin,以为没生效Normalize.css 保留有用的默认样式(如 h1 的 margin),只修复跨浏览器不一致;如果需彻底清空,应选 Reset CSS 或两者结合Normalize 的设计哲学是「保留有用默认值,统一差异」,不是「清零」。Reset 则暴力移除所有默认样式。选错会导致预期偏差。
2.多个 Reset 库同时引入,样式互相覆盖
<link rel="stylesheet" href="reset.css"><link rel="stylesheet" href="normalize.css">只引入一个库,或明确指定加载顺序并理解覆盖结果Reset 和 Normalize 都会重置/统一基础样式,同时引入会导致后加载的覆盖前一个,产生不可预测的样式冲突,且增加无意义 HTTP 请求。
3.直接复制 CDN 链接但未检查协议,导致 HTTPS 页面加载 HTTP 资源被浏览器拦截
<link rel="stylesheet" href="http://cdn.jsdelivr.net/npm/reset-css@5.0.2/reset.min.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/reset-css@5.0.2/reset.min.css">现代浏览器在 HTTPS 页面中会阻止加载 HTTP 资源(混合内容),导致 CSS 不生效。始终使用 HTTPS 或协议相对链接(//cdn...)。
4.忘记把 Reset 放在自定义样式之前
<link rel="stylesheet" href="custom.css"><link rel="stylesheet" href="reset.css"><link rel="stylesheet" href="reset.css"><link rel="stylesheet" href="custom.css">CSS 层叠规则:后加载的样式优先级更高。若 Reset 在自定义样式之后,会覆盖已写好的样式,导致布局崩坏。
5.以为 Reset 能解决所有浏览器兼容问题,不再做任何测试
引入 Reset 后,在 IE11 和 Chrome 中看到按钮样式不同,认为是 Reset 的 bugReset 只处理元素默认样式差异,不处理布局、字体渲染、CSS 特性支持等差异;仍需在目标浏览器中测试Reset 覆盖的是浏览器内置 user-agent stylesheet 的差异,但不同浏览器对 CSS 属性(如 flex、grid)的支持程度不同,Reset 无法修复这些。
6.使用过时的 Reset 库,未适配现代 HTML5 元素
使用 2010 年的 Eric Meyer Reset,未包含 <section> <article> <nav> 等元素使用最新版 Reset CSS(如 2.0)或 Normalize.css(v8+),它们已覆盖 HTML5 语义元素旧版 Reset 未针对 HTML5 新增元素设置 display: block 等基础样式,导致这些元素在旧浏览器中显示为内联,布局异常。
7.在 Reset 中误用 !important,导致后续样式难以覆盖
reset.css 里写 * { margin: 0 !important; padding: 0 !important; }使用普通选择器(如 body, h1, p { margin: 0; padding: 0; }),避免 !important!important 会破坏 CSS 层叠规则,后续任何样式(包括内联样式)都无法覆盖,除非也加 !important,导致维护噩梦。
reset = normalize + (opinionated - normalize) × weight
reset最终生成的 CSS 重置代码normalizeNormalize.css 的基线样式opinionated选定的个性化 reset 库(如 Eric Meyer)weight用户选择的个性化程度(0~1)用户选择 Eric Meyer 作为 opinionated 库,weight 设为 0.6。normalize 基线为 100 行 CSS,Eric Meyer 为 80 行。最终 reset = 100 + (80 - 100) × 0.6 = 100 - 12 = 88 行 CSS 代码,混合了 Normalize 的兼容性与 Eric Meyer 的激进重置。
粗暴的全局重置会干掉所有元素的默认边距,但也会移除 `<ul>` 的项目符号、`<h1>` 的加粗字号等浏览器自带的合理样式。本页对比的 reset 库(如 Normalize.css)会保留这些有用的默认样式,只修复跨浏览器不一致的地方。如果你只是做个简单落地页,`* { margin:0; padding:0 }` 够用;但做多页面产品或需要保留语义样式的项目,用 Normalize.css 能少写很多后补样式。
大概率是缺失 viewport meta 标签。reset 库只处理元素默认样式差异,不控制移动端视口缩放。在 `<head>` 里加上 `<meta name="viewport" content="width=device-width, initial-scale=1.0">` 后再引入 reset 代码,移动端的盒模型和字号才能按预期渲染。本工具生成的代码片段不含该 meta,需手动补上。
关键看项目类型。Normalize.css 保留浏览器默认语义样式(如 `h1` 字号、`strong` 加粗),只修复跨浏览器差异,适合从零搭建的 UI 组件库或需要保留 HTML 语义的项目。Reset.css 会清除所有浏览器默认样式,让你从完全空白的状态重写,适合设计稿极精细或需要完全自定义视觉的页面。本工具对比表里列出了两者对 `ol`、`table`、`button` 等 8 个常见元素的具体处理差异,可对照选。
部分 reset 库(如 Eric Meyer's Reset)会移除按钮的默认边框和背景渐变,让按钮变成纯色块,看起来像过时的设计。这其实是重置的预期行为——它把按钮降级为无样式的 `input`,方便你从头写统一的按钮样式。如果不希望按钮被重置,可以在引入 reset 后单独给 `button` 写 `border: inherit; background: ButtonFace;` 恢复系统默认外观。
可以,但建议做两步验证。一是确认你选的库版本(本工具默认使用各库最新的稳定版,页面顶部标注了版本号)。二是检查是否与你项目中已有的第三方 UI 框架(如 Bootstrap、Tailwind)冲突——这些框架自带 normalize,重复引入可能导致覆盖顺序混乱。稳妥做法:只保留一个 reset/normalize 来源,用本工具生成代码后,在浏览器开发者工具里检查 `body` 的 `line-height` 是否为预期值。
这是为了解决图片底部 3-5px 的空白间隙问题。默认 `img` 是 `inline` 元素,会受 `line-height` 影响产生额外空隙,改成 `block` 后间隙消失。但不是所有 reset 库都这么做——Normalize.css 保持 `inline`,而部分现代 reset(如 sanitize.css)会改成 `block`。本工具在对比表里标注了每个库对 `img` 的处理方式,如果布局里图片需要并排显示,选保持 `inline` 的库更方便。
reset 库不处理滚动条样式,这是浏览器自身的渲染差异。Chrome 默认用系统滚动条(较细),Safari 在 iOS 上隐藏滚动条、macOS 上显示较宽。如果想统一,需要额外写 CSS 自定义滚动条:`::-webkit-scrollbar { width: 8px; }`(仅 WebKit 内核支持)。本工具不生成滚动条样式代码,但可以在工具页面的「高级设置」区域手动粘贴这段 CSS。
本工具目前提供的是完整库的对比和一键复制,不支持逐条勾选规则。如果你只需要部分重置(比如只清除 `margin` 但保留 `list-style`),建议复制完整代码后手动删除不需要的规则。或者使用 PostCSS 插件(如 postcss-normalize)配合项目构建工具,它允许通过 `@import-normalize` 按需引入 Normalize.css 的特定模块。
隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。