我一人全干!之vue3后台管理中的大屏展示。

使用大屏展示的时候有很多种场景,众多场景都是为了实现大屏自适应。
大屏,顾名思义,就是放在一个固定的屏幕上看的,即使你不做自适应,放在一个固定的屏幕上看也没啥问题,但是很多做大屏的是为了在PC端看,PC端屏幕又是参差不齐的,所以需要做自适应。
毒蘑菇后台管理

方案一:
使用transform的大小缩放来实现,我们先写一个缩放容器AutoScalContainer.vue,代码如下:

<template><div class="auto-scal-container"ref="AutoScalContainerRef"><div ref="DomRef" class="auto-scal-container-inner"><slot></slot></div></div>
</template><script>
/** * 自动缩放容器* 使用transform进行缩放*  */
import { defineComponent,ref,getCurrentInstance,reactive,toRef, computed,onMounted,onActivated,watch,onBeforeUnmount,
} from "vue";export default defineComponent({props:{width:{type:Number,default:1920,},height:{type:Number,default:1080,},/** 内部容器的宽高比例 */ratio:{type:Number,default:1920 / 1080,},/** * fit,原理同img的object-fit* contain : 被替换的内容将被缩放,以在填充元素的内容框时保持其宽高比。* cover : 被替换的内容在保持其宽高比的同时填充元素的整个内容框。如果对象的宽高比与内容框不相匹配,该对象将被剪裁以适应内容框。*  */fit:{type:String,default:'contain',},},emits:['onResizeScreen'],setup(props,{emit}){const DomRef = ref(null);  //组件实例const AutoScalContainerRef = ref(null);  //组件实例const dataContainer = reactive({height:toRef(props,'height'),width:toRef(props,'width'),ratio:toRef(props,'ratio'),fit:toRef(props,'fit'),});/** 是否是文档上 */function isActive(){if(!DomRef.value) return false;return DomRef.value.getRootNode() === document;}/** 自动缩放 */function autoResizeScreen(){if(!AutoScalContainerRef.value) return;if(!DomRef.value) return;if(!isActive) return;let rect = AutoScalContainerRef.value.getBoundingClientRect();let clientWidth = rect.width;let clientHeight = rect.height;var width = dataContainer.width;var height = dataContainer.height;let left = 0;let top = 0;let scale = 0;/** 使用外部传入的比例或者传入的宽高计算比例 */let ratio = dataContainer.ratio || (width / height);// 获取比例  可视化区域的宽高比与 屏幕的宽高比  来进行对应屏幕的缩放if(dataContainer.fit == 'contain'){if ((clientWidth / clientHeight) > ratio) {scale = clientHeight / height;top = 0;left = (clientWidth - width * scale) / 2;} else {scale = clientWidth / width;left = 0;top = (clientHeight - height * scale) / 2;}}if(dataContainer.fit == 'cover'){if ((clientWidth / clientHeight) > ratio) {scale = clientWidth / width;} else {scale = clientHeight / height;}}// 防止组件销毁后还执行设置状态sObject.assign(DomRef.value.style, {transform: `scale(${scale})`,left: `${left}px`,top: `${top}px`,});/** 向外部通知已经计算缩放 */emit('onResizeScreen');}/** 防抖 */let timer_1;function fnContainer(){clearTimeout(timer_1);// timer_1 = setTimeout(()=>{autoResizeScreen();// },16);}let timer = setInterval(()=>{fnContainer();},300);onMounted(() => {autoResizeScreen();});window.addEventListener('resize', fnContainer);onBeforeUnmount(() => {window.removeEventListener('resize', fnContainer);window.clearInterval(timer);});return {dataContainer,DomRef,AutoScalContainerRef,};},
});
</script><style lang="scss" scoped>
.auto-scal-container {width: 100%;height: 100%;position: relative;overflow: auto;/** 隐藏滚动条 */-ms-overflow-style: none;scrollbar-width: none;&::-webkit-scrollbar {display: none;}>.auto-scal-container-inner {overflow: hidden;transform-origin: left top;z-index: 999;width: max-content;height: max-content;position: absolute;top: 0;left: 0;}
}
</style>

使用方式

<script>
/** * 大屏主页面* 采用缩放的形式进行适配,搭配rem的话很方便实用*  */
import { defineComponent,ref,getCurrentInstance,reactive,toRef, computed,onMounted,onActivated,watch } from "vue";
import AutoScalContainer from "@/components/AutoScalContainer.vue";
import ViewHead from "./components/ViewHead.vue";
import img_1 from "./assets/bg.png";
import img_2 from "./assets/1-1-bg.png";
import Box_1 from "./components/Box_1.vue";
import Box_2 from "./components/Box_2.vue";
import Box_3 from "./components/Box_3.vue";
import Box_4 from "./components/Box_4.vue";
import Box_5 from "./components/Box_5.vue";
import Box_6 from "./components/Box_6.vue";
import { useRoute } from "vue-router";export default defineComponent({name:'BigScreenView',components: {AutoScalContainer,ViewHead,Box_1,Box_2,Box_3,Box_4,Box_5,Box_6,},setup(){let route = useRoute();const dataContainer = reactive({loading:false,img:{img_1,img_2,},fit:'contain',}); watch(route,()=>{let queryParams = route.query || {};let fitMap = {'cover':'cover','contain':'contain',};dataContainer.fit = fitMap[queryParams.fit] || 'contain';},{immediate:true,});return {dataContainer,};},
});
</script><template><div class="big-screen-view"><AutoScalContainer:height="1080":width="1920":fit="dataContainer.fit"><div class="big-screen-view-container":style="{'--bg-img-1':`url(${dataContainer.img.img_1})`,'--bg-img-2':`url(${dataContainer.img.img_2})`,}" ><div class="head"><ViewHeadtitle="数据可视化大屏展示"></ViewHead></div><div class="content"><div class="top"><Box_1></Box_1> </div><div class="content"><div class="left"><div class="box"><Box_2></Box_2> </div><div class="box"><Box_3></Box_3> </div></div><div class="right"><div class="box"><Box_4></Box_4> </div><div class="box"><Box_5></Box_5> </div></div></div></div><div class="centre-box"><div class="v-height"></div><div class="container"><Box_6></Box_6> </div></div></div></AutoScalContainer></div>
</template><style lang="scss" scoped>
.big-screen-view{width: 100vw;height: 100vh;overflow: hidden;background-color: #031045c7;.big-screen-view-container{width: 1920px;height: 1080px;background-color: rgb(169, 169, 169);display: flex;flex-direction: column;background-image: var(--bg-img-1);background-repeat: no-repeat;background-size: 100% 100%;background-position: center;position: relative;>.head{height: 91px;position: relative;z-index: 2;}>.content{display: flex;flex-direction: column;flex: 1 1 0;width: 100%;height: 0;position: relative;z-index: 2;pointer-events: none;>.top{width: 100%;height: 199px;pointer-events: initial;}>.content{display: flex;flex-direction: row;justify-content: space-between;flex: 1 1 0;width: 100%;height: 0;padding: 0 15px 15px 15px;box-sizing: border-box;>.left,>.right{display: flex;flex-direction: column;>.box{width: 100%;flex: 1 1 0;height: 0;background-image: var(--bg-img-2);background-repeat: no-repeat;background-size: 100% 100%;background-position: center;margin: 0 0 15px 0;pointer-events: initial;&:last-child{margin: 0;}}}>.left{height: 100%;width: 550px;}>.right{height: 100%;width: 550px;}}}>.centre-box{position: absolute;top: 0;left: 0;width: 100%;height: 100%;z-index: 1;display: flex;flex-direction: column;>.v-height{width: 100%;height: 270px;}>.container{flex: 1 1 0;height: 0;width: 100%;}}}
}
</style>

好了,一个用transfor缩放的例子就完成了,使用rem的例子以后为大家讲解
源码
DEMO

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

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

相关文章

Everything进行内网穿透搜索

文章目录 1\. 部署内网穿透1.1. 注册账号1.2. 登录1.3. 创建隧道 2\. 从外网访问Everything 借助cpolar可以让我们在公网上访问到本地的电脑 1. 部署内网穿透 1.1. 注册账号 在使用之前需要先进行注册cpolar cpolar secure introspectable tunnels to localhost 1.2. 登录 C…

AOP记录操作日志

创建数据库表 -- 操作日志 create table operate_log (id int unsigned primary key auto_increment commentid,operate_user int unsigned comment 操作人员Id,operate_time datetime comment 操作时间,class_name varchar(100)comment 操作类,method_name varchar(100)comme…

外包干了2个月,技术倒退2年。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;20年通过校招进入深圳某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年国庆&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

Python 日志(略讲)

日志操作 日志输出&#xff1a; # 输出日志信息 logging.debug("调试级别日志") logging.info("信息级别日志") logging.warning("警告级别日志") logging.error("错误级别日志") logging.critical("严重级别日志")级别设置…

vue中的动画组件使用及如何在vue中使用animate.css

“< Transition >” 是一个内置组件&#xff0c;这意味着它在任意别的组件中都可以被使用&#xff0c;无需注册。它可以将进入和离开动画应用到通过默认插槽传递给它的元素或组件上。进入或离开可以由以下的条件之一触发&#xff1a; 由 v-if 所触发的切换由 v-show 所触…

一个容器中填值,值太多不换行,而是调小字体大小和行高

<!-- clampLineHeight 重计算行高 --> <!-- clampTextSize 重计算字体大小 --> <!-- 这里的div高8mm, 宽6cm, 文本为text --> <div style"height:8mm;width:6cm;text-align:left"><span :style"{ fontSize: clampTextSize(text, 6cm…

智慧小区园区如何布局网络对讲系统

智慧小区园区如何布局网络对讲系统 随着小区住宅的不断更新发展&#xff0c;小区的管理人员也对小区内部的通讯也有了新的要求&#xff0c;要求在工作区域无盲区、语音通讯清晰&#xff0c;小区的安保后勤都能够随时在小区的地下室和室外工作区域、任何时间进行通信。提高小区…

【Linux】信号的保存和捕捉

文章目录 一、信号的保存——信号的三个表——block表&#xff0c;pending表&#xff0c;handler表sigset_t信号集操作函数——用户层sigprocmask和sigpending——内核层 二、信号的捕捉重谈进程地址空间&#xff08;第三次&#xff09;用户态和内核态sigaction可重入函数volat…

6个实用又好用的交互原型工具!

在 UI/UX 设计中&#xff0c;原型设计是至关重要的一步。正如用户体验中的其它环节一样&#xff0c;有无数的交互原型工具可以帮助你完成原型设计。市场上有太多的交互原型工具&#xff0c;如果你不知道选择哪一种&#xff0c;那么我们将为你介绍 6 个实用又好用的交互原型工具…

【数据挖掘】国科大刘莹老师数据挖掘课程作业 —— 第二次作业

Written Part 1. 给定包含属性&#xff5b;Height, Hair, Eye&#xff5d;和两个类别&#xff5b;C1, C2&#xff5d;的数据集。构建基于信息增益&#xff08;info gain&#xff09;的决策树。 HeightHairEyeClass1TallBlondBrownC12TallDarkBlueC13TallDarkBrownC14ShortDark…

Unity UGUI控件之Horizontal Layout Group

Horizontal Layout Group是Unity中的UGUI控件&#xff0c;用于在水平方向上对子对象进行布局。 主要有一下作用&#xff1a; 水平布局&#xff1a;Horizontal Layout Group将子对象按照水平方向进行布局&#xff0c;可以控制子对象的排列顺序和间距。自动调整尺寸&#xff1a…

孩子都能学会的FPGA:第二十二课——用FPGA实现计数时钟的奇数次分频

&#xff08;原创声明&#xff1a;该文是作者的原创&#xff0c;面向对象是FPGA入门者&#xff0c;后续会有进阶的高级教程。宗旨是让每个想做FPGA的人轻松入门&#xff0c;作者不光让大家知其然&#xff0c;还要让大家知其所以然&#xff01;每个工程作者都搭建了全自动化的仿…

记录 | linux静态库和动态库的理解

hello.cpp&#xff1a; #include <cstdio>void hello() {printf("Hello, world!\n"); }main.cpp&#xff1a; #include <cstdio>void hello();int main() {hello();return 0; }静态库编译配置&#xff1a; cmake_minimum_required(VERSION 3.12) proj…

三轴加速度计LIS2DW12开发(2)----基于中断信号获取加速度数据

三轴加速度计LIS2DW12开发.2--轮基于中断信号获取加速度数据 概述视频教学样品申请源码下载生成STM32CUBEMX串口配置IIC配置CS和SA0设置INT1设置串口重定向参考程序初始换管脚获取ID复位操作BDU设置开启INT1中断设置传感器的量程配置过滤器链配置电源模式设置输出数据速率中断…

FTP协议(PORT和PASV模式)

目录 FTP协议基本概念 PORT主动模式工作流程 PORT工作过程 PORT工作报文 PASV被动模式工作流程 PASV工作过程 PASV工作报文 FTP协议基本概念 FTP文件传输协议&#xff0c;用于在互联网上进行文件传输&#xff0c;基于C/S架构 FTP的连接模式 FTP采用双TCP连接方式 控制连…

[架构之路-254]:目标系统 - 设计方法 - 软件工程 - 软件设计 - 架构设计 - 全程概述

目录 一、软件架构概述 1.1 什么是软件架构 1.2 为什么需要软件架构设计 1.3 软件架构设计在软件设计中位置 &#xff08;1&#xff09;软件架构设计&#xff08;层次划分、模块划分、职责分工&#xff09;&#xff1a; &#xff08;2&#xff09;软件高层设计、概要设计…

Ubuntu22.04 server版本关闭DHCP,手动设置ip

在Ubuntu 22.04 中&#xff0c;网络配置已迁移到 Netplan&#xff0c;因此可以使用 Netplan 配置文件来手动设置 IP 地址并关闭 DHCP。 以下是在 Ubuntu 22.04 上手动设置 IP 地址并禁用 DHCP 的步骤&#xff1a; 打开终端&#xff0c;使用 root 权限或 sudo 执行以下命令&…

柯桥英语口语学习,日常生活用语军大衣用英语怎么说?

那么军大衣跟羽绒服用英语怎么说呢&#xff1f; 跟商英君一起学习一下吧&#xff01; 01 "军大衣"用英语怎么说&#xff1f; 军大衣在英语表达中 也有专门的词汇 即military coat 或 military style cotton coats military有“军人、军事;军事的、军用的…”的…

子查询在SQL中的应用和实践

作者&#xff1a;CSDN-川川菜鸟 在SQL中&#xff0c;子查询是一种强大的工具&#xff0c;用于解决复杂的数据查询问题。本文将深入探讨子查询的概念、类型、规则&#xff0c;并通过具体案例展示其在实际应用中的用途。 文章目录 子查询概念子查询的类型子查询的规则实际案例分析…

Android Studio Giraffe-2022.3.1-Patch-3安装注意事项

准备工作&#xff1a; android studio下载地址&#xff1a;https://developer.android.google.cn/studio/releases?hlzh-cn gradle下载地址&#xff1a;https://services.gradle.org/distributions/ 比较稳定的网络环境&#xff08;比较android studio相关的依赖需要从谷歌那边…