Box-sizing最佳实践与Bootstrap的Reboot.css

栏目: CSS · 发布时间: 6年前

内容简介:CSS 的盒子模型 Box Model不会将 padding 与 border 计算到容器(如 div)的的宽度(width)当中,这就导致你所设定的容器宽度未必是最终宽度(需要加上 padding 与 border)。这被很多开发者所诟病,因此就有了这显然是很实用的设计,很多开发者将它用于所有 CSS 选择器:

Box-sizing最佳实践与Bootstrap的Reboot.css

box-sizing 是什么?

CSS 的盒子模型 Box Model不会将 padding 与 border 计算到容器(如 div)的的宽度(width)当中,这就导致你所设定的容器宽度未必是最终宽度(需要加上 padding 与 border)。这被很多开发者所诟病,因此就有了 box-size: border-box 的设定,其效果便是将 padding 和 border 纳入容器宽度。

如何应用 box-sizing

这显然是很实用的设计,很多开发者将它用于所有 CSS 选择器:

* {
  box-sizing: border-box;
}

相对于 border-box ,原本的不计算 padding 与 border 的称为: content-box 。详情请参考 W3Schools

这一设定的问题是 box-sizing 是不被继承的。如果需要在某些地方用回 content-box,这个 content-box 内部的容器依然会是 border-box:

<div class="component"> <!-- I'm content-box -->
  <header> <!-- I'm border-box still -->
  </header>
</div>

因此 Chris Coyier 建议这样设定:

html {
  box-sizing: border-box;
}
*,
*:before,
*:after {
  box-sizing: inherit;
}

*::before 和 *::after 也被加了进来,并且所有元素都会继承上级的设定。

然而 Bootstrap 的 reset : Reboot.css 却推翻了这一设定,理由是, Google Chrome 中存在一个小 bug: details 无法正确继承父级的 box-sizing 设定(一说 summary 也有同样的情况)。这个 codepen 演示了这个 bug。

这个 bug 在2016年就已经报告到 Google Chrome ,但一直没得到重视。而 Bootstrap 的做法是,放弃继承的部分:

*,
*::before,
*::after {
  box-sizing: border-box;;
}

但个人觉得,这样的做法有种削足就履的感觉。再说,这个 bug 没有得到 Google Chrome 的重视,也说明了它其实影响很小: 你上次用 details 是什么时候?相反层层继承是CSS的基本概念,远比这个小 bug 重要,特别网页中用到 component 时,某些 component 可能就是以 content-box 设计的。若没有了继承,它的设计就可能会乱套。因此,我比较倾向 Chris Coyier 的做法。

CSS Reset 与 Bootstrap 4 的 Reboot.css

研究 box-sizing 的过程中,考虑了一下 CSS Reset 的问题,因为最好的做法是将 box-sizing 的设定放在 Reset 中。 CSS Reset 最流行的方案有两个: Eric MeyerNormalize.css 。Eric Meyer 基本上取消掉预设设定(h1看起来跟h2一样),使得所有浏览器效果都一样。这意味著,你要重写所有基本设定,如h1和h2的字体大小等。而 Normalize.css 则是让浏览器回归基本,让你有一个一致的基础来进行设计。它其中一个原则是避免武断(opinionated),意即,只提供基本,不要求你使用某人的偏好。因此,Normalize.ccs 没有设定字体等会因人而异的内容。 box-sizing 的设定自然是不会出现在 Normalize.css 当中。

Bootstrap 4 也引入了自己的 CSS Reset 方案: Reboot.css 。它是基于 Normalize.css 的,加入了一些偏好设定,Bootstrap 的网站上有详细说明。Bootstrap 仍是全世界最流行的前端框架,它的偏好设定也是以适合绝大多数开发者为考量,并做到与时俱进。例如,我们之前讨论过的让网页使用 系统字体(System Font Stack) , Reboot.css 也做了同样的处理。

但 Reboot.css 也有一些我不喜欢的地方。像上面提到的 box-sizing 的处理。另外,我习惯将 html 的字体设为 62.5%,即10px,这样之后设定 rem 时便是以 10px 为基础,而不是预设的 16px,更容易计算:

html {
  font-size: 62.5%;
}
body {
  font-size: 1.6rem;
}

还有使用系统字体的部分,我想加入微软雅黑(Microsoft YaHei)以加强对简体中文的支持:

$font-family-sans-serif: -apple-system, BlinkMacSystemFont, 'Microsoft YaHei', 'Segoe UI', Roboto,
  'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji',
  'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji' !default;

Dawn.css

为了方便以后的开发,我对 Reboot.css 做了一点修改,主要是以上提到的几点,并上传到 GitHub,命名为: Dawn.css 。如果你也认同这些修改的话,欢迎参考和提供意见。


以上所述就是小编给大家介绍的《Box-sizing最佳实践与Bootstrap的Reboot.css》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Masterminds of Programming

Masterminds of Programming

Federico Biancuzzi、Chromatic / O'Reilly Media / 2009-03-27 / USD 39.99

Description Masterminds of Programming features exclusive interviews with the creators of several historic and highly influential programming languages. Think along with Adin D. Falkoff (APL), Jame......一起来看看 《Masterminds of Programming》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

html转js在线工具
html转js在线工具

html转js在线工具