大屏可视化适配方案

5,587 阅读3分钟

认识大屏

  • 在开发网页时,我适配最多的屏幕尺寸是:
    • PC端电脑:1920px * 1080px (当然也有部分电脑是支持输出4k屏,比如:小米笔记本等
    • 移动设备: 750px * auto
  • 大屏的应用场景
    • 通常用在数据可视化,借助于图形化手段,清晰有效地传达与沟通信息, 比如用在:零售、物流、电力、水利、环保、交通、医疗等领域。

大屏适配方案

1.移动端的适配方案有哪些?
  • 方案一:百分比,
    • 因为不同属性的百分比值,相对的可能是不同参照物,所以百分比往往很难统一;
    • 所以百分比在移动端适配中使用是非常少的;
  • 方案二:rem单位 + 动态设置 html 的 font-size;
  • 方案三:vw单位(推荐)
  • 方案四:flex的弹性布局(推荐)
2.大屏适配方案?
  • 方案一:百分比设置
  • 方案二:rem 单位 + 动态设置 html 的 font-size;
  • 方案三:vw 单位;
  • 方案四:flex 弹性布局;
  • 方案五:scale 等比例缩放(推荐)

新建大屏设备

  • 在chrome浏览器中,打开 DevTools 页面,在选择设备下拉栏中,点击最后一个选项 Edit

image.png

  • 然后在Emulated Devices中点击 Add custom device
  • 这里分别新建:1920*1080 、 3840 * 2160 、 7680 * 2160

image.png

  • 最后在Device面板中输入设备信息,并点击 Add 按钮完成设备的新建。

image.png

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

  • 动态设置HTML根字体大小 和 body 字体大小(lib_flexible.js)
    • 将设计稿的宽(1920)平均分成 24 等份, 每一份为 80px。
    • HTML字体大小就设置为 80 px,即1rem = 80px, 24rem = 1920px
    • body字体大小设置为 16px。
    • 安装 cssrem 插件, root font size 设置为 80px。 image.png image.png
    • 这个是px单位转rem的参考值 px 转 rem方式:手动 less/scss函数cssrem插件webpack插件、Vite插件
    • image.png
    • 接着就可以按照 1920px * 1080px 的设计稿愉快开发,此时的页面已经是响应式,并且宽高比不变 image.png

大屏适配方案2 - vw

  • 屏幕的宽默认为 100vw,那么100vw = 1920px, 1vw = 19.2px 。
  • 安装 cssrem 插件, body的宽高(1920px * 1080px)直接把px单位转vw单位 image.png
    • px 转 vw 方式:手动、less/scss函数、cssrem插件、webpack插件、Vite插件
  • 接着就可以按照 1920px * 1080px 的设计稿愉快开发,此时的页面已经是响应式,并宽高比不变。 image.png

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

使用CSS3中的scale函数来缩放网页,这里我们将使用两种方案来实现:

  • 方案一:直接根据宽度的比率进行缩放。(宽度比率=网页当前宽 / 设计稿宽)
  • 方案二:动态计算网页宽高比,决定是是否按照宽度的比率进行缩放。
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    body, ul{
      margin: 0;
      padding: 0;
    }
    body{
      width: 1920px;
      height: 1080px;
      box-sizing: border-box;
      border: 3px solid red;

      /* 指定缩放的原点在左上角 */
      transform-origin: left top;
    }

    ul{
      width: 100%;
      height: 100%;
      list-style: none;

      display: flex;
      flex-direction: row;
      flex-wrap: wrap;
    }

    li{
      width: 33.333%;
      height: 50%;
      box-sizing: border-box;
      border: 2px solid green;
      font-size: 30px;
    }
  </style>
</head>
<body>

  <ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
    <li>6</li>
  </ul>

  <script>
    // 设计稿:  1920 * 1080
    // 目标适配:  1920 * 1080   3840 * 2160 ( 2 * 2 ) ;  7680 * 2160( 4 * 2)

    // 1.设计稿的尺寸
    let targetX = 1920

    // 2.拿到当前设备(浏览器)的宽度
    let currentX = document.documentElement.clientWidth || document.body.clientWidth
    //  1920 * 1080  -> 3840 * 2160

    // 3.计算缩放比例
    let scaleRatio = currentX / targetX; // 参照宽度进行缩放

    // 4.开始缩放网页
    document.body.style = `transform: scale(${scaleRatio})`
  </script>
</body>
</html>

完美适配 3840 * 2160

image.png

此时有个问题出现了

  • 在7680*2160的屏幕下,出现了超出屏幕高度,出现了滚动条 image.png
  • 为什么会出现这个问题
    • 因为我们使用scale进行缩放的时候 放大了四倍 1920x4= 7680 1080 x 4= 4320
    • 这个时候很明显1080高度无法放下4320高度所以出现了滚动条
  • 如何解决
    • 这个时候我们不能参照宽度进行缩放( 默认情况 )
    • 需要判断如果视口宽高比大于设计稿宽高比就参照高度进行缩放
    • 比如 3840 / 2160 > 1920 / 1080 就按照参照高度进行缩放 -js代码更改
  // 设计稿:  1920 * 1080
      // 目标适配:  1920 * 1080   3840 * 2160 ( 2 * 2 ) ;  7680 * 2160( 4 * 2)

      // 1.设计稿的尺寸
      let targetX = 1920;
      let targetY = 1080;
      let oldRatio = targetX / targetY;


      // 2.拿到当前设备(浏览器)的宽度
      let currentX =
        document.documentElement.clientWidth || document.body.clientWidth;
      let currentY =
        document.documentElement.clientHeight || document.body.clientHeight;
      //  1920 * 1080  -> 3840 * 2160

      // 3.计算缩放比例
      let scaleRatio = currentX / targetX; // 参照宽度进行缩放 ( 默认情况 )
      let currentRatio = currentX / currentY; // 宽高比率

      // 超宽屏
      if (currentRatio > oldRatio) {
        scaleRatio = currentY / targetY; // 参照高度进行缩放
        document.body.style = `width:${targetX}px; height:${targetY}px;transform: scale(${scaleRatio}) translateX(-50%); left: 50%`;
      } else {
        // 4.开始缩放网页
        document.body.style = `width:${targetX}px; height:${targetY}px; transform:           scale(${s  caleRatio})`;
      }