在前端开发的过程中,对于font-size
这个属性,我们最常用的单位值就是px
了。但是对比一些国外的大站,经常会发现他们的font-size
单位很少用px
,大部分都使用em
,还有一部分使用rem
。
那么,问题来了。
这三种单位究竟有什么区别呢?又该怎么合理的运用呢?
######先来说px
在PC时代的开发中,我们一直都用px
作为字体单位,似乎也没出现过什么问题。但是在规范当中px
其实并不是一个绝对的单位。在页面显示中,其实px
也是个相对单位,是相对于屏幕的分辨率的。
举个🌰:
假设我有个1200*768
的屏幕,屏幕的横向宽度是1200px
,也就是说,在这个屏幕的x方向上,有1200个像素点,如果不算字间距的话,可以放100个12px大小的字。那么假设这个屏幕的物理宽度是1200mm
,也就是说在这个屏幕中1px=1mm
,简单粗暴的把显示长度和物理长度做了对应,那么一个12px
的字,在这个屏幕上,其物理宽度也应该是12mm
。
那么如果,我的屏幕分辨率变成了2400*1536
,也就是分辨率高了一倍,那么一个12px
,应该要怎样显示?
根据观察,我们会发现这个12px
的字体,不会再像在1200*768
的屏幕中那样,占一个12mm*12mm
的位置了,而是变成占一个6mm*6mm
的大小的位置,这就说明了px
这个单位,其实并不是一个绝对单位,而是一个相对于屏幕分辨率的相对单位。
这里说明一下:
所谓的绝对,是类似于cm这种单位,也就是无论放到什么地方,1cm就是1cm,这个单位表示的度量不会改变,在这里称为绝对
######再来说说em
1em
一般会被认为是一个默认字号的大小,那么一个默认字号是多少呢?
在所有规范浏览器中,一个默认字号的大小都是16px
,也就是说,在没有任何css设定的情况下1em=16px
。
再来继续说em
,有了上面px
的铺垫,我们大概也能猜到em
其实也是一个相对单位。px
相对的参考值是屏幕的分辨率,而em
相对的参考值,则是父级元素的字号大小。
举个🌰:
假设我现在的一个页面上,什么css都没有,那么我的这个页面中1em=16px
是成立的,也就是说在body
元素中的所有子元素,如果其css设置font-size:1em;
,那么其值应该是16px
。
然后,我在页面上添加了两个div,变成了这样:
<body>
<style>
.wrap {
font-size: 2em;
}
.inner {
font-size: 1em;
}
</style>
<div class="wrap">
Wrap
<div class="inner">
Inner
</div>
</div>
</body>
那么这个结构的现实中,wrap
和inner
的字体大小,应该是多少px
呢?
经过测试,我们可以看到,wrap
和inner
的字号大小是一样的,可是这两个div的font-size
设置是不一样的啊?这是怎么回事儿?
这就要再回到上面说的em
的相对参考值,也就是父级元素的大小。
也就是说wrap
里面的字号现在是2*16px=32px
,而inner
里的字号是1*32px=32px
。
经过上面这一大通废话,现在总算弄清楚了px
和em
的区别,但是既然有了px
,又为什么要用em
呢?
这又要说回来,px
是相对屏幕分辨率的一个单位,也就是说,如果我在一个页面中,想给所有文字的大小都变大一倍,那么我就要把所有设置font-size
地方的值,都重新乘以2,才能够实现。
如果用em
呢?那我只需要在一开始,在body
上,设置一个font-size
,那么body
下面的所有设置font-size
单位为em
的元素,都会跟body
保持一个比例,这时,我只需要修改body
的font-size
就可以了。
######最后再来说说rem
rem
和em
其实是类似的单位,只不过是rem
多了一个r
而已,那么这个r
,究竟是做什么用的?
从上面的em
可以了解到,其是一个相对父级元素的单位,如果嵌套层级比较多,恰好一个dom结构又经手了很多人之后,其中em
的继承关系很难弄清楚,所以在css3中,新加了个rem
单位,作为em
的强力补充。
rem
是一个相对根节点的单位,使用rem
作为单位的话,其值都是相对于html
节点的字号大小的值,再来看看上面那个栗子:
<body>
<style>
.wrap {
font-size: 2rem;
}
.inner {
font-size: 1rem;
}
</style>
<div class="wrap">
Wrap
<div class="inner">
Inner
</div>
</div>
</body>
这次wrap
和inner
的字号不一样了。
可以看出来,wrap
的字号为2*16px=32px
;而inner
的字号为1*16px=16px
。
######最后的最后,再来说个小技巧
在使用rem
时,可以给html
设置一个font-size:0.625rem;
也就是10px
,这样的话,在设计稿中的任何字号的字体,只要除以10,就可以得到相应字号的字体了。