有何区别
px
在缩放页面时无法调整那些使用它作为单位的字体、按钮等的大小;em
的值并不是固定的,会继承父级元素的字体大小,代表倍数;rem
的值并不是固定的,始终是基于根元素<html>
的,也代表倍数。
em
em 的使用是相对于其父级的字体大小的,即倍数。浏览器的默认字体高都是 16px,未经调整的浏览器显示 1em = 16px。但是有一个问题,如果设置 1.2em 则变成 19.2px,问题是 px 表示大小时数值会忽略掉小数位的(你想像不出来半个像素吧)。而且 1em = 16px 的关系不好转换,因此,常常人为地使 1em = 10px。这里要借助字体的 %
来作为桥梁。
因为默认时字体 16px = 100%,则有 10px = 62.5%。所以首先在 body 中全局声明 font-size=62.5%=10px,也就是定义了网页 body 默认字体大小为 10px,由于 em 有继承父级元素字体大小的特性,如果某元素的父级没有设定字体大小,那么它就继续了 body 默认字体大小 1em = 10px。
但是由于 em 是相对于其父级字体的倍数的,当出现有多重嵌套内容时,使用 em 分别给它们设置字体的大小往往要重新计算。比如说你在父级中声明了字体大小为 1.2em,那么在声明子元素的字体大小时设置 1em 才能和父级元素内容字体大小一致,而不是 1.2em(避免 1.2*1.2=1.44em), 因为此 em 非彼 em。再举个例子:
<span>Outer <span>inner</span> outer</span>
body { font-size: 62.5%; }
span { font-size: 1.6em; }
结果:外层 <span>
为 body 字体 10px 的 1.6 倍 = 16px,内层 <span>
为外层内容字体 16px 的 1.6 倍 = 25px(或 26px,不同浏览器取舍小数不同)。
明显地,内部 <span>
内的文字受到了父级 <span>
的影响。基于这点,在实际使用中给我们的计算带来了很大的不便。
rem
引述 MDN:
rem values are relative to the root html element, not the parent element.
rem 的出现再也不用担心还要根据父级元素的 font-size 计算 em 值了,因为它始终是基于根元素(<html>
)的。
比如默认的 html font-size=16px,那么想设置 12px 的文字就是:12÷16=0.75(rem)
仍然是上面的例子,CSS 改为:
html { font-size: 62.5%; }
span { font-size: 16px; font-size: 1.6rem; }
结果:内外 <span>
的内容均为 16px。
需要注意的是,为了兼容不支持 rem 的浏览器,我们需要在各个使用了 rem 地方前面写上对应的 px 值,这样不支持的浏览器可以优雅降级。兼容性详情。
选择使用什么字体单位主要由你的项目来决定,如果你的用户群都使用最新版的浏览器,那推荐使用 rem,如果要考虑兼容性,那就使用 px,或者两者同时使用。
完。
《CSS 单位区别 px、em、rem》上有1条评论