[TOC]
# 前言
目前 ios8、安卓 4.4 以下的用户已经非常少了,caniuse 上面显示,在中国这部分用户只有 1.2%,比例已经非常低了,而这部分用户的手机估计只会打打电话不会使用互联网的(还是需根据各自产品的用户数据分析来决定是否使用 `vw`)。
如果你的页面只适用于微信、qq,那绝对能放心使用`vw`单位,还可以配合`vh`针对一些特殊比例屏幕做处理,彻底摆脱使用`rem`带来的副作用(与`font-size`强耦合会引发副作用,`vw`布局相较之下更纯粹代码逻辑也更清晰),删掉 html 头部计算`font-size`的那段 js 代码,让你的代码更纯粹。
# 使用`vw`布局页面
设置 meta 为移动端:
~~~
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
~~~
(以下都以 iPhone 6 的尺寸为例)
方案一(用 sass 比较方便):
最简单的方案就是所有的布局元素及属性都用`vw`来做单位,对应关系是:
设计稿 `750px —> 100vw`
那我们书写时计算:`(x/750)*100vw`
sass:
```
$vw_base: 750;
@function vw($px) {
@return ($px / 750) * 100vw;
}
```
方案二:
沿用 rem 布局方案,所有的布局元素及属性都用 rem 做单位,用 vw 单位给 html 设置 font-size 形成 “流单位”,这样就不再需要 JS 来动态计算根元素字体大小。
如果以前你习惯了约定`750px`设计稿的根元素字体大小为`100px`的话,你可以直接设置:
```
// 750px设计稿
html{
font-size: 13.3333vw;//(100px/750px)*100vw
}
//640px设计稿
html{
font-size: 15.625vw;//(100px/640px)*100vw
}
//1080px设计稿
html{
font-size: 9.25926vw;//(100px/1080px)*100vw
}
```
也可以通过 css 的计算函数自动计算配置:
```
/* 设计稿宽度为750px,根字号为100px */
:root{
--psd: 750;
--rfs: 100;
}
html{font-size: calc(100vw / var(--psd) * var(--rfs));}
@media screen and (min-width: 750px) {
html{font-size: 100Px;}
body{width: 750px;}
}
body{
max-width: 750Px;
margin: 0 auto;
}
```
方案三:
vm 结合 rem 单位来实现布局?rem 弹性布局的核心在于动态改变根元素大小,那么我们可以通过:
1. 给根元素大小设置随着视口变化而变化的 vw 单位,这样就可以实现动态改变其大小。
2. 限制根元素字体大小的最大最小值,配合 body 加上最大宽度和最小宽度
这样我们就能够实现对布局宽度的最大最小限制。
```
// rem 单位换算:定为 75px 只是方便运算,750px-75px、640-64px、1080px-108px,如此类推
$vw_fontsize: 75; // iPhone 6尺寸的根元素大小基准值
@function rem($px) {
@return ($px / $vw_fontsize ) * 1rem;
}
// 根元素大小使用 vw 单位
$vw_design: 750;
html {
font-size: ($vw_fontsize / ($vw_design / 2)) * 100vw; //就是相当于20vw
// 同时,通过Media Queries 限制根元素最大最小值
@media screen and (max-width: 320px) {
font-size: 64px;
}
@media screen and (min-width: 540px) {
font-size: 108px;
}
}
// body 也增加最大最小宽度限制,避免默认100%宽度的 block 元素跟随 body 而过大过小
body {
max-width: 540px;
min-width: 320px;
}
```
# 示例页面
https://jdc.jd.com/demo/ting/vw_rem_layout.html
[http://meeting.bioon.com/moyan/index.html#/?from=native](http://meeting.bioon.com/moyan/index.html#/?from=native)
[https://huodong.m.taobao.com/act/layouttestvw.html](https://huodong.m.taobao.com/act/layouttestvw.html)
# 方案进化总结
[再聊移动端页面的适配](https://www.cnblogs.com/zhouyangla/p/9273700.html)
[如何在 Vue 项目中使用 vw 实现移动端适配](https://www.cnblogs.com/yikuu/p/9052148.html)
[在 create-react-app 项目中使用 vw 实现手淘 vw 移动端适配布局](https://juejin.im/post/5a70742c6fb9a01cbc6eaffb)
[如何利用vw+rem进行移动端布局](https://juejin.im/post/5b29f476e51d455892718380)
[细说移动端 经典的 REM 布局 与 新秀 VW 布局](https://www.cnblogs.com/imwtr/p/9648233.html)
[rem,*vw*, 还是...? 各凭本事的移动端适配方案](https://juejin.im/post/5bc07ebf6fb9a05d026119a9)
[认识视口单位 vm、vh 在网页中的排版应用](http://caibaojian.com/viewport-based-typography.html)
[vue 移动端 h5 适配解决方案(rem or vw)](https://juejin.im/post/5d54c80bf265da03ae786e9b)
[H5 移动端页面适配解决方案 vw](https://www.jianshu.com/p/5182ff995776)
[纯CSS3使用vw和vh视口单位实现自适应](http://caibaojian.com/vw-vh.html)
[不要再问我移动适配的问题了](https://segmentfault.com/a/1190000017784801)
[移动端页面适配———多方案解析](https://www.jianshu.com/p/3b45aa981e77)
- 前言
- 中文字体
- 移动Web适配方案
- !移动Web基础!
- 详解适配相关概念
- 移动开发之设计稿
- 移动适配方案(一)
- 移动适配方案(二)
- vw+rem 实现移动端布局
- 移动端适配之雪碧图(sprite)背景图片定位
- 适配 iPhoneX
- 前端开发实战
- 打造自己的前端开发流程(Gulp)
- flexible.js案例讲解
- viewport 与 flexible.js解读
- 图片与字体
- 踩过的坑
- 浏览器默认样式
- 300ms点击延迟和点击穿透
- ios css
- CSS 常见问题
- Ionic v1混合开发
- Native App、Web App 、Hybrid App?
- ionic项目结构
- 混淆加密
- 解决问题
- cordova
- 环境配置
- 打包发布
- 问题
- 移动前端开发优化
- Web开发之抓包
- ===web移动开发资源===
- H5组件框架
- 调试集合
- 简单h5调试
- whistle
- devtools-pro