[技术讨论] 数据大屏的解决方案

[复制链接]
 楼主| 科叼 发表于 2024-7-25 16:16 | 显示全部楼层 |阅读模式
作者:狗尾巴花的尖
链接:juejin.cn/post/7372105071573663763


顺便吆喝一声,技术大厂,内推捞人,前/后端or测试https://jinshuju.net/f/o38ijj←感兴趣
要求学历:全日制统招本科(非学院派即可):
--加班偶尔较多,但周末加班两倍工资。
--15-35K,工资在一线城市属于一般,但二线城市很可以。

1. 使用缩放比例适配各种设备(适用16*9比例的屏幕分辨率)

(1)封装一个获取缩放比例的工具函数
  1. /**
  2. * 大屏效果需要满足16:9的屏幕比例,才能达到完美的大屏适配效果
  3. * 其他比例的大屏效果,不能铺满整个屏幕
  4. * @param {*} w 设备宽度 默认 1920
  5. * @param {*} h 设备高度 默认 1080
  6. * @returns 返回值是缩放比例
  7. */
  8. export function getScale(w = 1920, h = 1080) {
  9.   const ww = window.innerWidth / w
  10.   const wh = window.innerHeight / h
  11.   return ww < wh ? ww : wh
  12. }


(2)在vue中使用方案如下
  1. <template>
  2.   <div class="full-screen-container">
  3.     <div id="screen">
  4.        大屏展示的内容
  5.     </div>
  6.   </div>
  7. </template>
  8. <script>
  9. import { getScale } from "@/utils/tool";
  10. import screenfull from "screenfull";
  11. export default {
  12.   name: "cockpit",
  13.   mounted() {
  14.     if (screenfull && screenfull.enabled && !screenfull.isFullscreen) {
  15.       screenfull.request();
  16.     }
  17.     this.setFullScreen();
  18.   },
  19.   methods: {
  20.     setFullScreen() {
  21.       const screenNode = document.getElementById("screen");
  22.       // 非标准设备(笔记本小于1920,如:1366*768、mac 1432*896)
  23.       if (window.innerWidth < 1920) {
  24.         screenNode.style.left = "50%";
  25.         screenNode.style.transform = `scale(${getScale()}) translate(-50%, 0)`;
  26.       } else if (window.innerWidth === 1920) {
  27.         // 标准设备 1920 * 1080
  28.         screenNode.style.left = 0;
  29.         screenNode.style.transform = `scale(1) translate(0, 0)`;
  30.       } else {
  31.         // 大屏设备(4K 2560*1600)
  32.         screenNode.style.left = "50%";
  33.         screenNode.style.transform = `scale(${getScale()}) translate(-50%, 0)`;
  34.       }
  35.       // 监听视口变化
  36.       window.addEventListener("resize", () => {
  37.         if (window.innerWidth === 1920) {
  38.           screenNode.style.left = 0;
  39.           screenNode.style.transform = `scale(1) translate(0, 0)`;
  40.         } else {
  41.           screenNode.style.left = "50%";
  42.           screenNode.style.transform = `scale(${getScale()}) translate(-50%, 0)`;
  43.         }
  44.       });
  45.     },
  46.   },
  47. };
  48. </script>
  49. <style lang="scss">
  50. .full-screen-container {
  51.   width: 100vw;
  52.   height: 100vh;
  53.   display: flex;
  54.   flex-direction: column;
  55.   background-color: #131a2b;
  56.   #screen {
  57.     position: fixed;
  58.     width: 1920px;
  59.     height: 1080px;
  60.     top: 0;
  61.     transform-origin: left top;
  62.     color: #fff;
  63.   }
  64. }
  65. </style>


(3)mac设备上的屏幕分辨率,在适配的时候,可能不是那么完美,以短边缩放为准,所以宽度到达百分之百后,高度不会铺满

① 1432*896 13寸mac本
② 2560*1600 4k屏幕

2. 使用第三方插件来实现数据大屏(mac设备会产生布局错落)

(1)建议在全屏容器内使用百分比搭配flex进行布局,以便于在不同的分辨率下得到较为一致的展示效果。

(2)使用前请注意将body的margin设为0,否则会引起计算误差,全屏后不能完全充满屏幕。

(3)使用方式
  1. 1. npm install @jiaminghi/data-view
  2. 2. yarn add @jiaminghi/data-view

  1. // 在vue项目中的main.js入口文件,将自动注册所有组件为全局组件
  2. import {fullScreenContainer} from '@jiaminghi/data-view'
  3. Vue.use(fullScreenContainer)

  1. <template>
  2.         <dv-full-screen-container>
  3.             要展示的数据大屏内容
  4.         这里建议高度使用百分比来布局,而且要考虑mac设备适配问题,防止百分比发生布局错乱
  5.         需要注意的点是,一个是宽度,一个是字体大小,不产生换行
  6.     </dv-full-screen-container>
  7. </template>
  8. <script>
  9. import screenfull from "screenfull";
  10. export default {
  11.   name: "cockpit",
  12.   mounted() {
  13.     if (screenfull && screenfull.enabled && !screenfull.isFullscreen) {
  14.       screenfull.request();
  15.     }
  16.   }
  17. };
  18. </script>
  19. <style lang="scss">
  20. #dv-full-screen-container {
  21.   width: 100vw;
  22.   height: 100vh;
  23.   display: flex;
  24.   flex-direction: column;
  25.   background-color: #131a2b;
  26. }
  27. </style>


(4)插件地址http://datav.jiaminghi.com/guide/fullScreenContainer.html

3. 效果图
flashwavel 发表于 2024-8-5 16:50 | 显示全部楼层
感谢博主大大分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

247

主题

257

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

247

主题

257

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部