{T}

移动端适配

rem(font size of the root element)是相对长度单位。相对于根元素(即 html 元素)font-size 计算值的倍数

适配原理:将 px 替换成 rem,动态修改 html 的 font-size 适配。它可以很好的根据根元素的字体大小来进行变化,从而达到各种屏幕基本一致的效果体验

常见的设计稿

常见的设计图宽度,当然也可以是其他的宽度,比如 720 像素的

  1. 375 iPhone7
  2. 750 二倍图
  3. 320 iPhone5
  4. 640 二倍图

为什么给的是 375?因为这个是 iPhone7 的宽度,也就是说最低兼容到 375 像素的屏幕(低于 375 布局可能会乱)

vw + rem 方案

如果效果图是 375px 的,html 的 style 属性的 font-size 设置为 26.666666 vw,css 中 20px 改写为 0.2rem 即可

html
<!DOCTYPE html>
<html lang="en" style="font-size: 26.666666vw">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
    <style>
      /* 设置 div 为宽度100px高度18px */
      .app-main {
        width: 1rem;
        height: 0.18rem;
      }
    </style>
  </head>
  <body>
    <div class="app-main"></div>
  </body>
</html>

视口 (viewport) 代表当前可见的计算机图形区域。在 Web 浏览器术语中,通常与浏览器窗口相同,但不包括浏览器的 UI, 菜单栏等——即指你正在浏览的文档的那一部分。

用它来移动端适配,兼容不同的设备,当然不局限于移动端,这里只讨论移动端。只需要在head中定义 <meta name="viewport" content="width=device-width, initial-scale=1.0" />就行

vw

是视口宽度的一个单位,viewport width 的简称,根据 viewport 相关定义

已经定义好了的,PC 端 100vw 就等于浏览器的宽度,移动端 100vw 就是设备的宽度(按照上面的 width=device-width)

vh同理,是视口高度,viewport height 的简称,100vh 就是可视窗口的高度

font-size 设置成 26.666666vw?

假如设计图的宽度为 375px,750 就把 375 换成对应的数值按照以下方法换算就行就行

因为 375px = 100vw,那么 1px = 100/375 vw = 0.26666666666666666vw(约等于), 那么 100 px = 26.666666vw(约等于

所以 1 rem = 100px

优点:不需要引入新的 js,一行代码搞定适配问题缺点:浏览器兼容性差,IE9 以下不支持,但现代浏览器,特别是移动端,基本都支持

设计图大小(单位 px)html 的 font-size(单位 vw)备注
37526.666666效果图 20px,代码应该写 0.2rem
75013.333333效果图 20px,代码应该写 0.2rem
32031.25效果图 20px,代码应该写 0.2rem
64015.625效果图 20px,代码应该写 0.2rem

flexible 方案(阿里)

lib-flexible 的 github 上有着这样的一句话。

由于 viewport 单位得到众多浏览器的兼容,lib-flexible 这个过渡方案已经可以放弃使用,不管是现在的版本还是以前的版本,都存有一定的问题。建议大家开始使用 viewport 来替代此方案。vw 的兼容方案可以参阅《如何在 Vue 项目中使用 vw 实现移动端适配》一文

我们可以得到一个很明确的信息,lib-flexible 这个方案已经被放弃使用了,我们可以去拥抱 vw 的那套实现方案