1、安装

yarn add postcss-px2rem-exclude

2、在config-overrides.js文件中配置addPostcssPlugins

const {override,addPostcssPlugins} = require('customize-cra')
module.exports = override(
  addPostcssPlugins([
    require('postcss-px2rem-exclude')({
      remUnit: 75,
      propList: ['*'],
      // exclude: /node_modules/,
      exclude: /node_modules\/antd-mobile/
    })
  ])
)

3、在index.html文件的<head></ head>中添加配置即可,我这里是以750px为基准

    <script>
      (function (win, lib) {
        var doc = win.document;
        var docEl = doc.documentElement;
        var metaEl = doc.querySelector('meta[name="viewport"]');
        var flexibleEl = doc.querySelector('meta[name="flexible"]');
        var dpr = 0;
        var scale = 0;
        var tid;
        var flexible = lib.flexible || (lib.flexible = {});

        if (metaEl) {
          console.warn("将根据已有的meta标签来设置缩放比例");
          var match = metaEl
            .getAttribute("content")
            .match(/initial-scale=([d.]+)/);
          if (match) {
            scale = parseFloat(match[1]);
            dpr = parseInt(1 / scale);
          }
        } else if (flexibleEl) {
          var content = flexibleEl.getAttribute("content");
          if (content) {
            var initialDpr = content.match(/initial-dpr=([d.]+)/);
            var maximumDpr = content.match(/maximum-dpr=([d.]+)/);
            if (initialDpr) {
              dpr = parseFloat(initialDpr[1]);
              scale = parseFloat((1 / dpr).toFixed(2));
            }
            if (maximumDpr) {
              dpr = parseFloat(maximumDpr[1]);
              scale = parseFloat((1 / dpr).toFixed(2));
            }
          }
        }

        if (!dpr && !scale) {
          var isAndroid = win.navigator.appVersion.match(/android/gi);
          var isIPhone = win.navigator.appVersion.match(/iphone/gi);
          var devicePixelRatio = win.devicePixelRatio;
          if (isIPhone) {
            // iOS下,对于2和3的屏,用2倍的方案,其余的用1倍方案
            if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {
              dpr = 3;
            } else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)) {
              dpr = 2;
            } else {
              dpr = 1;
            }
          } else {
            // 其他设备下,仍旧使用1倍的方案
            dpr = 1;
          }
          scale = 1 / dpr;
        }

        docEl.setAttribute("data-dpr", dpr);
        if (!metaEl) {
          metaEl = doc.createElement("meta");
          metaEl.setAttribute("name", "viewport");
          metaEl.setAttribute(
            "content",
            "initial-scale=" +
              scale +
              ", maximum-scale=" +
              scale +
              ", minimum-scale=" +
              scale +
              ", user-scalable=no"
          );
          if (docEl.firstElementChild) {
            docEl.firstElementChild.appendChild(metaEl);
          } else {
            var wrap = doc.createElement("div");
            wrap.appendChild(metaEl);
            doc.write(wrap.innerHTML);
          }
        }

        function refreshRem() {
          var width = docEl.getBoundingClientRect().width;
          // if (width / dpr > 540) {
          //     width = 540 * dpr;
          // }
          var rem = width / 10;
          docEl.style.fontSize = rem + "px";
          flexible.rem = win.rem = rem;
        }

        win.addEventListener(
          "resize",
          function () {
            clearTimeout(tid);
            tid = setTimeout(refreshRem, 300);
          },
          false
        );
        win.addEventListener(
          "pageshow",
          function (e) {
            if (e.persisted) {
              clearTimeout(tid);
              tid = setTimeout(refreshRem, 300);
            }
          },
          false
        );

        if (doc.readyState === "complete") {
          doc.body.style.fontSize = 12 * dpr + "px";
        } else {
          doc.addEventListener(
            "DOMContentLoaded",
            function (e) {
              doc.body.style.fontSize = 12 * dpr + "px";
            },
            false
          );
        }

        refreshRem();

        flexible.dpr = win.dpr = dpr;
        flexible.refreshRem = refreshRem;
        flexible.rem2px = function (d) {
          var val = parseFloat(d) * this.rem;
          if (typeof d === "string" && d.match(/rem$/)) {
            val += "px";
          }
          return val;
        };
        flexible.px2rem = function (d) {
          var val = parseFloat(d) / this.rem;
          if (typeof d === "string" && d.match(/px$/)) {
            val += "rem";
          }
          return val;
        };
      })(window, window["lib"] || (window["lib"] = {}));
    </script>
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐