关于rem自适应的一点研究

参考地址: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进行屏幕适配

  在讲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

再来看看结果: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即:

这样,当咱们写具体数值的时候就能够写成:

看到这里,你可能会发现一些不理解的地方,就是上面那个rem:37.5px是怎么来的,正常状况下不是默认的16px么,这个其实就是页面的基准值,和html的font-size有关。

 

rem基准值计算

 

关于rem的基准值,也就是上面那个37.5px实际上是根据咱们所拿到的视觉稿来决定的主要有如下几点缘由:

1 因为咱们所写出的页面是要在不一样的屏幕大小设备上运行的

2 因此咱们在写样式的时候必需要先已一个肯定的屏幕来做为参考,这个就由咱们拿到的视觉稿来定

3 假如咱们拿到的视觉稿是以iphone6的屏幕为基准设计的

4 iPhone6的屏幕大小是375px,

这样计算出来的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来设置即

2 利用javascript来动态设置 根据咱们以前算出的基准值,咱们能够利用js动态算出当前屏幕所适配的font-size即:

而后咱们看一下以前那个demo展现的效果

在iphone4下,显示169px

因而可知咱们能够经过设置不一样的html基础值来达到在不一样页面适配的目的,固然在使用js来设置时,须要绑定页面的resize事件来达到变化时更新html的font-size。

 

rem适配进阶

咱们知道,通常咱们获取到的视觉稿大部分是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例如

4 设置完以后配合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

聚划算:https://jhs.m.taobao.com/m/index.htm#!all

相关文章
相关标签/搜索