数据大屏自适应方案

131 阅读1分钟

需求:

  1. 要做一个1024*768; 4:3的屏幕适配;

  2. 正常电脑上也得好好显示🙄

一个比较简单的方法是:

  1. 距离类的比如 width height margin 用vh vw ;

可以理解为如果UI图上宽度是500,他的百分比是30.86%,那我就设置width:30.86vw; 这样他就相对于整个视口宽度的 30.86%了;(UI图可以通过选中后按Alt键查看百分比)

  1. font size 用rem 适配;

需要向根HTML中添加一段js,传入 UI图大小和允许最大的宽度

<script type="text/javascript">
    (function (designWidth, maxWidth) {
      var doc = document,
        win = window,
        docEl = doc.documentElement,
        remStyle = document.createElement("style"),
        tid;

      function refreshRem() {
        var width = docEl.getBoundingClientRect().width;
        maxWidth = maxWidth || 540;
        width > maxWidth && (width = maxWidth);
        var rem = width * 100 / designWidth;
        remStyle.innerHTML = 'html{font-size:' + rem + 'px;}';
      }

      if (docEl.firstElementChild) {
        docEl.firstElementChild.appendChild(remStyle);
      } else {
        var wrap = doc.createElement("div");
        wrap.appendChild(remStyle);
        doc.write(wrap.innerHTML);
        wrap = null;
      }
      //要等 wiewport 设置好后才能执行 refreshRem,不然 refreshRem 会执行2次;
      refreshRem();

      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 = "16px";
      } else {
        doc.addEventListener("DOMContentLoaded", function (e) {
          doc.body.style.fontSize = "16px";
        }, false);
      }
    })(1024, 2000)
    </script>

eg:想设置16px ; 即font-size: .16rem;

或者使用插件

px-to-viewport会将px自动转换成vw vh

还有

px-to-rem