本文同步发布于个人我的博客上 - vw+rem移动端自适应布局css
不论是面试仍是工做过程当中,移动端的布局都比较常见,而移动端适配方法也是多种多样。通常来讲,主要仍是从viewport、rem、百分比几个点下手。html
通常来讲,开发过程当中,咱们但愿可以直接按照设计图来开发,无论设计图是两倍仍是三倍图,可以直接写设计图尺寸而不须要换算,同时有高质的设计图还原度,想一想都比较爽。git
这里介绍一种使用vw和rem来布局的方案。github
该方案思路主要是,设置视口宽度为设备宽度,使用vw来动态设置根元素的font-szie,同时使用sass的css function来实现设计尺寸转rem的功能,从而实现一套不须要js计算而自动设置根元素font-szie的rem布局。面试
不了解vw的同窗能够了解一下vw。vw表示当前视口宽度的百分之一。vim
rem布局过程当中依赖于根元素的font-size属性,而若是设置一个固定的font-size,再使用rem来布局,会致使小屏手机视觉上以为网页被放大,而大屏手机上则显得网页布局稀疏。sass
因此我们须要根据收据的屏幕大小等比的设置font-size,从而实现大小屏手机视觉一致的效果。实现这个功能可使用js在页面载入时,读取屏幕宽度,再根据设计图标准宽度作一些转换。布局
而使用vw自然就是一个根据屏幕宽度来作计算的长度单位,完美实现以上js计算功能。同时在移动端,vw的兼容性还不错,彻底能够直接使用。post
计算方法:字体
// 设计图标准根元素字体 / 设计图标准宽度 * 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以后显示效果就不错了。
设计图的设计尺寸通常都是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); }
这样完成了一个简单好用的移动端布局了~~