数据可视化大屏自适应,保持比例不变形,满足不同分辨率的需求——利用transform的scale属性缩放,缩放整个页面。

文章目录

        • 一、需求背景:
        • 二、需求分析:
        • 三、选择方案:
        • 四、实现代码:
        • 五、效果预览:
        • 六、封装组件:

一、需求背景:

数据可视化大屏是一种将数据、信息和可视化效果集中展示在一块或多块大屏幕上的技术。通过各种图形、图表、数据可视化等方式,将复杂的数据和信息变得直观、易懂,让人们能够快速地了解数据和信息的含义。

应对现在数据可视化的趋势,越来越多企业需要在很多场景(营销数据,生产数据,用户数据)下使用,可视化图表来展示体现数据,让数据更加直观,数据特点更加突出。

根据不同的业务场景,做一个好的大屏需要考虑大屏布局、图表展现、交互动效、操作是否简单、是否能自适应等等因素。其中大屏是否能自适应也是一个比较重要的因素。

在做可视化大屏时,大屏的分辨率基本都是固定死的,因此我们只需要把页面按照设计稿尺寸写死即可,但是我们开发屏幕很小,这时候总要将浏览器进行缩小,这里给出一个通用方法,供大家使用,无需缩放浏览器。

二、需求分析:

本示例按照1920*1080的分辨率来写,也就是16:9的比例。你也可以替换成你自己的分辨率。效果是一样的。

做大屏项目时,需要适配不同屏幕,且在任意屏幕下保持16:9的比例,保持显示效果一致,屏幕比例不一致两边留白即可。

不同屏幕宽高比例(和设计稿16:9)相比会有两种情况:

  • 更宽:(Width / Height) > 16/9,以高度为基准,去适配宽度。

  • 更高:(Width / Height) < 16/9,以宽度为基准,去适配高度。

三、选择方案:

首先我们严格按照给定的UI设计稿的宽高尺寸画页面。然后我们再去计算一下放大或者缩小的倍数。

这时候要注意了,因为每块屏幕不一样,所以这个缩放的数值不是个固定的值,所以是个变量。这时候我们就要进入页面的时候计算出来这个缩放值。

利用transform的scale属性缩放,缩放整个页面。

我们还使用transform-origin属性将缩放的中心点设置为左上角,以确保大屏幕按比例缩放。

四、实现代码:

1、新建autoResizeScreenMixin.js

export default {
    data() {
        return {
            width: 1920,
            height: 1080,
        }
    },
    mounted() {
        this.autoResizeScreen();
        window.addEventListener('resize', this.autoResizeScreen);
    },
    methods: {
        autoResizeScreen() {
            let rect = this.$refs.AutoScalContainerRef.getBoundingClientRect()
            let DomRef = this.$refs.DomRef
            let clientWidth = rect.width
            let clientHeight = rect.height
            var width = this.width
            var height = this.height
            let left = 0
            let top = 0
            let scale = 0
            let ratio = width / height;
            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;
            }
            Object.assign(DomRef.style, {
                transform: `scale(${scale})`,
                left: `${left}px`,
                top: `${top}px`,
            });
        }
    },
    beforeDestroy() {
        window.removeEventListener('resize', this.autoResizeScreen);
    },
}

2、在app.vue的页面下使用

<template>
  <div id="app">
    <div class="auto-scal-container" ref="AutoScalContainerRef">
      <div ref="DomRef" class="auto-scal-container-inner">
        <router-view />
      </div>
    </div>
  </div>
</template>

<script>
import autoResizeScreenMixin from '@/utils/autoResizeScreenMixin ';
export default {
  mixins: [autoResizeScreenMixin]
}
</script>

3、在HomeView.vue页面写大屏代码布局

<template>
  <div class="custom-big-box">
    <div class="top">头部</div>
    <div class="bot">
      <div class="left">左侧</div>
      <div class="mid">
        <div class="midtop">卡片</div>
        <div class="midbot">地图</div>
      </div>
      <div class="right">右侧</div>
    </div>
  </div>
</template>

<script>
export default {

}
</script>

<style>
.custom-big-box {
  width: 1920px;
  height: 1080px;
  font-size: 26px;
  color: #fff;
  text-align: center;
  line-height: 100px;
}

.top {
  width: 100%;
  height: 100px;
  background-color: #409EFF;
}

.bot {
  padding: 20px;
  padding-top: 0;
  display: flex;
  height: 980px;
  background-color: #DCDFE6;
}

.left {
  width: 400px;
  height: 960px;
  background-color: #67C23A;
}

.mid {
  width: 1080px;
  height: 960px;
}

.right {
  width: 400px;
  height: 960px;
  background-color: #E6A23C;
}

.midtop {
  height: 100px;
  width: 100%;
  background-color: #F56C6C;
}

.midbot {
  width: 100%;
  height: 860px;
  background-color: #909399;
}
</style>
五、效果预览:
  • 效果预览合适的分辨率:
    在这里插入图片描述

  • 效果预览更宽:
    在这里插入图片描述

  • 效果预览更高:

在这里插入图片描述

六、封装组件:

当然你也可以封装个组件来使用。

我这边上传了一个我封装好的组件示例。在顶部可以下载。

可以在一个项目里面,使用不同分辨率或比例的大屏页面。

这里我做了3中比例的示例演示:(16:9的,4:3的,不规则的)

通过传参width,height即可适应缩放。

代码里面创建了AutoScalContainer组件,建了3个示例页面,演示不同分辨率或比例的大屏页面的效果。

  • AboutView.vue是1920*1080的分辨率大屏页面(16:9)
  • HomeView.vue是8400*3150的分辨率大屏页面(不规则)
  • HelloWorld.vue是1024*768的分辨率大屏页面(4:3)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

项目中使用iframe引入html 解决路由错乱问题以及父子组件传值调用方法

iframe与外部之间传值 父组件 <iframeid"iframe"src"luckysheet/index.html"frameborder"0"scrolling"no"style"width: 100%; height: 60vh; border: 0"/>const frame document.getElementById(iframe);frame.onloa…

8. 《自动驾驶与机器人中的SLAM技术》基于保存的自定义NDT地图文件进行自动驾驶车辆的激光定位

目录 1. 为 NDT 设计一个匹配度评估指标&#xff0c;利用该指标可以判断 NDT 匹配的好坏。 2. 利用第 1 题的指标&#xff0c;修改程序&#xff0c;实现 mapping 部分的回环检测。 3. 将建图结果导出为 NDT map&#xff0c;即将 NDT 体素内的均值和协方差都存储成文件。 4.…

学习记录11-SPI通信(软件)

目录 前言 一、引脚定义 二、代码 1.初始化 2.操作代码 三、验证 前言 对SPI进行结构封装&#xff0c;方便使用。方便讲解&#xff0c;用W&#xff12;&#xff15;Q&#xff16;&#xff14;芯片进行讲解 一、引脚定义 #define SPI_CS_PROT GPIOB //CS接线引脚通道…

CAN总线记录仪在车企服务站的应用

CAN总线记录仪在车企服务站的应用 CAN总线记录仪在车企服务站中有着广泛的应用。这种设备可以记录车上的CAN总线数据&#xff0c;方便工程师进行分析&#xff0c;以找出可能存在的问题。CAN记录仪一般采用TF卡来存储数据&#xff0c;实现离线脱机实时存储。数据存储完毕后&…

【python】12.字符串和正则表达式

使用正则表达式 正则表达式相关知识 在编写处理字符串的程序或网页时&#xff0c;经常会有查找符合某些复杂规则的字符串的需要&#xff0c;正则表达式就是用于描述这些规则的工具&#xff0c;换句话说正则表达式是一种工具&#xff0c;它定义了字符串的匹配模式&#xff08;…

node各个版本的下载地址

下载地址&#xff1a; https://nodejs.org/dist/ 可以下载多个版本&#xff0c;使用nvm控制切换&#xff08;需要先安装nvm再安装node&#xff09; nvm下载地址&#xff08;访问的是github&#xff0c;请科学上网&#xff0c;下载后解压安装exe即可&#xff09;&#xff1a;h…

照片删除了还有救,19 款最佳免费照片恢复软件方法分享!

如果您曾经丢失过数字文件&#xff0c;那将是一种熟悉的感觉。也许您不小心删除了照片。或者&#xff0c;也许某些文件只是消失了。不管结果如何&#xff0c;都令人心碎。 不过&#xff0c;这个故事不需要有一个悲伤和遗憾的结局。现在有许多不同品牌的照片恢复软件可以挽救局…

《吐血整理》保姆级系列教程-玩转Fiddler抓包教程(7)-Fiddler状态面板-QuickExec命令行

1.简介 Fiddler成了网页调试必备的工具&#xff0c;抓包看数据。Fiddler自带命令行控制&#xff0c;并提供以下用法。Fiddler的快捷命令框让你快速的输入脚本命令。 除了输入默认命令&#xff0c;也可以自定义命令&#xff0c;你可以通过编辑 FiddlerScript 来增加新命令&…

Android-常用数据结构和控件

HashMap 的原理 HashMap 的内部可以看做数组链表的复合结构。数组被分为一个个的桶(bucket)。哈希值决定了键值对在数组中的寻址。具有相同哈希值的键值对会组成链表。需要注意的是当链表长度超过阈值(默认是8)的时候会触发树化&#xff0c;链表会变成树形结构。 把握HashMap的…

C练习——肇事卡车车牌号

题目&#xff1a; 一辆卡车违反交通规则&#xff0c;撞人后逃跑。现场有3人目击事件&#xff0c;但没有记住车牌号&#xff0c;只记住了车号的一些特征。 甲说&#xff1a;“牌照前两位数字是相同的”&#xff0c;乙说&#xff1a;“牌照的后两位数字是相同的&#xff0c;但与…

网络安全技术新手入门:利用Kali Linux生成简单的远程控制木马

目录 前言 一、生成远控木马 二、传播木马&#xff08;现实中通过免杀技术进行传播&#xff0c;此文章为新手入门教程&#xff0c;故通过关闭杀毒程序的方法让初学者熟悉流程&#xff09; 三、配置攻击模块 四、进行远程控制 五、建议 前言 相关法律声明&#xff1a;《中…

ERA5数据集解算Tm(水汽加权平均温度)

Part1 Tm&#xff08;代码获取方式在文章最后&#xff09; Tm 是 GNSS 反演 PWV 的关键性因素&#xff0c;由 Tm 可以求得转换因素 Π&#xff0c;Π*ZWD&#xff08;天顶湿延迟&#xff09;可以的得到 PWV。 Part 2Tm 的计算方法 Tm 的计算方法有两种&#xff0c;下面进行分…

C#编程-使用事件

使用事件 事件是一个动作或发生的事情,例如:鼠标点击、按键、鼠标移动或系统产生的通知。应用程序可以在事件发生的时候做出响应。通知的一个示例是中断。事件是对象发生的消息以表示事件的发生。事件是进程内通信的有效方法。它们对对象时有用的,因为它们标识了单个状态改…

swing快速入门(四十四)拖动、编辑JTree结点

注释很详细&#xff0c;直接上代码 新增内容&#xff08;源码细节知识点巨多&#xff0c;建议细看&#xff09; 1.设置JTree可编辑 2.使用JTree关联的数据模型实现节点的增删改 3.鼠标拖动节点事件设计及处理方法 4.手动刷新视图与自动刷新的方法区别 5.自定位节点视图方法 源码…

【Redis集群】docker实现3主3从扩缩容架构配置案例

一&#xff0c;集群规划及准备工作 架构实现&#xff1a;Redis3主3从 二&#xff0c;搭建命令 第一步&#xff0c;创建6台服务&#xff1a; docker run -d --name redis-node-1 --net host --privilegedtrue -v /data/redis/share/redis-node-1:/data redis:6.0.8 --clust…

单表的查询练习

一、单表查询 素材&#xff1a; 表名&#xff1a;worker-- 表中字段均为中文&#xff0c;比如 部门号 工资 职工号 参加工作 等 显示所有职工的基本信息。 mysql8.0 [chap03]>select * from worker; 查询所有职工所属部门的部门号&#xff0c;不显示重复的部门号。 mysq…

geemap学习笔记047:边缘检测

前言 边缘检测适用于众多的图像处理任务&#xff0c;除了上一节[[geemap046&#xff1a;线性卷积–低通滤波器和拉普拉斯算子|线性卷积]]中描述的边缘检测核之外&#xff0c;Earth Engine 中还有几种专门的边缘检测算法。其中Canny 边缘检测算法使用四个独立的滤波器来识别对角…

如何通过Burp Suite专业版构建CSRF PoC

Burp Suite是一款强大的渗透测试利器&#xff0c;可以利用它来高效的执行渗透攻击&#xff0c;接下来介绍如何通过Burp Suite Pro来构建CSRF PoC。 如果还没安装burp suite&#xff0c;请参阅【Burp Suite专业版本安装配置及使用指导 】 在Bupr中找到拦截的请求&#xff0c;右…

时序分解 | Matlab实现SMA-CEEMDAN利用黏菌优化算法优化CEEMDAN时间序列信号分解

时序分解 | Matlab实现SMA-CEEMDAN利用黏菌优化算法优化CEEMDAN时间序列信号分解 目录 时序分解 | Matlab实现SMA-CEEMDAN利用黏菌优化算法优化CEEMDAN时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 SMA-CEEMDAN利用黏菌优化算法优化CEEMDAN Matlab语言…