完美适配!数据大屏rem方案实践

1,729 阅读2分钟

在数据大屏项目中,屏幕适配一直是一个很头疼的问题。因为不同屏幕尺寸和分辨率的设备太多,而且不同设备的像素密度也不同,这导致在不同设备上显示的效果可能会有很大的差异。为了解决这个问题,我们需要采用一种适合大屏幕的适配方案,以保证在不同设备上都能够完美展示数据大屏的效果。

接下来,分享一下我在数据大屏项目中使用 rem 适配方案的实践经验和技巧。

rem介绍

首先,我们需要了解什么是rem?rem 是一种相对单位,表示根元素的字体大小。
通常根元素的字体大小设置为16px,即html{fontsize:16px;},这时,rem的计算公式为:1rem=16px。
由于rem是相对单位,因此它可以根据屏幕尺寸和分辨率进行自适应,从而实现屏幕适配的效果。
在大屏适配中,1rem的计算公式为 1rem = 页面有效宽度 / 100

大屏适配公式

在大屏展示时,我们一般需要的效果是:页面始终都是左右居中、上下居中,四周留白。如下图所示:

image.png image.png

为了实现这个效果,我们可以使用下面的适配公式:

image.png

Wp 即为页面有效宽度,Hp为页面有效高度。 代码如下:

<!DOCTYPE html>
<html lang="zh">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover">
  <title>大屏可视化项目</title>
  <style>
    #root {
      margin: 0 auto;
      background: #52d155;
    }
  </style>
  <script>
    const clientWidth = document.documentElement.clientWidth
    const clientHeight = document.documentElement.clientHeight
    let pageWidth = clientWidth / clientHeight > 16 / 9 ? clientHeight * (16 / 9) : clientWidth
    const pageHeight = pageWidth / (16 / 9)
    const string = `<style>html{
      font-size: ${pageWidth / 100}px
    }</style>`
    document.write(string)
  </script>
</head>
<body>
  <div id="root"></div>
  <script>
    root.style.width = pageWidth + 'px'
    root.style.height = pageHeight + 'px'
    root.style.marginTop = (clientHeight - pageHeight) / 2 + 'px'
  </script>
  <script type="module" src="/src/main.tsx">
  </script>
</body>
</html>

我们先获取设备的宽高,然后根据公式计算出页面的有效宽高,之后就能得出1rm的具体大小,最后通过JS设置font-size的值为1rm即可。注意不要忘记将有效宽高绑定到div,并设置div页面居中。

如何适配一个div?

上面我们已经确定了1rem的值,那么我们如何去适配一个div呢?公式如下:

image.png

即假设一个div在设计稿中宽为367px,高为315px,设计稿宽为2420px,那么这个div在页面中的宽为367 / 2420 × 100rem,高为315 / 2420 × 100rem。代码如下:

 width: 367 / 2420 × 100rem;
 height: 315 / 2420 × 100rem;

为了方便在后续的开发中使用,我们可以写一个 px() 函数来将像素值转换成 rem 值。这样,我们就可以直接在 CSS 中使用像素值来表示长度,而无需手动计算 rem 值。代码如下:

@function px($n) {
  @return $n / 2420 * 100rem;
}
.x {
  width: px(367);
  height: px(315);
}

好了,以上就是数据大屏适配的rem方案,希望这个方案可以对大家有所帮助。如有不足和错误之处,欢迎各位大佬批评指正。 项目链接:大屏可视化项目 (gitee.io)