移动端适配flexible.js

294 阅读1分钟

源码:

// 首先是一个立即执行函数,执行时传入的参数是window和document
(function flexible (windowdocument) {
  var docEl = document.documentElement  // 返回文档的root元素
  var dpr = window.devicePixelRatio || 1 // 获取设备的dpr,即当前设置下物理像素与虚拟像素的比值

  // adjust body font size 设置默认字体大小,默认的字体大小继承自body
  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  检测是否支持0.5像素,解决1px在高清屏多像素问题,需要css的配合。
  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)
  }
}(windowdocument))

postcss-pxtorem插件

安装完postcss-pxtorem之后的配合非常简单,只要在.postcssrc.js文件配置如下就好了, rootValue:75 为啥是75呢,这是因为我们的设计稿的宽度是750px,十分之一就是75px

module.exports = {
  plugins: {
    'postcss-pxtorem': {
      rootValue: 75,
    }
  }
}

修改

var metaEl = doc.querySelector('meta[name="viewport"]');
if (metaEl) {
  console.warn('将根据已有的meta标签来设置缩放比例');
  var match = metaEl.getAttribute('content').match(/initial-scale=([\d.]+)/);
  if (match) {
      scale = parseFloat(match[1]);
      dpr = parseInt(1 / scale);
  }
}

这一串主要是来实现iphone和安卓的设备像素比不一样的问题,例如iphone的一些手机