使用淘宝 flexible.js / amfe-flexible.js 的 Rem 解决方案部分手机会出现适配不了问题。网上已经有了解决方案,但很多人并不知道是什么原因导致的。导致此问题的出现主要是用户的手机使用了自定义的字体,导致我们动态设置 html 根元素的 font-size 的值后,与实际的效果 font-size 值不一致。为什么呢?因为某些自定义的字体,假如你设置根元素的 font-size 为 41.4px,但其实这种字体是偏大的,结果其实际在页面上看到的效果可能是 42px。这样就会导致:假如页面屏宽为 414px ,但我们设置页面宽度为的 10rem 为 420px,页面效果就是会偏大,超过一屏 414px 的宽度。
解决思路主要是使用 getComputedStyle 计算出自定义字体实际与我们设置的 font-size 的差异,然后把差异补上就可以了。通用解决方案如下(代码直接引入即可使用):
(function (window, document) {
/*
* 适用于获取屏幕宽度等分设置 html 的 font-size 情况,比如 flexible.js 库
*/
// 计算最终 html font-size
function modifileRootRem () {
var root = document.documentElement
var fontSize = parseFloat(root.style.fontSize)
var finalFontSize = parseFloat(window.getComputedStyle(root).getPropertyValue('font-size'))
if (finalFontSize === fontSize) return
root.style.fontSize = fontSize + (fontSize - finalFontSize) + 'px' // 【关键代码:差异补上】
}
if (typeof window.onload === 'function') {
var oldFun = window.onload
window.onload = function () {
oldFun()
modifileRootRem()
}
} else {
window.onload = modifileRootRem
}
})(window, document)
参考引用:https://www.jianshu.com/p/7064613bf9f8