移动端为什么要做适配

移动端相对PC端来说大部分浏览器内核都是基于Webkit的,所以大部分都支持CSS3的最新语法。但是由于手机的屏幕尺寸和分辨率都不太一样(尤其是安卓),所以不得不对不同分辨率的手机做适配来达到近似的展示效果。

一般来说,UI只会给我们提供一份设计图,目前比较多的是参考手机淘宝的方案给一份750px宽的设计稿,而我们前端要做的就是在不同分辨率的手机上以同样的效果展示这份设计稿。

在讲适配方案之前,有几个基本的移动端开始相关的知识点得了解一下

  • rem单位: 说到rem这个单位就不得不提一下在它之前出现的一个类似单位em,em时相对于父级font-size的相对单位,而rem是相对于根节点html的相对单位,也就是说,当html的font-size为12px时,某一个元素的font-size设为1rem也就是等同于12px了。正因为rem单位的这一特性,从而让它可以成为移动端适配的一个关键单位。
  • vw单位:相对于视窗的宽度,视窗宽度是100vw,与整个单位类似的是wh,就是视窗高度,视窗高度时100vh。更详细的特性可以参考视区相关单位vw, vh..简介以及可实际应用场景
  • 物理像素: 也可以说是设备无关像素,例如iPhone6的分辨率(750x1334)指的是物理像素
  • 逻辑像素: 是浏览器使用的抽象单位,状态是可变的,例如在PC浏览器调试面板上我们可以看到iPhone6的物理像素为(375x667)
  • 物理像素与逻辑像素的关系就是设备像素缩放比dpr

适配思路

1、使用CSS的@media媒体查询设置在不同屏幕尺寸下现实不同的效果,类似于这样:

@media only screen and (min-width: 375px) {
.logo {
width : 62.5px;
}
} @media only screen and (min-width: 360px) {
.logo {
width : 60px;
}
} @media only screen and (min-width: 320px) {
.logo {
width : 53.3333px;
}
}

首先,这样只照顾了固定分辨率的机型,肯定是不够的,而且,如果针对页面上的每一个元素写这么多套适配也不现实,媒体查询还是比较适合PC端不同分辨率屏幕之间的适配。

2、使用css的单位rem,类似于这样:

@media only screen and (min-width: 375px) {
html {
font-size : 62.5px;
}
} @media only screen and (min-width: 360px) {
html {
font-size : 60px;
}
}

当然,在实际开发中不可能真的这样去写,既然上面已经提到了rem这一单位的特性,那么我们要做的就是根据不同分辨率的设备动态地改变html的font-size就好,也就是1rem代表的大小。比较常见的有两种方案:

  • 通过js动态获取屏幕的宽度,从而计算出html的font-size,还是拿日常开发常见的750px的设计稿为例:
let htmlWidth = document.documentElement.clientWidth || document.body.clientWidth;
let htmlDOM = document.getElementsByTagName('html')[0];
htmlDOM.style.fontSize = htmlWidth / 7.5 + 'px'; window.addEventListener('resize', (e) => {
let htmlWidth = document.documentElement.clientWidth || document.body.clientWidth;
htmlDOM.style.fontSize = htmlWidth / 7.5 + 'px';
})

这样一来,在375px宽的设备下,html的font-size就是50px,为什么要除以7.5呢,因为这样设计稿上的数值与需要得到的rem值正好是100倍的关系,这样便于换算,当然,引入了scss等预处理工具之后,取多少都不重要了,反正用一个处理函数统一转化一下就可以了,当html的font-size是37.5的时候:

@function px2rem ($px) {
$rem: 75;
@return ($px / $rem) + rem;
}
  • 另一种方案同样是通过vw这一单位实现rem适配

    • 上面那种方案说白了就是通过JS动态改变html的font-size的大小,而现在有这么一种单位本身的大小就会随着屏幕的变化而变化,那岂不是省去了JS操作Html字体大小的代码!
    • 我最开始有点担心的是兼容性,不过从caniuse上查的的兼容性上来看兼容性还是比较高的,安卓版本大于4.0的浏览器都是兼容的的。尤其对于在微信上使用的H5页面是完全不用担心兼容性问题的
    • 具体实现如下:
    /*
    当在Ip6下时,100vw代表375px,而视觉稿一般是750px,为了方便算,当html上的1rem代表50px时,
    视觉稿上的像素跟rem就存在了100倍的转化关闭,而此时1vw代表是3.75px,所以html上的font-siez为50/3.75,
    约等于13.33333vw,这样即使不用scss也是比较利于换算的
    */
    html {background-color: #eee; font-size: 13.33333vw;}

    设为上面这样一个数值同样是为了计算方便,当然不是必须的,在这样一个数值下,相对应的元素除以100就可以了,写成scss方法如下

    @function px ($px) {
    @return ($px / 100) + rem;
    }
    .demo2 {width: px(200); height: px(200); background-color: #ddd;}

    我看了一下网易新闻的h5页面目前就是使用的这种方案

总结

最开始想写这篇文章是因为之前只知道通过JS动态调节html的font-size这么一种适配方案,刚好前段时间接触到了公司的一个移动端项目,我只是单独开发几个页面,但我发现是用的vw单位实现的rem方案,刚开始还觉得蛮新奇的,其实后来查资料仔细一想,跟JS那种方案本质上并没有什么区别,都是以屏幕宽度作为底,动态地调节了html的font-size,也就是1rem的大小。

为了写这篇文章又回看了慕课网上这个视频:移动web开发适配秘籍Rem,真的挺感谢这些大牛无私分享的。就像他所说的,移动web开发适配的方案有许多,然而最好的方案一定要掌握。Rem适配方案是我目前所看到的的使用的最多的,多多了解这种方法背后的原理和熟练掌握这种方法还是挺重要的,再次感谢这些大牛的精彩分享,希望我的总结在提升自己的同时也能帮到别人!

参考文章:

移动web开发适配方案之Rem的更多相关文章

  1. 移动web屏幕适配方案

    刚进部门就被拉去趟移动端Web的浑水,视觉稿是按照640px设计的.那如何做屏幕适配呢?当然想到的第一方法就是问前辈了,问他们之前怎么做的,前辈说直接按视觉稿来,我说640太大了,他说除以2啊,按32 ...

  2. 移动web开发适配rem

    移动的meta标签 <meta  name="viewport" content="width=device-width, initial-scale=1,user ...

  3. 移动端适配方案以及rem和px之间的转换

    背景 开发移动端H5页面 面对不同分辨率的手机 面对不同屏幕尺寸的手机 视觉稿 在前端开发之前,视觉MM会给我们一个psd文件,称之为视觉稿. 对于移动端开发而言,为了做到页面高清的效果,视觉稿的规范 ...

  4. 移动端适配方案(rem+flex)

    为什么用rem不用px? 主流:各大网站的移动版绝大多数都是用的rem.   移动端屏幕分辨率差别太大:最低适配的iPhone6,分辨率仅为750*1334.而现在市面上大多数手机,都达到了1080* ...

  5. java web开发缓存方案,ehcache和redis哪个更好

    Ehcache在java项目广泛的使用.它是一个开源的.设计于提高在数据从RDBMS中取出来的高花费.高延迟采取的一种缓存方案.正因为Ehcache具有健壮性(基于java开发).被认证(具有apac ...

  6. 移动端 移动web屏幕适配方案 随不同宽度的屏幕而改变

    链接地址1:http://www.cnblogs.com/zjzhome/p/4802157.html 链接地址2:http://www.html-js.com/article/Mobile-term ...

  7. 移动端Web页面适配方案

    概念理解 viewport视口 visual viewport 可见视口,设备屏幕的宽度  windw.innerWidth/Height layout viewport 布局视口,DOM宽度 doc ...

  8. web主题适配方案指北

    前置知识 在这里了解实现网页主题切换的相关知识. CSS 变量 要实现主题切换需要了解一点 css 自定义属性.当然,本文还提供了其他实现方式,为了不给您接下来的阅读带来阻碍,先了解它. 变量的声明 ...

  9. 移动web开发之布局

    移动web开发流式布局 1.0 移动端基础 1.1浏览器现状 PC端常见浏览器:360浏览器.谷歌浏览器.火狐浏览器.QQ浏览器.百度浏览器.搜狗浏览器.IE浏览器. 移动端常见浏览器:UC浏览器,Q ...

随机推荐

  1. 【Python】Python 读取csv的某行或某列数据

    Python 读取csv的某行 转载 2016年08月30日 21:01:44 标签: python / csv / 数据   站长用Python写了一个可以提取csv任一列的代码,欢迎使用.Gith ...

  2. 第1章 1.6计算机网络概述--OSI参考模型

    ISO七层模式:国际标准组织对互联网通信规则进行的定义. 7.应用层:所有能产生网络流量的程序,如:QQ. 6.表示层:传输前对数据进行进行处理,是一种数据处理的规则,如:加密.压缩.传输二进制(图片 ...

  3. 分页组件vue和jsp版本

    vue版本 <template> <div class="com-vscroll"> <slot name="mcontent"& ...

  4. Flask添加翻页功能(非sqlalchemy)

    最近做flask的项目,需要增加翻页的功能,网上找的教程都是结合sqlalchemy的,可是我用的不是sqlalchemy,肿木办呢? 以下是我的做法 一.前端 1.传递页码 前端我使用ajax提交表 ...

  5. bzoj2733 / P3224 [HNOI2012]永无乡(并查集+线段树合并)

    [HNOI2012]永无乡 每个联通块的点集用动态开点线段树维护 并查集维护图 合并时把线段树也合并就好了. #include<iostream> #include<cstdio&g ...

  6. c++标准库vector&list使用练习

    /* vector顺序存储,随机访问快 list链表存储,插入删除快 deque占用内存多,兼具两者优点 注意: 1.vector严格顺序存储 2.list的迭代器只能做++或--运算,要一次移动多个 ...

  7. 20155201 2016-2017-2 《Java程序设计》第二周学习总结

    20155201 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 编译运行P55各种类型可储存的数值范围代码,截图: 常用格式控制符: 符号 说明 %% 表示 ...

  8. 20145326 《Java程序设计》第4周学习总结

    20145326 <Java程序设计>第4周学习总结 教材学习内容总结 第六章 一.何谓继承 1.继承共同行为 面向对象中,子类继承父类,避免重复的行为定义.不过并非为了避免重复定义行为就 ...

  9. uboot 版本号生成过程

    uboot 版本号生成过程 uboot版本号貌似与实际开发不相关,但是我现在遇到一个bug与版本号关联密切. 这个bug与<uboot dm9000驱动故障>基本上是一样的,但是在上一篇博 ...

  10. 【转】Linux系统平均负载3个数字的含义

    文章作者:姜南(Slyar) 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作. 越来越多人开始接触Linux操作系统,从VPS到无线路由的刷机系统(如OpenWR ...