本文同步发布于我的个人博客上 – vw+rem 移动端自适应布局
不管是面试还是工作过程中,移动端的布局都比较常见,而移动端适配方法也是多种多样。一般来说,主要还是从 viewport、rem、百分比几个点下手。
一般来说,开发过程中,我们希望能够直接按照设计图来开发,不管设计图是两倍还是三倍图,能够直接写设计图尺寸而不需要换算,同时有高质的设计图还原度,想想都比较爽。
这里介绍一种使用 vw 和 rem 来布局的方案。
该方案思路主要是,设置视口宽度为设备宽度,使用 vw 来动态设置根元素的 font-szie,同时使用 sass 的 css function 来实现设计尺寸转 rem 的功能,从而实现一套不需要 js 计算而自动设置根元素 font-szie 的 rem 布局。
vw
不了解 vw 的同学可以了解一下 vw。vw 表示当前视口宽度的百分之一。
rem 布局过程中依赖于根元素的 font-size 属性,而如果设置一个固定的 font-size,再使用 rem 来布局,会导致小屏手机视觉上觉得网页被放大,而大屏手机上则显得网页布局稀疏。
所以咱们需要根据收据的屏幕大小等比的设置 font-size,从而实现大小屏手机视觉一致的效果。实现这个功能可以使用 js 在页面载入时,读取屏幕宽度,再根据设计图标准宽度做一些转换。
而使用 vw 天然就是一个根据屏幕宽度来做计算的长度单位,完美实现以上 js 计算功能。同时在移动端,vw 的兼容性还不错,完全可以直接使用。
计算方法:
// 设计图标准根元素字体 / 设计图标准宽度 * 100
const vw = 16 / 750 * 100
例如,设计图以 6s 为标准,2 倍尺寸,宽度 750px,而你设置根元素字体大小为 16px,那么计算出的 vw 就是 2.13333vw,直接在 css 中设置:
html {font-size: 2.13333vw;}
这个时候,我们在标准宽度下根元素实际字体大小是 16px,如果到 5s 手机上面,则根元素实际字体大小为 13.653px。根元素的字体大小变了,页面中使用 rem 来设置的边距、长度、字体大小都会发现改变,页面看起来像是缩小了一点点,但是所有的布局跟 6s 都是一样的。
6s 显示效果:
5s 显示效果:
可以看到效果是一致的,换行、截断都显示一致,视觉效果也是一致的。
横屏显示
我们日常使用中,手机都是竖屏显示的,但是也会有横屏显示的时候。如果横屏显示,那么手机的宽度就变成了长度,长度就变成了宽度了,这个时候 vw 就显示的不对了。看下图,虽然显示没有乱,但是字变的很大了,复杂情况下布局估计也乱了。
还好有应对方法:vmin,这个属性表示视口宽度中最小的那个,竖屏下是 vw,横屏下是 vh。设置了 vim 之后显示效果就不错了。
自动转换 rem
设计图的设计尺寸一般都是 2 倍或者 3 倍,如果此时咱们自己转换成一倍的再去根据根元素计算 rem 那也太累了。
比如 2 倍设计图上面的 56px,那么咱们需要:56 / 2 / 16
,心态崩溃~~~
算是不可能自己算的,找插件呗,这个轮子早就被造好了,postcss-pxtorem 就是专门来干这个事情的,配置好设计尺寸,设计倍数,然后 css 里面直接写 56px,插件会自己给你计算成 (56 / 2 / 16)px
,是不是很棒。
加载配置一个插件也挺麻烦的,如果你刚好在 sass 之类的 css 预处理器,完全可以使用 sass function 来自动计算。
$rootSize: 16px!default;
$designWidth: 750px!default;
$designRatio: 2!default;
@function rem($px) {@return $px / $rootSize / $designRatio * 1rem;}
@function rootVw() {@return $rootSize / $designWidth * $designRatio * 100vmin;}
这样就一次性计算好了根元素 font-size,也可以使用 rem()
来自动计算 rem 了。
html{font-size: rootVw();
}
body{padding: rem(15px);
}
这样完成了一个简单好用的移动端布局了~~