最近做一個移動端的h5適配,在網上找方案基本上都是使用flexible.js,然后順理成章我也入了這個坑。
引用flexible.js的方式無外乎cdn引入:
>
下載文件到本地或者npm安裝。
源代碼如下:
在引入之后發現遇到了各種奇怪的問題,比如如果在元素上設置了class指定了元素的大小,那么當屏幕的scale改變時字體會隨著scale而變化,再比如在某些安卓手機上dpr或者scale會沒有值,導致適配方案失效,這些問題都是因為判斷的時候沒有考慮到所有的情況,但是網上查到的解決方案全是這樣的,難道是我的寫法有問題,又或者引入的版本有問題?抱著對自己的懷疑我找了一下午,直到我找到了這個github??https://github.com/amfe/lib-flexible??。
這里說明了之前的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加上
這樣就完成了移動端的h5適配,和網上找到的方案們并不一樣。