通过vw、vh来实现自适应
什么是 vw/vh ?
css3 中引入了一个新的单位 vw
/vh
,与视图窗口有关,vw
表示相对于视图窗口的宽度,vh
表示相对于视图窗口高度,除了 vw 和 vh 外,还有 vmin
和 vmax
两个相关的单位。各个单位具体的含义如下:
单位 | 含义 |
---|---|
vw | 相对于视窗的宽度,视窗宽度是100vw |
vh | 相对于视窗的高度,视窗高度是100vh |
vmin | vw和vh中的较小值 |
vmax | vw和vh中的较大值 |
这里我们发现视窗宽高都是 100vw
/100vh
,那么 vw 或者 vh,下简称 vw,很类似百分比单位。vw
和 %
的区别为:
单位 | 含义 |
---|---|
% | 大部分相对于祖先元素,也有相对于自身的情况比如(border-radius、translate等) |
vw/vh | 相对于视窗的尺寸 |
从对比中我们可以发现,vw 单位与百分比类似,单确有区别,前面我们介绍了百分比单位的换算困难,这里的 vw 更像"理想的百分比单位"。任意层级元素,在使用 vw 单位的情况下,1vw 都等于视图宽度的百分之一。
vw 单位换算
同样的,如果要将 px
换算成 vw
单位,很简单,只要确定视图的窗口大小(布局视口),如果我们将布局视口设置成分辨率大小,比如对于iphone6/7 375*667
的分辨率,那么 px 可以通过如下方式换算成 vw:
1px = (1/375)*100 vw
此外,也可以通过 postcss
的相应插件,预处理 css 做一个自动的转换,postcss-px-to-viewport
可以自动将 px
转化成 vw
。
postcss-px-to-viewport
的默认参数为:
var defaults = {
viewportWidth: 320,
viewportHeight: 568,
unitPrecision: 5,
viewportUnit: 'vw',
selectorBlackList: [],
minPixelValue: 1,
mediaQuery: false
};
通过指定视窗的宽度和高度,以及换算精度,就能将 px
转化成 vw
。
vw/vh 单位的兼容性
可以在 https://caniuse.com/ 查看各个版本的浏览器对 vw
单位的支持性。
从上图我们发现,绝大多数的浏览器支持 vw
单位,但是 ie9-11
不支持 vmin
和 vmax
,考虑到 vmin
和 vmax
单位不常用,vw
单位在绝大部分高版本浏览器内的支持性很好,但是 opera
浏览器整体不支持 vw
单位,如果需要兼容 opera
浏览器的布局,不推荐使用 vw
。