关于rem手机适配的问题

如题,之前一直在做pc后台系统,突然给了任务做个h5应用有点不知所措。。我设的fontsize62.5%,然后看了下字体1.6rem浏览器显示出来的是16px,为啥我给个div宽度定2rem却不是20px?

阅读 2.6k
3 个回答

rem布局需要引入一个自调用函数(网易的做法)

(function(doc, win) {

    var docEl = doc.documentElement,

        isIOS = navigator.userAgent.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/),

        dpr = isIOS ? Math.min(win.devicePixelRatio, 3) : 1,

        dpr = window.top === window.self ? dpr : 1, //被iframe引用时,禁止缩放

        dpr = 1,

        scale = 1 / dpr,

        resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize';

    docEl.dataset.dpr = dpr;

    var metaEl = doc.createElement('meta');

    metaEl.name = 'viewport';

    metaEl.content = 'initial-scale=' + scale + ',maximum-scale=' + scale + ', minimum-scale=' + scale;

    docEl.firstElementChild.appendChild(metaEl);

    var recalc = function() {

        var width = docEl.clientWidth;

        if (width / dpr > 750) {

            width = 750 * dpr;

        }

        // 乘以100,px : rem = 100 : 1

        docEl.style.fontSize = 100 * (width / 750) + 'px';

    };

    recalc()

    if (!doc.addEventListener) return;

    win.addEventListener(resizeEvt, recalc, false);

})(document, window);

处理后100px = 1rem;

浏览器默认最小字体是12px

所以设置文字大小为62.5%,文字大小会生效,但rem还是已12为基准,可以这样

我们可以设置用100来换算

html{
    font-size:625%;
}
div{
    font-size: 0.16rem; /*真实值: 16px   怎么来的  16/100=0.16*/
    width: 1rem; /*真实值: 100px 怎么来的 100/100=1*/
}

看不到完整代码不清楚问题出在哪。我常用移动端rem方法是这样的:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
    <title>title</title>
    <script>
      //rem设置 layout_width是layout设计宽度
      var layout_width = 750;
      (function (doc, win) {
        var docEl = doc.documentElement,
          resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
          recalc = function () {
            var clientWidth = docEl.clientWidth;
            if (!clientWidth) return;
            if (clientWidth >= layout_width) {
              docEl.style.fontSize = '100px';
            } else {
              docEl.style.fontSize = 100 * (clientWidth / layout_width) + 'px';
            }
          };

        if (!doc.addEventListener) return;
        win.addEventListener(resizeEvt, recalc, false);
        doc.addEventListener('DOMContentLoaded', recalc, false);
      })(document, window);
    </script>
  </head>
  <body>
    
  </body>
</html>

layout_width是ui设计的实际页面宽度,现在流行用750px。这样处理以后,1rem=100px这样做换算就可以了,用这个方法做了很多项目了,没有出现过rem不符的现象,你可以试试。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题