其他分享
首页 > 其他分享> > 适配移动端的问题

适配移动端的问题

作者:互联网

1.react适配设计稿750px。
2.在app.js文件中添加以下代码。入口文件。实际计算100px的换算为1rem。

constructor(props) {
    super(props);
    this.state = {
      styles: {},
    };
    this.bodyRef = React.createRef(null);
    /**
     * 判断pc和移动端
  */}
  componentDidMount() {
    // 移动端键盘弹起引起页面重载,禁止重载.
    const height = window.innerHeight + "px";
    this.bodyRef.current.style.height = height;
    window.onresize = function () {
      document.querySelector("#root").style.height = height;
    }

    if (
      navigator.userAgent.match(/Android/i) ||
      navigator.userAgent.match(/webOS/i) ||
      navigator.userAgent.match(/iPhone/i) ||
      navigator.userAgent.match(/iPad/i) ||
      navigator.userAgent.match(/iPod/i) ||
      navigator.userAgent.match(/BlackBerry/i) ||
      navigator.userAgent.match(/Windows Phone/i)
    ) {
      this.setState({ styles: { ...iphone } });
      // 移动端适配
      !(function (win, lib) {
        var timer,
          doc = win.document,
          docElem = doc.documentElement,
          vpMeta = doc.querySelector('meta[name="viewport"]'),
          flexMeta = doc.querySelector('meta[name="flexible"]'),
          dpr = 0,
          scale = 0,
          flexible = lib.flexible || (lib.flexible = {});

        // 设置了 viewport meta
        if (vpMeta) {
          console.warn("将根据已有的meta标签来设置缩放比例");
          var initial = vpMeta
            .getAttribute("content")
            .match(/initial\-scale=([\d\.]+)/);

          if (initial) {
            scale = parseFloat(initial[1]); // 已设置的 initialScale
            dpr = parseInt(1 / scale); // 设备像素比 devicePixelRatio
          }
        }
        // 设置了 flexible Meta
        else if (flexMeta) {
          var flexMetaContent = flexMeta.getAttribute("content");
          if (flexMetaContent) {
            var initial = flexMetaContent.match(/initial\-dpr=([\d\.]+)/),
              maximum = flexMetaContent.match(/maximum\-dpr=([\d\.]+)/);

            if (initial) {
              dpr = parseFloat(initial[1]);
              scale = parseFloat((1 / dpr).toFixed(2));
            }

            if (maximum) {
              dpr = parseFloat(maximum[1]);
              scale = parseFloat((1 / dpr).toFixed(2));
            }
          }
        }

        // viewport 或 flexible
        // meta 均未设置
        if (!dpr && !scale) {
          // QST
          // 这里的 第一句有什么用 ?
          // 和 Android 有毛关系 ?
          var u =
            (win.navigator.appVersion.match(/android/gi),
              win.navigator.appVersion.match(/iphone/gi)),
            _dpr = win.devicePixelRatio;

          // 所以这里似乎是将所有 Android 设备都设置为 1 了
          dpr = u
            ? _dpr >= 3 && (!dpr || dpr >= 3)
              ? 3
              : _dpr >= 2 && (!dpr || dpr >= 2)
                ? 2
                : 1
            : 1;

          scale = 1 / dpr;
        }

        docElem.setAttribute("data-dpr", dpr);

        // 插入 viewport meta
        if (!vpMeta) {
          vpMeta = doc.createElement("meta");

          vpMeta.setAttribute("name", "viewport");
          vpMeta.setAttribute(
            "content",
            "initial-scale=" +
            scale +
            ", maximum-scale=" +
            scale +
            ", minimum-scale=" +
            scale +
            ", user-scalable=no"
          );

          if (docElem.firstElementChild) {
            docElem.firstElementChild.appendChild(vpMeta);
          } else {
            var div = doc.createElement("div");
            div.appendChild(vpMeta);
            doc.write(div.innerHTML);
          }
        }

        function setFontSize() {
          var winWidth = docElem.getBoundingClientRect().width;
          //如果屏幕最大宽度大于750px,只取750px的宽度
          if (winWidth / dpr > 750) {
            winWidth = 750 * dpr;
          }

          // 根节点 fontSize 根据宽度决定
          var baseSize = winWidth / 7.5;

          docElem.style.fontSize = baseSize + "px";
          flexible.rem = win.rem = baseSize;
        }

        // 调整窗口时重置
        win.addEventListener(
          "resize",
          function () {
            clearTimeout(timer);
            timer = setTimeout(setFontSize, 300);
          },
          false
        );

        // 这一段是我自己加的
        // orientationchange 时也需要重算下吧
        win.addEventListener(
          "orientationchange",
          function () {
            clearTimeout(timer);
            timer = setTimeout(setFontSize, 300);
          },
          false
        );

        // pageshow
        // keyword: 倒退 缓存相关
        win.addEventListener(
          "pageshow",
          function (e) {
            if (e.persisted) {
              clearTimeout(timer);
              timer = setTimeout(setFontSize, 300);
            }
          },
          false
        );

        // 设置基准字体
        if ("complete" === doc.readyState) {
          doc.body.style.fontSize = 12 * dpr + "px";
        } else {
          doc.addEventListener(
            "DOMContentLoaded",
            function () {
              doc.body.style.fontSize = 12 * dpr + "px";
            },
            false
          );
        }

        setFontSize();

        flexible.dpr = win.dpr = dpr;

        flexible.refreshRem = setFontSize;

        flexible.rem2px = function (d) {
          var c = parseFloat(d) * this.rem;
          if ("string" == typeof d && d.match(/rem$/)) {
            c += "px";
          }
          return c;
        };

        flexible.px2rem = function (d) {
          var c = parseFloat(d) / this.rem;

          if ("string" == typeof d && d.match(/px$/)) {
            c += "rem";
          }
          return c;
        };
      })(window, window.lib || (window.lib = {}));

    } else {
      this.setState({ styles: { ...pc } });
    }


  }
  // 在组件从 DOM 中移除之前立刻被调用
  componentWillUnmount() {
    window.removeEventListener("resize", this.resizeListener);
  }

4.代码已经写了,在移动端键盘弹起会引起页面重新加载,禁止键盘弹起页面重新计算。
5.element里dialog布局(fixed固定的),如果他的父辈们包含了transform位移,dialog会以父辈盒子为限定区域,移除父辈transform。
6.window.open(‘http://baidu.com’,’_self’),【这个链接用户点击后,并且点击还要等待一个接口返回,再打开新页面】在安卓能打开链接,苹果不能打开,因为苹果限制了类似广告的行为。改为在当前页面打开。
7.pc端适配可以用sass书写函数 【使用时宽度:px2vw(100); 高度: px2vh(100) 】

//                              config.scss文件
//设计稿宽度1920px
$psd-width: 1920;

//设计稿高度1080px
$psd-Height: 1080;

// px转rem 根据设计稿宽度
@function px2rem($px) {
  @return ($px / $psd-width) * 10rem;
}

// px转vw 根据设计稿宽度
@function px2vw($px) {
  @return ($px / $psd-width) * 100vw;
}

// px转vh 根据设计稿高度
@function px2vh($px) {
  @return ($px / $psd-Height) * 100vh;
}

//                           在vue.config.js文件
config.css = {
  extract: false,
  loaderOptions: {
    sass: {
      prependData: `@import "/src/assets/css/config.scss";`
    }
  }
}

,vwvh或者用less来使用(宽度/19.2vw 高度/10.2vh)

标签:function,scale,dpr,适配,px,端的,flexible,移动,match
来源: https://blog.csdn.net/qq_42404842/article/details/121765779