好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

REMvsEM_html/css_WEB-ITnose

网页字体排版的最佳实践之一就是使用相对单位,如 rem 和 em .

问题是,你应该使用哪一个呢?一直以来, rem 支持者和 em 支持者之间都存在着争辩,认为应该使用自己支持的那个。

在这篇文章中,你会找到我如何在 rem 和 em 之间做抉择.你也将了解 rem 和 em 到底是什么以及如何使用它们来构建模块化组件。

什么是EM?

EM 是字体排印的一个单位,等同于当前指定的point-size。-维基百科

此语句在网页上并不能说得过去,因为我们不使用 point-size .如果我们用 point-size 取代 font-size 的话,这句话就完全行得通。

意思就是,如果存在一个选择器的 font-size 属性的值为 20px ,那么 1em=20px

h1 { font-size: 20px } /* 1em = 20px */p { font-size: 16px } /* 1em = 16px */ 

em 单位可以被用来声明字体的大小。实际上,最佳做法是使用相对单位,如用 em 指定 font-size 。

考虑如下代码:

h1 { font-size: 2em } 

这里 h1 选择器的真正大小是多少呢?

我们要根据

的父元素来计算 font-size 。它的父元素是 ,并且它的 font-size 被设置为 16px 。

通过这种方式,我们可以计算出 h1 的值为 32px ,或者说 2 * 16px .

html { font-size: 16px }h1 { font-size: 2em } /* 16px * 2 = 32px */ 

虽然也可以实现,但是这并不被认为是一个好主意,通过在 中设置 font-size 的像素值将影响用户浏览器所设置的值。

取而代之,你可以使用 percentage 值,或者完全摒弃 font-size 。

注意:如果你完全摒弃 font-size ,它的值将被默认为 100% .

html { font-size: 100% } /*这里的意思是默认值为16px*/ 

对于大多数的用户(和浏览器), font-size 的值为 100% ,就会默认为 16px ,除非用户通过浏览器设置来改变 font-size 的默认值。但是很少有人这么做。

好了,让我们回到 em 。

em 也可以用来指定除了 font-size 的其它属性值。 margin 和 padding 属性也经常用 em 设置大小。

这里是很多人开始对 em 的值产生困惑的地方。

考虑下面的代码。

元素的 margin-bottom 的值应该是多少?(假设 的 font-size 被设置为 100% ).

h1 {  font-size: 2em; /* 1em = 16px */  margin-bottom: 1em; /* 1em = 32px */}p {  font-size: 1em; /* 1em = 16px */  margin-bottom: 1em; /* 1em = 16px */} 

你是不是很吃惊两种状况下的 margin-bottom 的 1em 值不同?

这种现象的发生在于 1em 等同于它当前的 font-size 。因为

中的 font-size 被设置为了 2em 。其他用在

内的 em 来计算的属性,就为 1em = 32px 。

在不同的代码中, 1em 就会有不同的取值,这就是经常迷惑人们的地方。如果你也是刚刚接触 em ,你也会产生迷惑。

不管怎么说,这就是 em .接下来,让我们认识 rem 。

什么是REM?

rem 指根 em 。 它的产生是为了帮助人们解决 em 所带来的计算问题。

它是字体排版的一个单位,等同于根 font-size 。这意味着 1rem 等同于 中的 font-size 。

考虑相同的用 rem 表示的代码。现在 margin-bottom 计算出来的值为多少呢?

h1 {  font-size: 2rem;  margin-bottom: 1rem; /* 1rem = 16px */}p {  font-size: 1rem;  margin-bottom: 1rem; /* 1rem = 16px */} 

正如您看到的,无论您在哪里设置它, 1rem 的取值均为 16px 。

这是十分可靠的,很容易去理解。

这就是 rem 。一旦你知道了什么是 em ,就很容易去理解,你是不是也同意这个观点?

现在让我们步入这篇文章的正题, rem 还是 em ?

REMs or EMs?

这是极具争议的问题。

一些开发人员完全避免使用 rem ,声称使用 rem 会使他们的组件缺少模块化。另外一些人则什么都使用 rem ,因为喜欢 rem 所带来的便捷。

奇怪的是,在我的职业生涯中,我掉进了在不同的地方是使用 rem 或者 em 的陷阱中。我喜欢 em 帮助我完成模块化组件,但是讨厌它所带来的代码复杂性。我喜欢 rem 计算的便捷,但是讨厌他是我模块化组件的阻碍。

事实证明。 rem 和 em 均有各自的优缺点。应给根据实际情况来判断其使用方式。

这里我有两个简单的规则:

如果这个属性根据它的 font-size 进行测量,则使用 em 其他的一切事物均使用 rem .

有点太简单了么?让我们考虑用 rem 还是 em ,来书写一个简单的组件(头部元素),此过程中你就会发现这两个规则发挥的良好作用。

仅使用 rem 来制作标题元素

你有一个看起来如下图所示的标题元素(

):

如果你用 rem 设置一切属性的大小,标题元素的样式应该和上图相似:

.header {  font-size: 1rem;  padding: 0.5rem 0.75rem;  background: #7F7CFF;} 

目前为止,一切都好。

既然在相同的网页上会有不同大小的元素,接下来让我们创建一个稍微大的头部元素。这里,我们尽可能继承样式。

更大元素的标记可能如下所示:

header! 

css样式如下:

.header {  font-size: 1rem;  padding: 0.5rem 0.75rem;  background: #7F7CFF;}.header--large {  font-size: 2rem;} 

不幸的是,这个代码并不能实现效果。你会发现在 .header--larger 下,文本和边缘的空间太小。

如果你坚持使用 rem ,唯一的办法就是使用 padding 重新声明大标题:

.header {  font-size: 1rem;  padding: 0.5rem 0.75rem;  background: #7F7CFF;}.header--large {  font-size: 2rem;  padding: 1rem 1.5rem;} 

有没有注意到这里的模式? .header--larger 的 font-size 是 header 的两倍大。因此, .header--large 的 padding 是 .header 的两倍大小。

如果我们有更多大小的标题,或者改变标题大小时,又会发生什么呢?你已经可以看到如果使用 rem 对整个网站进行编码所带来的重复性以及复杂性。

我们可以同时使用 rem 和 em 简化代码,这样就不需要对 .header-larger 的 padding 进行声明。

.header {  font-size: 1rem;  padding: 0.5em 0.75em;  background: #7F7CFF;}.header--large {  font-size: 2rem;} 

正如你所看到的, 当有属性需要用它的字体大小( font-size )进行大小声明时,这时 em 就相当有用。 这就是第一条原则产生的地方。

接下来让我们看看,如何只使用 em 来创建相同的标题。

只使用 EMs 制作标题元素

只使用 em 来制作标头元素和只使用 rem 制作的代码差不多,只需要将 rem 该更为 em .

.header {  font-size: 1em;  padding: 0.5em 0.75em;  background: #7F7CFF;}.header--large {  font-size: 2em;} 

.header 和 .header--larger 的效果看起来和 rem 实现效果一样。

不是吗?

不是的!

你的网页只包含一个标题元素是极不可能的。我们必须考虑标题与页面其他元素的交互。

在标题之前或之后看见其他元素是十分正常的,如下图所示:

对于这个元素集的标记如下:

A Header Element

查看更多关于REMvsEM_html/css_WEB-ITnose的详细内容...

  阅读:30次