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

本文介绍了移动端自适应布局的rem解决方案,通过在HTML中设置视口和使用JS动态调整根元素字体大小,实现根据设备dpr的自适应。以Pad为例,将屏幕宽度分为10rem,并利用Sass简化rem计算,方便开发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      之前写了一篇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);
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值