首先,px、em、rem都是相对单位;

px(pixel像素)是相对于显示器屏幕分辨率的,IE无法调整那些使用px作为单位的字体大小;

em是相对于当前对象内文本字体的尺寸,如当前对行内文本的字体尺寸未被人为设置,则相对于浏览器的默认字体尺寸。(引自CSS2.0手册),不过需要注意的是em单位会继承父级元素的字体大小;

而rem是CSS3新增的一个相对长度单位(root em,根em);那么这个单位与em有什么区别与联系呢?rem和em单位一样,都是一个相对单位,不同的是em是相对于父元素的font-size进行计算,而rem是相对于根元素html的font-size来进行计算的 , 这样一来rem就绕开了复杂的层级关系,实现了类似于em单位的功能。目前除了IE8及其更早版本的浏览器其他的都已支持rem;

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

所以我们在用em作为单位时,需要注意三点:

1. body选择器中声明Font-size=62.5%;

2. 将你的原来的px数值除以10,然后换上em作为单位;

3. 重新计算那些被放大的字体的em数值,避免字体大小的重复声明;

关于第三点,也就是避免1.2 * 1.2= 1.44的现象;比如说你在#div1中声明了字体大小为1.2em,那么在声明#div1的子元素#div2的字体大小时就只能是1em,而不是1.2em;若是1.2em,它会因继承了#div1的字体高而变为了1.2*1.2=1.44相对长度; 所以em的值其实并不是固定的,它会继承父级元素的字体大小;

默认情况下浏览器给的字体大小是16px,所以按照转化关系 16px = 1rem;使用rem布局的时候,为了兼容不同的分辨率,我们应该要动态的修正根字体的大小,让所有的用rem单位的子元素跟着一起缩放,从而达到自适应的效果;一般情况在项目的最前面加载一段js来修改html的font-size,针对不同分辨率计算font-size,监听浏览器更改 html的font-size;给html设置fontSize大小,其实就是在DOMContentLoaded或者resize变化后调整fontSize的大小,从而调整rem的比值关系;

下面贴上Aaron大神在慕课上讲圣诞节的时候讲到的代码,实现监听浏览器更改html的font-size;ps:非Ctrl c+v , 良心手打~嘤嘤

  var docEle=document.documentElement;

  //当用户翻转设备(即设备横向持或纵向持,方向发生改变时)此事件被触发;

  //在绑定resizeEvt事件时,注意当浏览器不支持orienrationchange事件时我们绑定resize事件;总之就是监听当窗口发生变化时就 需要重新设置根字体的值;

  resizeEvt='orientationchange' in window ? 'orientationchange' : 'resize' ,

  reCal=function(){

    //   ①

    docEle.style.fontSize=20*(docEle.clientWidth/320)+'px';

  }

  绑定浏览器缩放与加载事件

  windows.addEventListener(resizeEvt , reCal , false);

  windows.addEventListener(DOMContentLoaded , reCal , false);

注意docEle.style.fontSize=20*(docEle.clientWidth/320)+'px'这个公式不是一定的,需要根据不同情况定义,具体的可参见:http://www.data321.com/fe659370;

使用rem作为单位的话,比如 在浏览器默认情况html内字体大小为16px时,一个需要显示字体大小为14px的div 可以直接设置样式为font-size:.875rem就可以了;

最新文章

  1. 经典排序算法 – 插入排序Insertion sort
  2. Mybatis 学习笔记1 不整合Spring的方式使用mybatis
  3. rdesktop in linux
  4. NYOJ题目124中位数
  5. 如何设置适当的ramp-up period值
  6. Idea报错Check $M2_HOME environment variable and mvn script match.
  7. TCP 连接关闭及TIME_WAIT探究
  8. [HNOI 2013]比赛
  9. 密码学Hash函数
  10. 大学?做码农?做project师?
  11. Freemarker 页面静态化技术使用入门案例
  12. Bulbs【暴力?】
  13. 性能测试Jmeter扩展学习-添加自定义函数
  14. iOS程序的启动执行顺序
  15. 升级cocoapods1.1.1版本
  16. LintCode 397: Longest Increasing Continuous Subsequence
  17. 数组根据index拆分和查询下标
  18. Linux ssh服务
  19. gradle 插件
  20. winform 的语言国际化

热门文章

  1. 【报错】An error happened during template parsing (template: "class path resource [templates/adminManageCourse.html]")
  2. hdu6311 Cover (欧拉路径输出)
  3. 玩爆你的手机联系人--T9搜索(一)
  4. Pull Request的正确打开方式(如何在GitHub上贡献开源项目)
  5. 各种设备在linux中的文件名
  6. axios 如何获取下载文件的进度条
  7. windows使用ubuntu启动linux服务
  8. python如何简单的处理图片(1):打开\显示
  9. canvas 转盘文字
  10. 【学习笔记】圆方树(CF487E Tourists)