最近做一个移动端的h5适配,在网上找方案基本上都是使用flexible.js,然后顺理成章我也入了这个坑。

引用flexible.js的方式无外乎cdn引入:

<script src="http://g.tbcdn.cn/mtb/lib-flexible/0.3.2/??flexible_css.js,flexible.js"
></script>

下载文件到本地或者npm安装。

源代码如下:


移动端h5自适应适配之flexible.js打假#私藏项目实操分享#_移动端

在引入之后发现遇到了各种奇怪的问题,比如如果在元素上设置了class指定了元素的大小,那么当屏幕的scale改变时字体会随着scale而变化,再比如在某些安卓手机上dpr或者scale会没有值,导致适配方案失效,这些问题都是因为判断的时候没有考虑到所有的情况,但是网上查到的解决方案全是这样的,难道是我的写法有问题,又或者引入的版本有问题?抱着对自己的怀疑我找了一下午,直到我找到了这个github​​https://github.com/amfe/lib-flexible​​。


移动端h5自适应适配之flexible.js打假#私藏项目实操分享#_安卓手机_02


这里说明了之前的flexible.js已经可以弃用了,而且不管哪个版本都有问题,那么正确的使用方式应该代码中引入如下文件:

(function flexible (window, document) {
var docEl = document.documentElement
var dpr = window.devicePixelRatio || 1
// adjust body font size
function setBodyFontSize () {
if (document.body) {
document.body.style.fontSize = (12 * dpr) + 'px'
}
else {
document.addEventListener('DOMContentLoaded', setBodyFontSize)
}
}
setBodyFontSize();
// set 1rem = viewWidth / 10
function setRemUnit () {
var rem = docEl.clientWidth / 10
docEl.style.fontSize = rem + 'px'
}
setRemUnit()
// reset rem unit on page resize
window.addEventListener('resize', setRemUnit)
window.addEventListener('pageshow', function (e) {
if (e.persisted) {
setRemUnit()
}
})
// detect 0.5px supports
if (dpr >= 2) {
var fakeBody = document.createElement('body')
var testElement = document.createElement('div')
testElement.style.border = '.5px solid transparent'
fakeBody.appendChild(testElement)
docEl.appendChild(fakeBody)
if (testElement.offsetHeight === 1) {
docEl.classList.add('hairlines')
}
docEl.removeChild(fakeBody)
}
}(window, document))

并且在html加上

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">

这样就完成了移动端的h5适配,和网上找到的方案们并不一样。