移动端自适应布局解决方案:rem布局

      之前写了一篇rem布局的文章,今天拿出来发现已经过时了。于是再来写一遍!

       2018.10.24更新

      首先在html里面设置一下视口:

<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />

       然后在你的页面引入下面的js,用来检查用户的设备dpr。我们根据不同的dpr来动态修改html根元素的fontsize。(我们知道rem是依据根元素来计算的)

(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))

        好了!以上两步就能实现自适应布局了。

        最后以pad 768*1024的逻辑像素为例子。我们将整个屏幕的宽度分为10rem,这样就得出1rem = 76.8px;假如我的设计稿有一个620px * 640px的div元素,那我们转换为rem就是:620 / 76.8 rem* 640 / 76.8 rem ≈ 8.07rem * 8.33rem 。但是这样在实际开发中不利于计算,我们可以借助sass来帮我们做:

$baseFontSize:76.8px;  //以768px的pad宽度为基准
@function toRem($px){
    @return $px/$baseFontSize * 1rem;
}
div{
    width: toRem(620px);
    height: toRem(640px);
}

以上就是我的全部内容。如有遗漏,欢迎评论留言。

猜你喜欢

转载自blog.csdn.net/weixin_41190571/article/details/80885643