移动端适配的相关概念以及几种方案总结

适配相关概念

  1. 布局视口(layout viewport):html元素的上一级容器即顶级容器,用于解决页面在手机上显示的问题。大部分移动设备都将这个视口分辨率设置为980px,所以PC上的网页基本上能在手机上呈现,只不过看上去很小,一般默认可以通过手动缩放网页。获取当前布局视口用document.documentElement.clientWidth
  2. 视觉视口(visual viewport):指用户可见页面区域,即屏幕显示器的物理像素。获取当前的视觉视口可以用window.innerWidth
  3. 理想视口(ideal viewport):也就是我们通常说的屏幕分辨率。比如Iphone5屏幕分辨率是320。

使用viewport元标签控制布局

如下的viewport元标签的属性
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no">

以下是每个属性的介绍:

属性名 取值 描述
width 正整数或device-width 定义layout viewport的值
height 正整数或device-height 定义viewport height,单位为像素,一般不用
initial-scale [0,0 - 10.0] 定义初始缩放值。比如:设置initial-width=1.5 就是将visual viewport设置成ideal viewport宽度的1 /1.5倍
maximum-scale [0.0 - 10.0 ] 用户能够放大的最大比例
minimum-scale [0,0 - 10.0] 用户能缩小的最小比例,一般不设置,因为太小的字不方便阅读
user-scalable yes/no 定义是否允许用户手动缩放页面,默认值为yes

width的详细介绍:设置为device-width时表示layout viewport的宽度等于ideal viewport的值。同时设置widthintital-scale时,最终的视口宽度等于两者较大的那一个。也就是说:

  1. layout viewport小于visual viewport时,视口宽度最终是visual viewport的值(经测试,layout viewport的值也会自动变成visual viewport
  2. layout viewport大于visual viewport时,视口宽度最终是layout viewport的值(经测试,visual viewport的值不会变成这时layout viewport的值)

initial-scale的详细介绍:缩放比例 = ideal layout / visual layoutideal viewport是不会改变的,这个值是为了改变visual viewport。缩放比例也有默认值,没有设置initial-scale时,浏览器会取适当的缩放比例使布局视口正好铺满屏幕即有 可视视口(visual viewport)尺寸=理想视口尺寸(ideal viewport)。也就是说设置width=device-width与设置initial-scale=1.0效果相同。

方案

  1. 荔枝FM的方案:将layout viewport定义为设计稿的宽度,这样的好处在于css像素对应设计稿的px(以640px为例),不需要进行单位换算。但是有几点需要注意的地方。

    1. 为了保证最终的视口的值都是640px,而不会变成其他值(前面说过,最终视口的值会取width与initial-scale属性的最大值)。要把visual viewport设置成与layout viewport一样大,即设置initial-scale的值为 ideal viewport / 640。之前也有一个属性代替了这个操作,target-densitydpi=device-dpi,但资料显示target-densitydpi=device-dpi是一个被抛弃的属性,不推荐使用
  2. 网易的纯REM方案:
    1. 采用理想视口作为可视视口的尺寸,只需要把缩放比定为1。<meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1, minimum-scale=1, user-scalable=no">
    2. 计算 html 元素的 font-size

      750px 是设计稿的宽度(以iphone6的物理像素数为标准),100是期望的换算比例,即设计稿中 100px 的长度对应css中 1rem,将设计稿中的长度数值除以 100 得到的就是以 rem 为单位的 css 长度的数值,设计稿的宽换算为以 rem 为单位的 css 长度应为 (750/100) rem,同时设计稿的宽对应可视视口的宽,即有 (750/100) rem = 可视视口宽,1 rem = 可视视口宽 * (100/750),(100/750)就是我们要的系数

    在页面初始化时设置一下 html 元素的 font-size:

    document.documentElement.style.fontSize = window.innerWidth / 7.5 + 'px';

  3. 最后一种方案也是最合理的---来自于手淘的最佳实践
    1. 以上两种方案都存在一个问题,就是在retina屏幕上没有处理dpr(device pixel ratio)的副作用,何为dpr物理像素 / 设备独立的像素(ideal viewport)。在JS中可以通过window.devicePixelRatio获取当前设备的dpr
    2. 为何要处理dpr:在retina屏幕上,物理像素会被放大为原本的dpr倍。这时候就会存在以下几个问题
      • 图片变模糊了
      • border: 1px问题,边框自然会被放大为dpr
      • ...
    3. 解决方案:使用initial-scale=1/dpr对含有px单位的元素做处理,但是单纯这么做会导致字体元素的大小都会缩小。如何解决这个问题呢?答案就是在第二种方案的根元素设置fontSize的基础上再乘以一个dpr,这样对于以rem衡量的元素又能正常适配了。

参考阅读:

Web移动端适配总结的更多相关文章

  1. web移动端适配方案

    web移动端常用解决方案: 一.通过js+rem,这里有一个解决方案(http://imochen.github.io/hotcss/) 1.1.rem兼容性(https://caniuse.com) ...

  2. 浅谈web移动端适配问题

    一.布局方案 目前在解决移动端页面适配问题方案选择上,目前用得比较多是百分比布局,弹性布局flex,rem布局,本文将重点跟大家探讨rem布局. 二.viewport 在介绍rem布局之前,首先跟大家 ...

  3. web移动端适配

    /*** html节点字体大小随屏幕大小改变 用于rem布局***/首先这是一个立即执行函数(function (doc, win) { var docEl = doc.documentElement ...

  4. 移动端web页面如何适配

    移动端web页面如何适配,现有两个方案: 1 设置viewport进行缩放 简单粗暴,使用过程中反应缩放会导致有些页面元素会糊的情况.天猫的web app的首页使用这种方案 在页面中加入viewpor ...

  5. web开发中移动端适配

    这个话题有些复杂,说起来有些琐碎,因为和移动端适配相关的问题太多了. 1. 概念 1.1 设备像素 设备像素被称为物理像素,它是显示设备中一个最小的物理部件.每个像素可以根据操作系统设置自己的颜色和亮 ...

  6. web前端--移动端适配总结

    转自:https://segmentfault.com/a/1190000011586301 作者:Devinnn meta标签到底做了什么事情 做过移动端适配的小伙伴一定有遇到过这行代码: < ...

  7. 【转载】Web移动端Fixed布局的解决方案

    特别声明:本文转载于EFE的<Web移动端Fixed布局的解决方案>.如需转载,烦请注明原文出处:http://efe.baidu.com/blog/mobile-fixed-layout ...

  8. 移动端适配单位rem

    0 写在前面 本周惊喜地发现,其他各个老师的软工班(罗杰老师班和欧阳老师班)的软工项目的alpha版本都已经发布了!(然而我们软工项目还没开始写代码…逃…) 十分好奇的我第一时间下载了一些他们的产品进 ...

  9. 移动端适配之雪碧图(sprite)背景图片定位

    为了减少网络请求个数量,提高网站的访问速度,我们一般都会把一些小的图片合并成一张sprite图,然后根据background-position来进行定位.在web端由于是固定的大小与left .top ...

随机推荐

  1. 在 HTML5 中捕获音频和视频

    简介 长久以来,音频/视频捕获都是网络开发中的"圣杯".多年来,我们总是依赖于浏览器插件(Flash 或 Silverlight)实现这一点.快来看看吧! 现在轮到 HTML5 大 ...

  2. 【python学习笔记】9.魔法方法、属性和迭代器

    [python学习笔记]9.魔法方法.属性和迭代器 魔法方法:xx, 收尾各有两个下划线的方法 __init__(self): 构造方法,创建对象时候自动执行,可以为其增加参数, 父类构造方法不会被自 ...

  3. centos7 升级 git(2.14.3) 版本

    下载  wget https://www.kernel.org/pub/software/scm/git/git-2.14.3.tar.gz 安装依赖包  yum install curl-devel ...

  4. 元素化设计原理及规则v1.0

    一.元素设计架构 元素设计架构展示在基于元素化设计的思想下,系统各元素之间如何相互协作,并完成整个系统搭建. 架构中以Entity(数据)为中心,由Entity产生数据库表结构,并且Entity作为业 ...

  5. const 相关知识 const和指针、const和引用

    以前老是对const概念不清不楚,今天算是好好做个笔记总结一下.以下内容包括1)常量指针(指针本身是常量),2)指针常量(指针指向的是常量对象),3)常量引用,4)const成员函数. 常量指针,指针 ...

  6. RTC实时时间系统学习笔记(一)---------------UART串口

    临近研三了,自己倾向于要找数字IC方面的工作,苦于教研室的项目一直都是调板子调板子调板子,真正用到FPGA的很少,,本着"工欲善其事必先利其器"的原则,在网上搜寻如何自学FPGA, ...

  7. SpringBoot中MongoDB注解概念及使用

    spring-data-mongodb主要有以下注解 @Id 主键,不可重复,自带索引,可以在定义的列名上标注,需要自己生成并维护不重复的约束.如果自己不设置@Id主键,mongo会自动生成一个唯一主 ...

  8. js网页判断移动终端浏览器版本信息是安卓还是苹果ios,判断在微信浏览器跳转不同页面,生成二维码

    一个二维码,扫描进入网页,自动识别下载苹果和安卓客户端,判断网页如下,(只有苹果的微信不能自动跳转)所以加个微信判断. <!DOCTYPE html> <html> <h ...

  9. 使用 Except 和 Intersect

    做了一个如下的小厕所,如果我需要得到返回是 d,f 那我需要用那组语句呢? A: ;WITH CA AS( SELECT * FROM (VALUES('a'),('b'),('c'),('d'))a ...

  10. [日常] Codeforces Round #440 Div.2 大力翻车实况

    上次打了一发ABC然后大力翻车...上午考试又停电+Unrated令人非常滑稽...下午终于到了CF比赛... 赛前大力安利了一发然后拉了老白/ $ljm$ / $wcx$ 一起打, 然后搞了个 TI ...