CSS -- 字体单位(px、em、rem)

web页面经常使用记量单位:px、em、rem;css

任意浏览器的默认字体都是16px。全部未经调整的浏览器都符合: 16px = 1em = 1rem。html

==》在一个CSS选择器被写入时,浏览器就有了一个“16px”大小的默认渲染字体。此时咱们Web页面中的<body>就继承了这个“font-size:16px;”,除非你在CSS样式中显式的设置<body>的“font-size”值,来改变其继承的值。css3

 

一、px / em / rem 区别、优缺点web

px:相对长度单位 -- 绝对值,是相对于显示器屏幕分辨率而言的。(引自CSS2.0手册);页面按精确像素展现(方便、一致、稳定、精确)。chrome

存在问题:IE6不支持字体缩放。(字体以px为单位的网站没有反应
描述:当用户对页面进行 按Ctrl滚页面的时候(ctrl+、ctrl-)(缩放浏览页面),页面结构产生了不可预知的错乱;
   当用户在浏览器中浏览咱们制做的Web页面时,他改变了浏览器的字体大小,这时会使用咱们的Web页面布局被打破。

em:相对长度单位 -- 相对值,相对于当前对象内文本的字体尺寸(基准点为父节点字体的大小)。如当前对行内文本的字体尺寸未被人为设置,则相对于浏览器的默认字体尺寸。(引自CSS2.0手册)。浏览器

 特色:em的值并非固定的;工具

    em会继承父级元素的字体大小。(相对于其父元素来设置字体大小)。布局

    (缺点)从新计算那些被放大的字体的em数值。避免字体大小的重复声明。测试

 存在问题:重复声明)-- 进行任何元素设置,都有可能须要知道他父元素的大小,在咱们屡次使用时,就会带来没法预知的错误风险。字体

 描述:例如在#content中声明了字体大小为1.2em(12px),则 p 中字体大小就只能是12px(1em),而不是1.2em, 由于此em非彼em,它因继承#content的字体高而变为了1em=12px。

rem:既绝对又相对 -- 自己绝对,html相对 。(CSS3属性)。

 特色:CSS3属性,font size of the root element

    rem 是相对于根元素<html>,既 只需 根元素肯定一个参考值。  

 存在问题:CSS3属性,存在兼容性问题。

二、px / em / rem 兼容

px、em:CSS2属性 全部
rem:CSS3属性 支持主流Mozilla Firefox 3.6+、Apple Safari 5+、Google Chrome、IE9+和Opera11+。 IE6-8不支持

三、px / em / rem 用法

em用法:
  1. body选择器中声明Font-size=62.5%;(Font-size=63%;用于ie6兼容)
  2. 将你的原来的px数值除以10,而后换上em做为单位;
  3. 从新计算那些被放大的字体的em数值。避免字体大小的重复声明。

  换算公式: 1 ÷ 父元素的font-size × 须要转换的像素值 = em值


  ie问题
诡异的12px汉字在完成em转换时还会发现一个诡异的现象,获得的12px(1.2em)大小的汉字在IE中并不等于直接用12px定义的字体大小,而是稍大一点。这个问题 Jorux已经解决,只需在body选择器中把62.5%换成63%就能正常显示了。缘由多是IE处理汉字时,对于浮点的取值精确度有限。
  em是相对单位,网页中的文字能放大和缩小。将行距(line-height),和纵向高度的单位都用em。保证缩放时候的总体性。

  弹性布局样例
在<body>中设置一个正文文本所需的字体大小,或者设置为“10px”,至关于(“0.625em或62.5%”),这样为了方便其子元素计算。这两种都是可取的。可是咱们都知道,<body>的默认字体是“16px”,同时咱们也很清楚了,咱们改变了他的默认值,要让弹性布局不被打破,就须要从新进行计算,从新进行调整。因此完美的设置是: body {font-size:1em;}
     但是在那个没人爱的IE底下,“em”会有一个问题存在。调整字体大小的时候,一样会打破咱们的弹性布局,不过还好,有一个方法能够解决: html {font-size: 100%;}
  
  
弹性布局写法:
      html {font-size: 100%;}
      body {font-size: 1em;}
      #wrap {          
        width: 46.25em;/*740px ÷ 16 = 46.25em */
        margin: 1.5em auto;/*24px ÷ 16 = 1.5em*/
        border: 0.0625em solid #ccc;/*1px ÷ 16 = 0.0625em*/
      }
rem用法:
  在根元素html 定义基本字体大小为62.5%(即10px。
设置这个值主要方便计算,若是没有设置,将是以“16px”为基准)。
  
  
html { font-size: 62.5%;/*10 ÷ 16 × 100% = 62.5%*/ }
  body { font-size: 1.4rem;/*1.4 × 10px = 14px */ }
  h1 { font-size: 2.4rem;/*2.4 × 10px = 24px*/ }
  p {font-size:14px; font-size:1.4rem;}
/*解决兼容 : IE8及以前版本的IE浏览器使用14像素 */
  
兼容问题:
对于不支持它的浏览器,就是多写一个绝对单位的声明。这些浏览器会忽略用rem设定的字体大小。
      p { font-size:14px; font-size:.875rem; } // 顺序书写

其余:
可引入 CSS 预处理工具(Sass、LESS 、Stylus等)自动计算 rem 值。
选择使用什么字体单位主要由你的项目来决定,若是你的用户群都使用最新版的浏览器,那推荐使用rem,若是要考虑兼容性,那就使用px,或者二者同时使用。

 五、移动实例:css3中单位px,em,rem,vh,vw,vmin,vmax的区别及浏览器支持状况

    rem在移动端应用可参考淘宝的页面 http://m.taobao.com (html的font-size经过动态计算获取)

页面基准320px(20px),html font-size值的计算:

    var ele=document.getElementsByTagName("html")[0],  

      size=document.body.clientWidth/320*20;  

    ele.style.fontSize=size+"px"  

注:需设置meta缩放比1:1

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no" />
该文中好提到:(另外需注意chrome强制最小字体为12号,即便设置成 10px 最终都会显示成 12px,当把html的font-size设置成10px,子节点rem的计算仍是以12px为基准,因此网上不少文章提到的将html的font-size设为10方便计算不是那么可取)。  ---  (未测试)