BI大屏自适应的构建

news/2025/2/13 15:57:29/文章来源:https://www.cnblogs.com/Jesuslovesme/p/18713761

对于大屏自适应,网上有基于Vue编写的大屏自适应逻辑代码,本文讲解如何在一个初始化大屏的页面中使用自适应逻辑代码,以及如何解决自适应后大屏左右两边留白的问题。

首先,在编写的初始化html文件中,需要引入离线版的vue JS包和大屏自适应的js代码:

 1 <script src="./assets/js/frameworkjs/vue-global-prod.js"></script>

  1 <script src="./scale-screen/index.js"></script> 

然后编写js逻辑代码,通过vue挂载根节点,并绑定自定义组件scaleScreen:

 1 <script>
 2     //引入vue 
 3     const { createApp, ref } = Vue;
 4     const app = createApp({
 5         setup() {
 6             return {};
 7         }
 8     });
 9     app.component('scaleScreen', scaleScreen);
10     app.mount('#app');
11 
12 </script>

之后编写在html 中使用<scale-screen>标签把根节点内部的div块整体包起来,html完整代码如下:

 

 1 <!DOCTYPE html>
 2 <html>
 4 <head>
 5     <meta charset="utf-8" />
 6     <meta http-equiv="X-UA-Compatible" content="IE=edge" />
 7     <meta name="description" content="" />
 8     <meta name="viewport" content="width=device-width, initial-scale=1" />
 9      <link rel="stylesheet" href="./assets/css/index.css" type="text/css" />
10 
11     <!-- vue/datav/seamless-scroll资源本地化 -->
12     <script src="./assets/js/frameworkjs/vue-global-prod.js"></script>
15     <script src="./assets/js/frameworkjs/jquery-3.7.1.min.js"></script>
16     <script src="./assets/js/frameworkjs/echarts-4.8.0.min.js"></script>
17 
18     <title>测试总控系统可视化平台</title>
19 </head>
20 
21 <body>
22   <div id="app"><!--用于vue挂载-->
23     <scale-screen>
24      <!--具体的逻辑DIV划分-->
25         <div id="main">
26             <div id="top">
27             hehe
28             </div>
29             <div id="middle">
30                 haha
31             </div>
32             <div id="bottom">
33 ll
34             </div>
35         </div>  
38     </scale-screen>
39   </div>
41 </body>
42 
44 <script src="./scale-screen/index.js"></script>
45 
46 <script>
47     //引入vue 和 datav
48     const { createApp, ref } = Vue;
49 
50     const app = createApp({
51         setup() {
52             return {};
53         }
54     });
55     app.component('scaleScreen', scaleScreen);
56     app.mount('#app');
58 </script>
63 </html>

 

为了看效果,编写index.css代码:

 1 html,
 2 body {
 3   overflow: hidden;
 4   background:#041a21;
 5   width: 100vw;
 6   height: 100vh;
 7 }
 8 
 9 #app,#main
10 {
11   height: 100%;
12   width: 100%;
13   color:aliceblue
14 }
15 
16 #top
17 {
18   border: 1px solid red;
19   width: 99%;
20   height:10%;
21 }
22 
23 #middle
24 {
25   border: 1px solid red;
26   width: 99%;
27   height:86%;
28 }
29 
30 #bottom
31 {
32   border: 1px solid red;
33   width: 99%;
34   height:2%;
35 }

scale-screen下的index.js自适应源码如下(以下代码是咨询了gpt对之前已有的自适应代码修复,解决了大屏页面左右两边留白问题)

  1 const scaleScreen = {
  2     props: {
  3         delay: {
  4             type: Number,
  5             default: 500
  6         },
  7     }, // 声明接收名为 message 的 prop
  8     setup() {
  9         const autoScaleBoleen = true
 10         const screenWrapper = Vue.ref()
 11 
 12         console.log(document.getElementById('screenWrapper'))
 13     
 14         const state = Vue.reactive({
 15             originalWidth: window.innerWidth,
 16             originalHeight: window.innerHeight,
 17         });
 18 
 19         const styles = {
 20             box: {
 21                 overflow: 'hidden',
 22                 backgroundSize: `100% 100%`,
 23                  background: `#000`,
 24                 //background: `#031b37`,
 25                 width: `100vw`,
 26                 height: `100vh`
 27             },
 28             wrapper: {
 29                 transitionProperty: `all`,
 30                 transitionTimingFunction: `cubic-bezier(0.4, 0, 0.2, 1)`,
 31                 transitionDuration: `500ms`,
 32                 position: `relative`,
 33                 overflow: `hidden`,
 34                 zIndex: 100,
 35                 transformOrigin: `left top`
 36             }
 37         };
 38 
 39         const box = Vue.ref();
 40       
 41         /**
 42          * 更新大屏容器宽高
 43          */
 44         const updateSize = () => {
 45             if (screenWrapper.value) {  
 46                 screenWrapper.value.style.width = `${state.originalWidth}px`;  
 47                 screenWrapper.value.style.height = `${state.originalHeight}px`;  
 48             } 
 49         };
 50    
 51         const autoScale = (scale) => {
 52             if (screenWrapper.value) {  
 53                 screenWrapper.value.style.transform = `scale(${scale})`;  
 54                 const mx = (window.innerWidth - (state.originalWidth * scale)) / 2;  
 55                 const my = (window.innerHeight - (state.originalHeight * scale)) / 2;  
 56                 screenWrapper.value.style.margin = `${my}px ${mx}px`;  
 57             }  
 58         };
 59 
 60         const updateScale = () => {  
 61             const currentWidth = window.innerWidth;  
 62             const currentHeight = window.innerHeight;  
 63 
 64             const widthScale = currentWidth / state.originalWidth;  
 65             const heightScale = currentHeight / state.originalHeight;  
 66             const scale = Math.min(widthScale, heightScale);  
 67             autoScale(scale);  
 68         };  
 69 
 70 
 71         const onResize = () => {  
 72             state.originalWidth = window.innerWidth;  
 73             state.originalHeight = window.innerHeight;  
 74             updateSize();  
 75             updateScale();  
 76         }; 
 77 
 78 
 79 
 80         const clearListener = () => {
 81             window.removeEventListener('resize', onResize);
 82             // state.observer?.disconnect();
 83         };
 84 
 85         const addListener = () => {
 86             window.addEventListener('resize', onResize);
 87             // initMutationObserver();
 88         };
 89 
 90         Vue.onMounted(() => {
 91             screenWrapper.value = document.getElementById('screenWrapper')
 92             box.value = document.getElementById('box')
 93 
 94             Vue.nextTick(async () => {
 95                 //await initSize();
 96                 updateSize();
 97                 updateScale();
 98                 addListener();
 99                 // initMutationObserver();
100             });
101         });
102         Vue.onUnmounted(() => {
103             clearListener();
104             // state.observer?.disconnect();
105         });
106         return {
107             styles,
108         };
109     },
110     template: `
111      <section :style="{ ...styles.box }" class="v-screen-box" id="box">
112     <div :style="{ ...styles.wrapper }" class="screen-wrapper" id="screenWrapper">
113       <slot></slot>
114     </div>
115   </section>
116       `,
117 };

 以上使用修复后的自适应代码的效果图,当点击浏览器的放大、缩小或者将大屏移动到分辨率不一样的显示屏,0.5s内都会重新进行自适应

 

附:原有完成项目的自适应左右两边留白问题效果图:

 

附:原有完成项目的自适应留白问题解决效果图:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/883260.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQLserver开启CDC功能

1.查询数据库是否已经开启CDC功能 select is_cdc_enabled,name from sys.databases where name=databasename; 开启为1,未开启为02.库级别开启CDC功能 use databasename GO exec sys.sp_cdc_enable_db 3.再次确认CDC功能是否开启 select is_cdc_enabled,name from sys.databas…

N1Junior

N1JuniorGavatar 核心逻辑如下: upload.php <?php require_once common.php;$user = getCurrentUser(); if (!$user) header(Location: index.php);$avatarDir = __DIR__ . /avatars; if (!is_dir($avatarDir)) mkdir($avatarDir, 0755);$avatarPath = "$avatarDir/{$…

软件自启动取消权限弹窗询问设置

方案1:创建任务计划--启动软件取消UAC权限询问弹窗 1.1 打开任务计划 右键“我的电脑”--“管理”,打开任务计划,如图所示1.2 创建任务计划1.2.1 常规参数设置1.2.2 触发器设置1.2.3 操作设置最后按确定即可完成任务计划创建,至此电脑重启登陆后,软件都会自动启动 方案2:…

hgame 第一周

hgame 第一周Pacman 前端反调试题,找到了一个串.aGFldTRlcGNhXzR0cmdte19yX2Ftbm1zZX0=.base64解码后百思不得其解,后来发现还有一个栅栏加密,纯烂活... hgame{u_4re_pacman_m4ster} BandBomb const express = require(express); const multer = require(multer); const fs = r…

Deepseek学习随笔(2)--- 快速上手DeepSeek

注册与登录 要开始使用 DeepSeek,你需要先注册一个账号。以下是具体步骤:访问 DeepSeek 官网。 使用邮箱或手机号注册账号。 登录后进入控制台,开始使用。控制台功能介绍 DeepSeek 的控制台提供了丰富的功能,帮助你更好地使用工具:对话窗口:在这里输入你的问题或指令,De…

【原创】大数据治理入门(4)《保护数据隐私:大数据治理的最佳实践》入门必看 高赞实用

在大数据治理中,保护数据隐私是至关重要的。通过了解和遵守相关法规,采用数据脱敏、匿名化和隐私计算等技术手段,企业可以有效降低数据隐私泄露的风险,提升用户的信任度和企业的竞争力。希望本文能够为您提供全面的数据隐私保护指南。保护数据隐私:大数据治理的最佳实践 引…

【原创】大数据治理入门(1)《大数据治理入门:为什么重要?》入门必看 高赞实用

随着互联网的快速发展,数据的生成和积累速度达到了前所未有的水平。大数据通常被定义为规模巨大、类型多样且生成速度快的数据集合。这些数据不仅包括结构化数据(如数据库中的表格数据),还包括非结构化数据(如文本、图片、视频等)。大数据的重要性在于其能够帮助企业更好…

【MySQL安全】复现Mysql LOAD DATA 读取客户端任意文件漏洞

前言 MySQL 客户端和服务端通信过程中是通过对话的形式来实现的,客户端发送一个操作请求,然后服务端根据客户端发送的请求来响应客户端,在这个过程中客户端如果一个操作需要两步才能完成,那么当它发送完第一个请求过后并不会存储这个请求,而是直接丢弃,所以第二步就是根据…

线程/进程

进程 1.是资源分配的基本单元 2.拥有独立的内存空间和资源 3.开销较大 4.稳定性高,一个进程的崩溃不会影响其他的进程 线程 1.是cpu调度的基本单元 2.共享进程的资源 3.开销较小 4.稳定性不高,一个线程崩溃可能会导致其他线程的崩溃当我们写完一个线程之后可以通过idea的安装…

nginx代理grafana配置

配置grafna的nginx代理配置环境背景:监控系统用的是Prometheus+altermanager+grafana+xxx-exporter实现的,现在业界内的夜莺监控系统已经非常的成熟了,使用夜莺管理配置监控相对比Prometheus+altermanager要友好很多,使用也方便,直接页面配置就好。但是相对图表化的监控信…

IPD流程管理之市场需求精准把握方法

IPD(Integrated Product Development)流程管理旨在通过整合产品开发的各个环节,实现高效、高质量的产品交付。在这一过程中,精准把握市场需求是成功的关键。只有深入了解市场需求,企业才能开发出符合客户期望的产品,从而在激烈的市场竞争中占据优势。本文将详细探讨IPD流…

VSCode 搭建 MySQL 源码调试环境

在使用MySQL数据库的过程中,如果遇到一些复杂的问题,可以通过GDB进行调试,本篇将演示如何在Win 10环境基于VSCode搭建MySQL源码调试环境。 一、调试环境 本次调试需要用到的软件和环境为:Red Hat Enterprise Linux release 8.10 (Ootpa) MySQL 8.0.40 VSCode 1.96.4二、编译…