font-size:px&em&rem

- 1 min

在前端开发的过程中,对于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>

那么这个结构的现实中,wrapinner的字体大小,应该是多少px呢?

经过测试,我们可以看到,wrapinner的字号大小是一样的,可是这两个div的font-size设置是不一样的啊?这是怎么回事儿?

这就要再回到上面说的em的相对参考值,也就是父级元素的大小。

也就是说wrap里面的字号现在是2*16px=32px,而inner里的字号是1*32px=32px

经过上面这一大通废话,现在总算弄清楚了pxem的区别,但是既然有了px,又为什么要用em呢?

这又要说回来,px是相对屏幕分辨率的一个单位,也就是说,如果我在一个页面中,想给所有文字的大小都变大一倍,那么我就要把所有设置font-size地方的值,都重新乘以2,才能够实现。

如果用em呢?那我只需要在一开始,在body上,设置一个font-size,那么body下面的所有设置font-size单位为em的元素,都会跟body保持一个比例,这时,我只需要修改bodyfont-size就可以了。

######最后再来说说rem

remem其实是类似的单位,只不过是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>

这次wrapinner的字号不一样了。

可以看出来,wrap的字号为2*16px=32px;而inner的字号为1*16px=16px

######最后的最后,再来说个小技巧

在使用rem时,可以给html设置一个font-size:0.625rem;也就是10px,这样的话,在设计稿中的任何字号的字体,只要除以10,就可以得到相应字号的字体了。

rss facebook twitter github youtube mail spotify lastfm instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora