CSS 单位 px rem em

单位转换工具

点我

px

px是一个虚拟长度单位,是计算机系统的数字化图像长度单位,如果px要换算成物理长度,需要指定精度DPI(Dots Per Inch,每英寸像素数),在扫描打印时一般都有DPI可选。Windows系统默认是96dpi,Apple系统默认是72dpi。

特点

  1. IE无法调整那些使用px作为单位的字体大小(缩放)
  2. 国外的大部分网站能够调整的原因在于其使用了em或rem作为字体单位
  3. Firefox能够调整px和em,rem,但是96%以上的中国网民使用IE浏览器(或内核)

em

em 指字体高,所有浏览器的默认字体高都是16px。所以未经调整的浏览器都符合: 1em=16px。那么12px=0.75em, 10px=0.625em。为了简化font -size的换算,需要在css中的body选择器中声明Font-size=62.5%,这就使em值变为16px*62.5%=10px, 这样12px=1.2em, 10px=1em, 也就是说只需要将你的原来的px数值除以10,然后换上em作为单位就行了。

特点

1em指的是一个字体的大小,它会继承父级元素的字体大小,所以不是一个固定的值。任何浏览器的默认字体大小都是16px。所以12px = 0.75em。实际应用中为了方便换算,通常会如下设置样式:

body {
  font-size: 62.5%;
}

这样,1em = 10px。常用的1.2em上就是12px

在中文文章的格式中,每个段落开头都要空出2格,如果用px做单位,对于12px的字体则需要24px,以此类推,但是对于em来说就相对简单了。

p {
  text-indent: 2em;
}

注意点

  • 标签嵌套字体增大

em是想对父元素的font-size属性来决定字高的。那么在多级嵌套下就会出现1.2em * 1.2em = 1.44em的问题出现。如:

<style>
  body { font-size: 62.5%; }
  .container { font-size: 1.2em; }
  .container p { font-size: 1.2em; }
</style>

<div class="container">
  我是文字1
  <p>我是文字2</p>
</div>

在上述例子中'我是文字2'会比'我是文字1'大,因为pfont-size属性是基于1em = 12px的字高去计算自身内部的em值:

/* 1em = 16px -> 计算后 1em = 10px */
body { font-size: 62.5%; }

/* 1em = 10px -> 计算后 1em = 12px */
/* 在container中的字体 都会为12px */
.container { font-size: 1.2em; }

/* 1em = 12px -> 计算后 1em = 14.4px */
/* 在p中的字体 都会为14.4px */
.container p { font-size: 1.2em; }

所以如果想在p中使用同样大小的字,不能设置为1.2em,只能设置为1em

  • IE中12px的汉字偏大

12px(1.2em)大小的汉字在IE中并不等于直接用12px定义的字体大小,而是稍大一点。你只需在body选择器中把62.5%换成63%就能正常显示了。原因可能是IE处理汉字时,对于浮点的取值精确度有限。

该象只发生在12px的汉字,英文不存在此现象。

body {
  font-size: 63%;
}  

rem

rem是CSS3新增的一个相对单位(root em,根em)。这个单位与em的区别在于使用rem相对的是HTML根元素。只要根元素不修改font-size属性,那么rem的想对大小不会变,而em是相对父元素的font-size设置想对大小。

可以避免em字体大小逐层复合的连锁反应。目前,除了IE8及更早版本外,所有浏览器均已支持rem。对于不支持它的浏览器,应对方法也很简单,就是多写一个绝对单位的声明。这些浏览器会忽略用rem设定的字体大小。

p {
  font-size: 14px;
  font-size: .875rem;
}

优点

不会出现像em那样1.2em * 1.2em = 1.44em的情况出现,因为rem是相对htmlfont-size设置,而em是相对父元素font-size

<style>
  html { font-size: 62.5%; }
  .container { font-size: 1.2rem; }
  .container p { font-size: 1.2rem; }
</style>

<div class="container">
  <!-- '我是文字1'和'我是文字2'是一样大的 -->
  我是文字1
  <p>我是文字2</p>
</div>

必须设置html的css样式,否则会按照默认的1rem = 16px

缺点

CSS3新增的特性,所以只有支持C3的浏览器才兼容。解决方法低版本浏览器使用px,高版本使用rem。

    原文作者:ci0n
    原文地址: https://segmentfault.com/a/1190000010623222
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞