移动端适配的三种方法之(三)rem是啥?实际工作怎样用它?

前言:正好最近有时间,给移动端适配这里做一个整理,全面并且深入地重新去理解这些代码的含义,不再只是代码的搬运工,不再只会像之前一样复制粘贴,这篇rem和em是因为我自己做了好几个移动端的rem了,都是组长算好告诉比率什么的直接用就行了,对于rem和em到底是个什么东西还是完全没有头绪的,所以上网查了一些资料,整理出这篇文章。如果觉得对你有帮助,麻烦点个赞~~

关键词:移动端适配,rem,em~~......

正文:

一、基本定义

  rem,官方定义就是根据网页的根元素来设置字体大小。那也就是说,一旦网页的根元素的大小发生了变化,那rem也会相应的变化,以rem为单位的也会成比例放大或缩小。那不就是等价于可以适应我们各种手机屏幕吗?

二、rem和px互相转化

  现在大部分浏览器IE9+,Firefox、Chrome、Safari、Opera ,如果我们不修改相关的字体配置,都是默认显示font-size是16px.。那既然rem就是根据网页的根元素来设置字体大小,那么如果我们想给一个div标签设置12px的字体大小那么用rem来写就是:

html {
    font-size:16px;
}
div {
    font-size: 0.75rem; //12÷16=0.75(rem)
}

  就是16px代表着1rem,那12px是多少rem呢?就是12÷16=0.75rem。那么,当网页根元素字体改变时,我们以rem为单位的标签们会发生什么样的变化?举个栗子:

.box{
      width: 10rem;
      height: 10rem;
      background: red;
 }
<div class="box"></div>
//默认情况下
image.png
html {
    font-size: 17px;
}
.box{
      width: 10rem;
      height: 10rem;
      background: red;
 }
<div class="box"></div>
image.png
三、在工作中的应用-----写js(万能的js)

  那我们怎样把它应用到我们的实际工作中去呢?大家都了解,在实际工作中,我们要面对各式各样的手机型号,他们的大小都不一样。但是我们收到的psd设计稿,往往只有一张。一般我们获取到的设计稿大部分是iphone6的,也就是最为常见的宽为750像素的设计稿。(事实上是我遇到的都是750像素的设计稿)而iPhone6的可视区在320px左右,所以在使用rem之前,我们一般会自觉的将所量出的宽高除以2。
  既然rem是根据HTML根元素的fontsize大小来计算变化的,那我们就把根元素的fontsize设置为一个变量,这个变量根据移动端可视区宽度的变化而变化。
最初的做法是这样的:

document .getElementsByTagName('html')[0].style.fontSize = window.innerWidth / 10 + 'px';

这里为什么要除以10呢,其实这个值是随便定义的,因为不想让html的font-size太大。可是有没有发现如果这样计算的话,我们按照的设计稿的像素来制作还是会有出入的。所以,就接下来有了这个办法:

var baseWidth = 750,
    baseFontSize = 100;
document .getElementsByTagName('html')[0].style.fontSize = window.innerWidth / baseWidth * baseFontSize + 'px';

看懂了吗,没看懂的我来解释一下,看懂的就跳过。
我们现在有一个标准,就是设计稿。宽为750px,我们设根元素HTML的font-size为100px,这以便于后续测量后好计算,而事实上,很多都是以100为标准的。
现,我们有,标准版width750px,html{font-size:100px;},一部不知名手机,width = window.innerWidth,那么,现在有个问题,这个不知名的手机的HTML里面的font-size相应为多少?很简单的一道数学题。

750                         width
100px                         ?

? = width/750 *100       width/750其实就是该不知规格的手机与标准的比率。也就是说,标准的100px,对应了实用手机的1rem。那在psd中,我们所测量的所有的宽高长度,只要除以100,都是实际我们写在css里的以rem为单位的长宽高。
最后,让我们完善它:

<head>
    <script type="text/javascript">
        /*动态调整rem值,除以100*/
        function setsize() {
          var winW = document.documentElement.clientWidth,
              winH = document.documentElement.clientHeight,
            baseFontSize = 100,
            baseWidth = 750,
            winWidthSize = Math.min(winW, winH);
          if (winWidthSize < 270) {
            winWidthSize = 270;
          }
          var _html = document.getElementsByTagName('html')[0];
          _html.style.fontSize =winWidthSize / baseWidth * baseFontSize + 'px';
        }
        setsize();
    </script>
</head>
切记:既然是JS代码,为了避免造成因为动态设置<html>元素的font-size而造成页面抖动,一般这部分代码我们放在header底部去加载,并内联到html文档里面。
四、这里收录一个从博客里面看到的方法:

我们知道,一般我们获取到的视觉稿大部分是iphone6的,所以我们看到的尺寸一般是双倍大小的,在使用rem之前,我们一般会自觉的将标注/2,其实这也并无道理,但是当我们配合rem使用时,完全可以按照视觉稿上的尺寸来设置。

1 设计给的稿子双倍的原因是iphone6这种屏幕属于高清屏,也即是设备像素比(device pixel ratio)dpr比较大,所以显示的像素较为清晰。

2 一般手机的dpr是1,iphone4,iphone5这种高清屏是2,iphone6s plus这种高清屏是3,可以通过js的window.devicePixelRatio获取到当前设备的dpr,所以iphone6给的视觉稿大小是(*2)750×1334了。

3 拿到了dpr之后,我们就可以在viewport meta头里,取消让浏览器自动缩放页面,而自己去设置viewport的content例如(这里之所以要设置viewport是因为我们要实现border1px的效果,加入我给border设置了1px,在scale的影响下,高清屏中就会显示成0.5px的效果)

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)

在iphone6下的例子:

我们使用动态设置viewport,在iphone6下,scale会被设置成1/2即0.5,其他手机是1/1即1.

meta.setAttribute('content', 'initial-scale=' + 1/dpr + ', maximum-scale=' + 1/dpr + ', minimum-scale=' + 1/dpr + ', user-scalable=no');

我们的css代码,注意这里设置了1px的边框

.con {
            margin-top: 200px;
            width: 5.3rem;
            height: 5.3rem;
            border-top:1px solid #000;
 }

参考资料:移动web适配利器-rem:http://www.alloyteam.com/2016/03/mobile-web-adaptation-tool-rem/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容

  • 婆婆跟我说:你来我家绝对不会亏待你。从那天起婆婆一直践守着她的诺言,视我如女儿。 (一) 每天早上,婆婆就在楼下叫...
    夏娃恋月阅读 1,973评论 21 38
  • 今天妈妈去随礼, 家里只留我自己。 热菜热饭放锅里, 暖暖母爱谁能比? 妈,不论你走到哪里,你都牵挂着我!太爱你了!
    旖旎i阅读 258评论 6 7
  • 我曾踩着斑斓的梦俯瞰渺小 也曾蹲在阴暗角落里和乞丐诉衷肠 曾想用心跳纪录樱花下落的速度 想把一个昏睡的女人写...
    堇临z阅读 271评论 0 5