flexible
后,在页面上统一使用 rem
来布局)核心代码:css
function setRemUnit () {html
var rem = docEl.clientWidth / 10函数
docEl.style.fontSize = rem + 'px'布局
}post
setRemUnit();flex
rem
是相对于 html
节点的 font-size
来作计算的。spa
咱们经过设置 document.documentElement.style.fontSize
就能够统一整个页面的布局标准。插件
上面的代码中,将 html
节点的 font-size
设置为页面 clientWidth
(布局视口)的 1/10
,即 1rem
就等于页面布局视口的 1/10
,这就意味着咱们后面使用的 rem
都是按照页面比例来计算的。设计
这时,咱们只须要将 UI
出的图转换为 rem
便可。code
以 iPhone6
为例:布局视口为 375px
,则 1rem=37.5px
,这时 UI
给定一个元素的宽为 75px
(设备独立像素),咱们只须要将它设置为 75/37.5=2rem
。
固然,每一个布局都要计算很是繁琐,咱们能够借助 PostCSS
的 px2rem
插件来帮助咱们完成这个过程。
下面的代码能够保证在页面大小变化时,布局能够自适应,当触发了 window
的 resize
和 pageShow
事件以后自动调整 html
的 fontSize
大小。
window.addEventListener('resize', setRemUnit)window.addEventListener('pageshow', function (e) {
if (e.persisted) {
setRemUnit()
}
})
vh、vw
方案即将视觉视口宽度 window.innerWidth
和视觉视口高度 window.innerHeight
等分为 100 份。
上面的 flexible
方案就是模仿这种方案,由于早些时候 vw
尚未获得很好的兼容。
vw(Viewport's width)
: 1vw
等于视觉视口的 1%
vh(Viewport's height)
: 1vh
为视觉视口高度的 1%
vmin
: vw
和 vh
中的较小值
vmax
: 选取 vw
和 vh
中的较大值
若是视觉视口为 375px
,那么 1vw=3.75px
,这时 UI
给定一个元素的宽为 75px
(设备独立像素),咱们只须要将它设置为 75/3.75=20vw
。
这里的比例关系咱们也不用本身换算,咱们可使用 PostCSS
的 postcss-px-to-viewport
插件帮咱们完成这个过程。写代码时,咱们只须要根据 UI
给的设计图写 px
单位便可。
固然,没有一种方案是十全十美的, vw
一样有必定的缺陷:
px
转换成 vw
不必定能彻底整除,所以有必定的像素差。
好比当容器使用 vw
, margin
采用 px
时,很容易形成总体宽度超过 100vw
,从而影响布局效果。固然咱们也是能够避免的,例如使用 padding
代替 margin
,结合 calc()
函数使用等等...