粉丝福利:重新思考 CSS reset(样式重置)

大家好,这里是大家的林语冰。《前端猫猫教》每日 9 点半更新,坚持阅读,自律打卡,每天一次,进步一点

最近有粉丝明示想深度学习 CSS 样式重置,作为"宠粉狂魔",UP 主犹豫了 3 秒钟,决定加更一期关于 CSS reset 的文章。

CSS reset 是什么鬼物?

CSS reset 意思是 CSS 样式重置,又名 CSS 样式初始化或样式标准化。在前端工程化中,CSS reset 往往是样式架构的第一步,也是团队协作的一大步。

CSS reset 体现的是一种"破而后立"的编程意图,样式重置的福利包括但不限于:

  • 规避浏览器默认层叠样式的副作用
  • 抹平不同浏览器预设样式的不一致性
  • 自定义全局通用的预设样式
  • ......

由于"浏览器世界大战"余波未平且影响深远,不同的浏览器及其不同版本往往预设了神头鬼脸的默认样式,有的浏览器甚至已经当场退役,比如"万恶之源" IE 浏览器。

因此,现实开发中 CSS reset 既没有唯一解或"绝对真理",也不存在权威的官方标准,只有若干社区范例,大家可以按需参考、自由重置。

normalize.css

粉丝请注意,虽然没有任何赞助,但是今天 UP 主要推荐的是 normalize.css

我们瞄一眼使用 css reset 关键字在 GitHub 进行大数据搜索的结果,有图有真相,大数据告诉我们收藏最多、人气最高的就是 normalize.css

如你所见,normalize.css 的收藏量高达 51.6k,比 UP 主的女粉还多!如果我们拿 normalize.css 和同款工具库中的第二名相比,就会发现其收藏量是亚军的十几倍,这数据已经说明了 normalize.css 的含金量,所以我们可以放心使用。

normalize.css 意思是"CSS 样式标准化/规范化",官方自我介绍的措辞是 ------ "CSS 重置的现代化备胎方案"。

normalize.css 的产品定位包括但不限于:

  • 与其他 CSS 重置方案不同,它尽量保留有用的默认值
  • 标准化各种元素的样式
  • 纠正错误和常见的浏览器不一致问题
  • 通过微调提高可用性
  • 提供详细注释,解释源码的功能

浏览器支持包括但不限于:

  • Chrome
  • Edge
  • Firefox ESR+
  • Internet Explorer 10+
  • Safari 8+
  • Opera

供给决定需求,需求决定业务,CSS reset 的需求决定了源码实现应该保持精简,因为重置大量样式过犹不及,可能会搬起石头砸到自己的猫。

因此,大部分主流 CSS reset 库的源码都十分苗条,normalize.css 也一样,整体源码 + 注释不到 400 行,而且注释比源码还多,十分适合我们参考和学习。

normalize.css 可以通过 CDN 链接引用,现实开发中我们更常使用 npm/pnpm 作为第三方模块集成。

normalize.css 是与框架和样式方案无关的 CSS reset 库,所以既可以和 Vue/React 等前端框架"梦幻联动",也可以和 SCSS/Less "无缝衔接"。

结合 Vite 等人气爆棚的前端工具链,我们在前端工程化中需要做的唯一一件事就是,在诸如 main.js 之类的入口文件中导入 normalize.css

举个栗子,我们可以瞄一下人气爆棚的 Vue 模板库 vue-element-admin 的源码:

其他方案

粉丝都知道,UP 主最近在练习"UnoCSS 之父"孵化的 UnoCSS,UnoCSS 的生态系统就提供了一大坨 CSS reset 方案,任君选择。

举一反一,如果你不想使用 normalize.css,也可以选择你目前常用的 CSS 方案,再搜索相关的插件或模块,一般而言,人气比较高、维护比较稳定的 CSS 方案,包括但不限于 UnoCSS、Tailwind CSS 等,周边生态都会提供相应的同款 CSS reset 功能。

除此之外,我们可以瞄一下上文使用 css reset 关键字在 GitHub 进行大数据搜索的其他方案,收藏量只是一个重量级指标,但不是唯一指标。

源码启示录

我们说过,CSS reset 不存在"绝对真理",normalize.css 虽然人气最高,但我们必须独立思考,才能摆脱"权威效应"的思想钢印。

举个栗子,重置盒模型是一个常见的操作:

css 复制代码
/* 市面上常见写法 */
*,
*::before,
*::after {
  box-sizing: border-box;
}

如你所见,我们把所有元素和伪元素的盒模型都统一设置为 border-box,而不是默认的 content-box

虽然但是,如果我们瞄一眼 normalize.css 的源码,就会发现,它根本没有这么做。

CSS reset 是灵活的,除了业务需求,CSS 功能也日新月异,这也会影响重置样式的实现或重构。

举个栗子,我们来瞄一下 normalize.css'@unocss/reset/normalize.css' 的对照实验:

css 复制代码
/* normalize 的源码 */
hr {
  box-sizing: content-box;
}

/* uno 的源码 */
:where(hr) {
  box-sizing: content-box;
}

如你所见,上述代码中的 :where() 伪类就属于较新的写法。新的功能通常由于浏览器支持和兼容性而有所滞后,但有时对于样式重构利大于弊。

总而言之,CSS reset 的写法五花八门。当且仅当我们能够权衡自己的需求,才能选择最具性价比的方案。

高潮总结

CSS reset 是样式重置或标准化,这在前端工程化中,通常是样式架构的第一步。

CSS reset 没有唯一解,我们可以按需自定义,功能和写法随机应变。如果有人标榜自己的 CSS reset 是官方权威,那它大概率不是一个诚实的铲屎官。

我们可以选择集成人气最高的 normalize.css,也可以根据自己的 CSS 方案搜索周边生态。

本期话题是 ------ 你正在使用的 CSS reset 是社区版还是个人版?你想推荐那个 CSS reset 工具库呢?

欢迎在本文下方群聊自由言论,文明共享。谢谢大家的点赞,掰掰~

《前端猫猫教》每日 9 点半更新,坚持阅读,自律打卡,每天一次,进步一点

相关推荐
777VG4 小时前
PostgreSQL +martin将多张表输出成一个 MVT
前端·数据库·postgresql
mayaairi5 小时前
JS循环语句深度解析:嵌套for、while与do...while
开发语言·前端·javascript
To_OC5 小时前
啃完流式输出:从一个卡顿的 LLM 接口开始,我搞懂了数据流到底怎么 “流”
前端·javascript·llm
阳光是sunny5 小时前
LangGraph实战教程:defer延迟节点——让收尾工作自动排到最后
前端·人工智能·后端
kyriewen5 小时前
我用了三周Claude Code Skills——总结出5条铁律,第3条最反直觉
前端·ai编程·claude
阳光是sunny6 小时前
LangGraph实战教程:控制流详解
前端·人工智能·后端
格尔曼Noah6 小时前
Safari浏览器中如何只允许指定网站下载
前端·safari
用户059540174467 小时前
用了3年Redis,才发现我一直没搞懂缓存一致性测试
前端·css
swipe7 小时前
07|(前端转后全栈)为什么后端也要缓存?从前端缓存思维理解 Redis
前端·后端·全栈
IT小盘7 小时前
05-企业项目统一接入多个大模型-适配器模式实战
前端·人工智能·适配器模式