参考地址:http://m.ctrip.com/html5/javascript
https://www.amazon.cn/css
rem是相对于html根元素的一个单位。rem是px的16倍,即1rem = 16px;除了IE低版本浏览器不支持它之外,其余都支持,看下图:html
如今大部分浏览器IE9+,Firefox、Chrome、Safari、Opera ,若是咱们不修改相关的字体配置,都是默认显示font-size是16px即前端
html { font-size:16px; }
那么若是咱们想给一个P标签设置12px的字体大小那么用rem来写就是html5
p { font-size: 0.75rem; //12÷16=0.75(rem) }
用它的好处就是,只要改变根的大小,后面全部的rem设置都会改变,这样很好作屏幕适配。java
在讲rem屏幕适配以前,先说一下通常作移动端适配的方法,通常能够分为: 1 简单一点的页面,通常高度直接设置成固定值,宽度通常盛满整个屏幕。 2 稍复杂一些的是利用百分比设置元素的大小来进行适配,或者利用flex等css去设置一些须要定制的宽度。 3 再复杂负责一些的响应式页面,须要利用css3的media query属性来进行适配,大体思路是根据屏幕不一样大小,来设置对应的css样式。 上面的一些方法,其实也能够解决屏幕适配等问题,可是既然出来的rem这个新东西,也必定能兼顾到这些方面,下面具体来讲具体使用rem:css3
先看一个简单的例子:git
.con { width: 10rem; height: 10rem; background-color: red; } <div class="con"> </div>
这是一个div,宽度和高度都用rem来设置了,在浏览器里面是这样显示的, 能够看到,在浏览器里面width和height分别是160px,正好是16px * 10,那么若是将html根元素的默认font-size修改一下呢?github
html { font-size: 17px; } .con { width: 10rem; height: 10rem; background-color: red; } <div class="con"> </div>
再来看看结果:web
这时width和height都是170px,这就说明了将rem应用与width和height时,一样适用与rem的特性,根据根元素的font-size值来改变自身的值,由此咱们应该能够联想到咱们能够给html设定不一样的值,从而达到咱们css样式中的适配效果。
rem数值计算
若是利用rem来设置css的值,通常要经过一层计算才行,好比若是要设置一个长宽为100px的div,那么就须要计算出100px对应的rem值是 100 / 16 =6.25rem,这在咱们写css中,其实算比较繁琐的一步操做了,不过这其实都不是事。 想一想咱们如今的工程,哪一个没有用构建的,前端构建中,彻底能够利用scss来解决这个问题,例如咱们能够写一个scss的function px2rem即:
@function px2rem($px){ $rem : 37.5px; @return ($px/$rem) + rem; }
这样,当咱们写具体数值的时候就能够写成:
height: px2rem(90px);
width: px2rem(90px);;
看到这里,你可能会发现一些不理解的地方,就是上面那个rem:37.5px是怎么来的,正常状况下不是默认的16px么,这个其实就是页面的基准值,和html的font-size有关。
rem基准值计算
关于rem的基准值,也就是上面那个37.5px实际上是根据咱们所拿到的视觉稿来决定的主要有如下几点缘由:
1 因为咱们所写出的页面是要在不一样的屏幕大小设备上运行的
2 因此咱们在写样式的时候必需要先已一个肯定的屏幕来做为参考,这个就由咱们拿到的视觉稿来定
3 假如咱们拿到的视觉稿是以iphone6的屏幕为基准设计的
4 iPhone6的屏幕大小是375px,
rem = window.innerWidth / 10
这样计算出来的rem基准值就是37.5(iphone6的视觉稿),这里为何要除以10呢,其实这个值是随便定义的,假如不除以10,根据咱们算出来的基准值会偏大,这样在设置html的font-size时候会偏小,咱们知道浏览器的font-size若是小于12px就显示不出效果了,在这里列举一下其余手机的
iphone3gs: 320px / 10 = 32px
iphone4/5: 320px / 10 = 32px
iphone6: 375px / 10 =37.5px
动态设置html的font-size
如今关键问题来了,咱们该如何经过不一样的屏幕去动态设置html的font-size呢,这里通常分为两种办法
1 利用css的media query来设置即
@media (min-device-width : 375px) and (max-device-width : 667px) and (-webkit-min-device-pixel-ratio : 2){ html{font-size: 37.5px;} }
2 利用javascript来动态设置 根据咱们以前算出的基准值,咱们能够利用js动态算出当前屏幕所适配的font-size即:
document.getElementsByTagName('html')[0].style.fontSize = window.innerWidth / 10 + 'px';
而后咱们看一下以前那个demo展现的效果
.con { width: px2rem(200px); height: px2rem(200px); background-color: red; } <div class="con"> </div> document.addEventListener('DOMContentLoaded', function(e) { document.getElementsByTagName('html')[0].style.fontSize = window.innerWidth / 10 + 'px'; }, false);
在iphone4下,显示169px
因而可知咱们能够经过设置不一样的html基础值来达到在不一样页面适配的目的,固然在使用js来设置时,须要绑定页面的resize事件来达到变化时更新html的font-size。
咱们知道,通常咱们获取到的视觉稿大部分是iphone6的,因此咱们看到的尺寸通常是双倍大小的,在使用rem以前,咱们通常会自觉的将标注/2,其实这也并没有道理,可是当咱们配合rem’使用时,彻底能够按照视觉稿上的尺寸来设置。
1 设计给的稿子双倍的缘由是iphone6这种屏幕属于高清屏,也便是设备像素比(device pixel ratio)dpr比较大,因此显示的像素较为清晰。
2 通常手机的dpr是1,iphone这种高清屏是2,能够经过js的window.devicePixelRatio获取到当前设备的dpr,因此iphone6给的视觉稿大小是(*2)750×1334了。
3 拿到了dpr以后,咱们就能够在viewport meta头里,取消让浏览器自动缩放页面,而本身去设置viewport的content例如
meta.setAttribute('content', 'initial-scale=' + 1/dpr + ', maximum-scale=' + 1/dpr + ', minimum-scale=' + 1/dpr + ', user-scalable=no');
4 设置完以后配合rem,修改
@function px2rem($px){ $rem : 75px; @return ($px/$rem) + rem; }
双倍75,这样就能够彻底按照视觉稿上的尺寸来了。不用在/2了,这样作的好处是:
1 解决了图片高清问题。
2 解决了border 1px问题(咱们设置的1px,在iphone上,因为viewport的scale是0.5,因此就天然缩放成0.5px)
可是rem也并非万能的,下面也有一些场景是不适于使用rem的
1 当用做图片或者一些不能缩放的展现时,必需要使用固定的px值,由于缩放可能会致使图片压缩变形等。
2 再设置backgroundposition或者backgroundsize时不宜使用rem。
在列举几个使用rem的线上网站:
网易新闻:http://3g.163.com/touch/news/subchannel/all?version=v_standard