rem布局

作者: Jalon | 来源:发表于2016-12-22 20:39 被阅读0次

rem布局

- 为head添加 <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0" />
- js设置根节点字体大小 一般可以选择设计图屏宽的10分之一。因为这样可以通过sass等变量计算直接写设计图的数量单位。rem对应大小 = 设计图山大小/(设计图手机宽/10)
- css rem书写
我写了端js,直接放在头部就好了。

(function () {
      var dpr = window.dpr = window.devicePixelRatio || 1;
      var scale = 1;
      var rootFontSize;
      var docEl = document.documentElement;
      var metaEl = document.querySelector('meta[name="viewport"]');
      // 无需缩放,避免模糊
      metaEl.setAttribute('content', 'initial-scale=' + scale + ',maximum-scale=' + scale + ', minimum-scale=' + scale + ',user-scalable=no');
      
      // 设置根字体大小
      function setRootSize() {
        var rootWidth = docEl.offsetWidth;
        // 将设计图分成10等份
        rootFontSize = rootWidth / 10;
        window.rootFontSize = rootFontSize;
        docEl.style.fontSize = rootFontSize + 'px';
        // 防止部分手机rem换算bug,需要打个补丁,检测修复一下
        remPatch();
      }

      // 检测rem比,并调整
      function remPatch() {
        var remTestFragment = document.createElement("div");
        remTestFragment.id = 'rem-test';
        remTestFragment.style.width = '10rem';
        remTestFragment.style.boxSizing = 'border-box';
        remTestFragment.style.opacity = 0;
        remTestFragment.style.position = 'absolute';
        remTestFragment.style.bottom = '-1000px';
        setTimeout(function () {
          document.body.appendChild(remTestFragment);
          var remTestNode = document.getElementById('rem-test');
          var currentTestWidth = remTestNode.offsetWidth;
          var rootFontSize = docEl.style.fontSize.replace(/px/, '') * 100;
          var scale = currentTestWidth*10 / rootFontSize;
          rootFontSize = rootFontSize / 100 / scale;
          window.rootFontSize = rootFontSize;
          docEl.style.fontSize = rootFontSize + 'px';
          remTestNode.parentNode.removeChild(remTestNode);
        })
      };

      var delay;
      function onResize() {
        clearTimeout(delay);
        delay = setTimeout(setRootSize, 300);
      }

      window.addEventListener('resize', onResize, false);
      setRootSize();

      // 计算
      window.px2rem = function (designPx) {
        return designPx / dpr / rootFontSize;
      }

    })();

相关文章

网友评论

      本文标题:rem布局

      本文链接:https://www.haomeiwen.com/subject/qayhvttx.html