程序员开发实例大全宝库

网站首页 > 编程文章 正文

移动端h5自适应适配之flexible.js打假

zazugpt 2024-08-16 06:48:39 编程文章 14 ℃ 0 评论

最近做一个移动端的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安装。

源代码如下:

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

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

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

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表