美文网首页
数据可视化--大屏适配(一)

数据可视化--大屏适配(一)

作者: coderhzc | 来源:发表于2022-12-11 16:51 被阅读0次

    一.大屏的基本认识:

    1.  PC端电脑:1920px * 1080px (当然也有少部分电脑是支持输出4k屏, 比如:小米笔记本等)
    2. 移动设备: 750px * auto
    
    3. 大屏设备是啥?
        -- 在我们的生活中,经常会见到一些比较大的屏幕,比如:指挥大厅、展厅、展会中的大屏。这些设备就可以称之为大屏设备,
    当然1920*1080 和 3840*2160(4k 屏 )也可以说是属于大屏。
    
    4. 大屏的应用场景
        --  通常用在数据可视化,借助于图形化手段,清晰有效地传达与沟通信息
        --  比如用在:零售、物流、电力、水利、环保、交通、医疗等领域。
    
    5. 大屏的硬件设备的分类:
        -- 拼接屏、LED屏、投影等。
    
    6. 大屏设备-拼接屏
        -- 拼接屏  顾名思义就是很多屏幕按照一定拼接方式拼接而成。
        -- 其实可以理解成是由很多电视(显示屏)拼接而成。
    
       -- 常见的使用场景有指挥大厅、展厅、展会等等
    
    7. 拼接方式取决于使用场景的需求,如下例子:
        --  1920px * 1080px,即 1 * 1 个 显示屏(16 : 9)
        --  3840 * 2160(4k 屏 ),即 2 * 2 个显示屏(16 : 9)
        --  5760 * 3240,即 3 * 3 个显示屏(16 : 9)
        --  7680 * 3240,即 4 * 3 个显示屏(64 : 27)
        --  9600 * 3240,即 5 * 3 个显示屏(80 : 27)
    
    8. 大屏设备- LED屏
        LED屏
       --  LED 也是现在大屏中常用的硬件,它是由若干单体屏幕模块组成的,它的像素点计算及拼接方式与拼接屏有很大区别。
       --  LED 可以看成是矩形点阵,具体拼接方式也会根据现场实际情况有所不同,拼接方式的不同直接影响到设计的尺寸规则。
       --  LED 屏有很多规格,各规格计算方法相同。
       -- ✓ 比如,我们用单体为 500 * 500 的作为标准计算,每个单体模块像素点横竖都为 128px
       -- ✓ 如右图,横向 12 块竖向 6 块,横向像素为 128*12=1536px,竖向 128*6=768px。可以使用横竖总像素去设计。
       -- ✓ 最终算出的屏幕尺寸:1536px * 768px
    
    9. 定设计稿尺寸 -拼接屏
        拼接屏
        --  大多数屏幕分辨率是 1920*1080。当然也会有一些大屏,比如6*3的拼接屏,横向分辨率为 6*1920=11520px。竖向分辨率为 3*1080=3240px。设计可以按照横竖计算后的总和(11520px * 3240px)作为设计尺寸。
        --  这种尺寸过大的就不太适合按原尺寸设计,那怎么判断什么时候可以按照总和设计,什么时候最好不要按照总和设计。这有一个关键的节点 4K,超过 4K 后现有硬件会产生很多问题,例如:卡顿,GPU 压力过大,高负荷运行等等。
        --  正常设计建议最好是保持在 4K 内,由于硬件问题,所以现在大家采用的都是输出 4K 及以下,既保证流畅度又能在视觉上清晰阅读。
        --  所以设计时也要保持同样的规则。保持大屏的比例等比缩放即可。
        --  注:最好是按照硬件的输出分辨率设计(关键),因为按照输出分辨率设计,一定不会出错。
    
       ◼ 比如
       --  1920px * 1080px(1*1),设计搞尺寸 :1920px * 1080px 。
       --  3840 * 2160(2*2 4k 屏 ),设计搞尺寸 : 3840 * 2160 。
       --  5760 * 3240(3*3),设计搞尺寸 : 5760 * 3240 。
       --  7680 * 3240(4*3),设计搞尺寸 : ( 3840 * 1620 需要出 1倍图 和 2倍图, 7680 * 3240 )
       --  9600 * 3240(5*3),设计搞尺寸 : 比如:4800 * 1620,需要出 1倍图 和 2倍图
    
    
    10. 定设计稿尺寸 -LED屏
     LED屏
      --  LED 大屏是由若干单体屏幕模块组成的,LED 屏有很多规格,但是规格计算方法相同。
      --  比如:我们用单体为 500 * 500 的作为标准计算,每个单体模块像素点横竖都为 128px。
      --  如图横向 12 块竖向 6 块,横向像素为 128*12=1536px,竖向 128*6=768px。可以使用横竖总像素去设计。
      --  此处规则和之前的拼接屏一样,如果超过 4K 像素时可以等比缩放,建议尽量保持在 4k 及以下。
    
    
    ◼ 比如
     --  1536px * 768px,设计搞尺寸 : 1536px * 768px 。
     --  4608 * 3072,设计搞尺寸 : 4608 * 3072 。
     --  9216 * 6144,设计搞尺寸 :
     -- ✓ 比如:4608 * 3072,需要出 1倍图 和 2倍图
    
    11. 设计稿尺寸-移动端大屏
       -- 对于移动端的大屏展示,基本按照实际尺寸设计即可,比如:
       --  750px * Auto,设计搞尺寸 : 750px * Auto 。
    
    
    12. 大屏设计稿尺寸的总结:
       --  设计尺寸建议按照输出分辨率设计(重点)
       --  拼接后像素在 4k 左右直接按照总和设计就行
       --  总和设计建议不要超过 4k,可以按比例缩小设计搞(非固定,超过也是可以,只是强烈建议)
       --  建议定设计搞尺寸前,先了解硬件及信号输入输出,确定设计搞的尺寸。
       --  特殊尺寸,需到现场调试最佳设计搞的尺寸。
    
    13.大屏适配方案的总结:
      --  特殊尺寸不要考虑适配电脑屏幕又适配拼接屏,因为完全没有必要,也不可能一稿既适配电脑也适配各种尺寸大屏。
      --  这种情况应该优先考虑目标屏幕的适配,要针对性设计,而在小屏根据等比例缩放显示,这才是最佳的解决方法。
    
    14. 大屏适配方案
      在学习大屏适配方案之前,我们现在回顾一下移动端的适配方案有哪些?
        --  方案一:百分比设置;
        -- ✓ 因为不同属性的百分比值,相对的可能是不同参照物,所以百分比往往很难统一;
        -- ✓ 所以百分比在移动端适配中使用是非常少的;
        --  方案二:rem单位 + 动态设置 html 的 font-size;
        --  方案三:vw单位(推荐);
        --  方案四:flex的弹性布局(推荐) ;
    ◼ 大屏的幕尺寸通常也是非常多的,很多时候我们是希望页面在不同的屏幕尺寸上显示不同的尺寸,那大屏的适配方案有哪些?
        --  方案一:百分比设置;
        --  方案二:rem 单位 + 动态设置 html 的 font-size;
        --  方案三:vw 单位;
        --  方案四:flex 弹性布局;
        --  方案五:scale 等比例缩放(推荐)
    

    二. 新建 大屏设备

    image.png

    三. 大屏适配方案1 – rem + font-size

    image.png

    四. 大屏适配方案2 - vw

    image.png

    五. 大屏适配方案3(推荐) - scale

    image.png

    六. 三种适配方案的对比

    image.png

    七. 大屏开发 注意事项

    image.png

    八. 大屏项目适配

    image.png

    九. 在项目中新建一个 flexbel.js 关于适配大屏脚本

    (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")
          // eslint-disable-next-line no-useless-escape
          .match(/initial\-scale=([\d\.]+)/);
        if (match) {
          scale = parseFloat(match[1]);
          dpr = parseInt(1 / scale);
        }
      } else if (flexibleEl) {
        var content = flexibleEl.getAttribute("content");
        if (content) {
          // eslint-disable-next-line no-useless-escape
          var initialDpr = content.match(/initial\-dpr=([\d\.]+)/);
          // eslint-disable-next-line no-useless-escape
          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 = width * 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 () {
            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"] = {}));
    
    
    // 在Vue 项目中使用:
    import "./utils/flexible";
    

    相关文章

      网友评论

          本文标题:数据可视化--大屏适配(一)

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