前几天我在 Nicholas Cerminara 的一篇文章 中看到(访问该链接时请注意,看起来他们有一些 跟踪脚本运行失控),Bootstrap 4 集成了一种新的 CSS 重置,他们称之为 Reboot
Reboot,一个包含单个文件中特定元素 CSS 更改的集合,启动 Bootstrap 以提供一个优雅、一致和简单的基础来构建。
如果您是 CSS 开发的新手,那么 CSS 重置的整个理念就是解决不同浏览器之间的样式不一致问题。例如,我刚刚在一个页面上放置了一个 <button>
,没有任何其他样式。Chrome 应用了 padding: 2px 6px 3px;
- Firefox 应用了 padding: 0 8px;
。CSS 重置将为该元素应用新的 padding
,以便所有浏览器在应用的内容上保持一致。有很多类似的例子。
顺便说一下历史……
2007 年,Jeff Starr 汇总了 许多不同的 CSS 重置。最早的一个是 Tantek Çelik 的 undohtml.css(这是指向源代码的直接链接)。我们可以看到它背后的目的是去除默认样式。
/* undohtml.css */
/* (CC) 2004 Tantek Celik. Some Rights Reserved. */
/* http://creativecommons.org/licenses/by/2.0 */
/* This style sheet is licensed under a Creative Commons License. */
/* Purpose: undo some of the default styling of common (X)HTML browsers */
迄今为止,最流行的重置是在不久之后出现的:Meyer 重置。它包含的内容与 Tantek 的不同(它甚至更新了一些 HTML5 元素),但精神相同:删除默认样式。您可能会认出这段著名的代码块,它会出现在您 DevTools 样式面板的各个地方
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;
}
从像这样的重置开始(在您的生产样式表顶部),您之后编写的样式将建立在稳定的基础之上。
几年后,随着 HTML5 变得更加实用,像 Richard Clark 的 HTML5 重置 变得流行起来。它仍然是 Meyer 重置的修改版本,并且保留了那种精神。
article,aside,details,figcaption,figure,
footer,header,hgroup,menu,nav,section {
display:block;
}
贯穿始终,有很多开发人员通过仅仅消除所有内容的边距和填充并将其保留在原处来实现最小化
* {
padding: 0;
margin: 0;
}
愚蠢的琐事:CSS-Tricks 的徽标灵感来自通用选择器和那个想法。
Normalize.css 出现了……
Normalize.css 代表了 CSS 重置应该做什么的精神上的第一次有意义的转变。这在我看来是如此的不同
- 它对所有可能在不同浏览器中以不同方式设置样式的内容进行了新的评估,并解决了所有这些问题。在旧的 CSS 重置只有几行代码的情况下,未压缩且有文档的 normalize 有 447 行。
- 它没有从已经在不同浏览器之间保持一致的元素中删除任何样式(在大多数情况下)。例如,Normalize 中没有针对 h2-h6 元素的任何内容,只有一个针对奇怪的 h1 问题的修复。这意味着您不会消除标题层次结构,默认样式将保留。
- 它更能适应修改的想法,而不仅仅是包含它。例如,有一个专门用于
<pre>
标签的部分,其中一行设置了它的font-family
。您可以将其更改为您想要的字体系列,它将同样有效地进行重置。
代码读起来令人满意,因为它解释了它在做什么,而不会陷入细节
/**
* 1. Remove the bottom border in Chrome 57- and Firefox 39-.
* 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
*/
abbr[title] {
border-bottom: none; /* 1 */
text-decoration: underline; /* 2 */
text-decoration: underline dotted; /* 2 */
}
今天 Normalize 已经到了 7.0.0 版本,并且拥有超过 30,000 个 GitHub 星标。它非常受欢迎。
所以……重置可以有主见吗?
我们已经看到了 CSS 重置的许多不同版本,并且看到了方法上的根本转变,因此我认为可以公平地说,CSS 重置可以采取有主见的态度。
让我们考虑一些方法……
- 重置是否触及每个可能的元素?还是一部分元素?它如何决定触碰哪些元素,不触碰哪些元素?
- 更改了哪些属性?只有跨浏览器差异的属性?还是其他标准,例如需要更改的其他元素的相似性?以一致性和效率的名义,将属性应用于没有跨浏览器问题的元素是否可以?
- 您是否尝试保留用户代理样式表的精神?合理的默认值?
- 您是否应用了任何没有跨浏览器问题的属性,这些属性可以被认为有利于“重置”,例如排版默认值或 box-sizing?
- 您是否包含用于常见需求的“工具箱”类?还是将其留给其他项目处理?
- 您是否关心它的尺寸?
- 您是否使用预处理器或任何其他工具?
看看 Vanilla CSS Un-Reset。这里有很多意见,首先是它旨在在使用重置取消元素样式后重新设置元素样式的想法。它以 pt
设置了 body 字体大小,设置了一个非常具体的等宽字体堆栈,包括一个 ol ol ol ol
选择器,一个 clearfix 和对齐辅助类。这里没有评判。人们创建事物来帮助解决他们自己的问题,我相信这对创建者很有帮助。但我们可以看到意见在那里闪耀。
现在看看 MiniReset.css。非常不同!它确实清除了类型样式“以便使用语义标记不会影响样式”,但有意保留了一些默认样式“以便按钮和输入保留其默认布局”,加入了一些没有跨浏览器问题但全局有用的内容(box-sizing
),并添加了一些小的响应式设计辅助程序。
那里完全不同的观点集。
Jonathan Neal 创建了一个名为 santize.css 的重置,它非常清楚它的观点。在 源代码 中搜索“opinionated”一词,您会看到它出现了 19 次。所有这些都是 Jonathan 基于研究和看似现代最佳实践做出的选择,毫无疑问,还融入了他自己对重置中应该包含什么的需求和愿望。
/*
* Remove the text shadow on text selections (opinionated).
* 1. Restore the coloring undone by defining the text shadow (opinionated).
*/
::-moz-selection {
background-color: #b3d4fc; /* 1 */
color: #000000; /* 1 */
text-shadow: none;
}
::selection {
background-color: #b3d4fc; /* 1 */
color: #000000; /* 1 */
text-shadow: none;
}
“重置”一词
就我个人而言,我认为将所有这些都放在同一个总称下并了解其哲学差异很有用。但是,Normalize 有意地将自己分开
CSS 重置的现代、支持 HTML5 的替代方案
Sanitize 自称是一个 CSS 库,除了引用 Meyer 重置之外,在任何地方都不使用“重置”一词。
重启
Reboot 很有趣,因为它可能是这个领域最新的参与者。它的文件历史可以追溯到 2015 年,这可能与 Bootstrap 4 在 Bootstrap 3 发布后需要一段时间才发布有关。Reboot 没有自己的存储库,它是 Bootstrap 的一部分。这是 直接文件 和 文档。
他们思考的方式很有趣
Reboot 在 Normalize 的基础上构建,为许多 HTML 元素提供了仅使用元素选择器的某种有主见的样式。其他样式仅使用类来完成。例如,我们重启了一些
<table>
样式以获得更简单的基线,然后提供.table
、.table-bordered
等。
您可以拥有一个执行样式的类,但是如果您使用重置,则不必用处理跨浏览器一致性问题的重置样式来重载该类。
//
// Tables
//
table {
border-collapse: collapse; // Prevent double borders
}
caption {
padding-top: $table-cell-padding;
padding-bottom: $table-cell-padding;
color: $text-muted;
text-align: left;
caption-side: bottom;
}
th {
// Matches default `<td>` alignment by inheriting from the `<body>`, or the
// closest parent with a set `text-align`.
text-align: inherit;
}
它绝对是有主见的,但以一种与 Bootstrap 完美结合的方式。它被埋藏在 Bootstrap 中的事实是一个很好的信号,表明它专为那个世界而设计,而不是任何项目的即插即用方案。也就是说,我尽力 在这里编译了一个简单的 CSS 版本。
根据浏览器支持定制重置
只要我们谈论重置的过去和未来,就值得再次提到 Browserslist,它是一种用于声明项目支持哪些浏览器/版本的标准化格式。
可以这样构建重置,使其包含的内容知道它们存在的原因。确切地说,它存在是为了支持哪个浏览器和版本。然后,如果 browserslist 配置表示此项目无论如何都不支持该特定浏览器,则可以删除该 CSS。
这就是 PostCSS Normalize 的作用。
有一篇关于重置和重启的有趣文章讲述了一个截然不同的故事:https://meiert.com/en/blog/reasons-against-resets/
当你能够移除重置并且布局保持不变时(有一些好的屏幕截图和测试,但我一时找不到),我理解为什么人们发现重置有问题。那样的话,它们就没有用了。
我从未使用过重置,也从未遇到过问题。
这件事很奇怪。
我认为Chris对此的看法非常到位。重置的故事一直存在争议——在过去17年的任何特定时期,应该使用哪种重置,以及是否应该完全使用重置。但是 Normalize(尽管通常被称为“重置”)实际上并不是一个经典的重置——它旨在以 jQuery 为我们做的那样,跨浏览器标准化问题。Normalize 在 HTML5 发布时非常重要,因为它还向浏览器展示了新的语义标签应该具有哪些默认值(对于那些尚未掌握规范的浏览器)。但随着浏览器的发展,如今浏览器变得更好,Normalize 的实用性有所下降,但我认为它并没有完全消失。
我知道你说你没有使用任何重置并且没有遇到问题,我可能要稍微不同意一下。你可能在某些你没有使用的浏览器的一些奇怪的边缘情况下遇到了一些你不知道的问题。如果你查看 Normalize 的代码,它非常出色地记录了它修复了哪些问题。很多我们都不知道存在的问题。
他的方法有点缺陷(参见其测试底部的评论:https://meiert.com/en/blog/stop-using-resets/)。他比较的是同一个浏览器的结果,而不是不同浏览器的结果。
我将所有重置都集成到了我的框架 CSS 中。这样做的原因是,框架需要重置的地方都需要它,而我不用框架的地方则不需要。(明白了吗?)
此外,添加额外的 CSS 层只是添加了一个额外的文件需要参考。
最终结果?我们现在几乎完全不使用重置了。我使用了一个神奇的字体大小基础作为 html,调整了 box-sizing,并在 body/html 上清除了 margin/padding。(哦,还有针对旧版浏览器的 html5 元素的 block 显示)
但即使是 H1-H6,由于每个网站设计都可能对 margin 有自己的看法,我们为什么要费心去重置它呢?作为设计师,我们是否如此拘泥于 Chrome 的 margin 比 Firefox 多 3 个像素?如果真的重要,将其放在实际的设计中(意见),而不是重置/框架(基线)。
哈利路亚!
有一段时间,我在网站上的一个元素上使用了内联 CSS,因为 Chrome 处理 flexbox 的方式很奇怪,导致它异常宽。但是,我最终删除了它,因为我意识到它并不重要。
我喜欢 Bootstrap 的 reboot CSS 重置。我知道 Chris 制作了一个纯 CSS 版本,但我自己也制作了一个纯 CSS 版本,但我在其中添加了 SASS 文件中的所有 SASS 注释,并将其转换为纯 CSS 注释。为什么?我教授 CSS,认为这对我的学生来说会很有帮助,让他们了解 Bootstrap(或 Normalize)团队在做出某些重置样式决策时所做的非常有见地的评论。我在 SASS 之前教授重置。可能对这里的人没有用,但如果你想参考该文件,可以在这里下载:https://github.com/michaelwhyte/bootstrap-reboot/blob/master/bootstrap-reboot-with-comments.css
就其价值而言,我对“重置”有截然不同的看法:http://www.cssmojo.com/css-reset_versus_css-starter/
CSS 重置都很好。看到它们是如何演变的也很不错。当 Normalize 出现时,大多数浏览器已经具有一定的稳定性。但是,重置所有内容以及重置后 CSS 作者重新应用时,是否会影响网站的性能?
我制作了一个页面,你可以在其中预览不同的重置(使用 HTML5 万能工具)
感谢此信息,它表明大多数这些重置完全没有意义。修复跨浏览器显示问题,是的。更改默认字体系列、链接颜色、字体颜色?呃?谁会心血来潮地在设计中使用默认字体系列或任何浏览器颜色?
为了重复另一篇文章对重置现状的批评,为什么要设置这些值 3 次?(浏览器 -> 重置 -> 网站设计)
因此,这些库中的哪一个真正有助于解决实际的多浏览器问题?这是我在类似重置的东西中看到的唯一真正价值。
@Daniel Whowsa。这很方便!