基于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.DomReflet clientWidth = rect.widthlet clientHeight = rect.heightvar width = this.widthvar height = this.heightlet left = 0let top = 0let scale = 0let 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)

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

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

相关文章

string字符串进行分割

c标准库中&#xff0c;对string字符串并没有提供分割操作&#xff0c;需要自己手动实现此功能。 方式1&#xff1a; 采用 std::stringstream 输入字符串&#xff0c;通过getline()函数&#xff0c;来对字符串进行分割。 #include <sstream>void getSplit(std::string s…

探究前端路由hash和history的实现原理(包教包会)

今天我们来讲一讲前端中很重要的一个部分路由&#xff08;router&#xff09;&#xff0c;想必前端小伙伴对‘路由’一词都不会感到陌生。但是如果哪天面试官问你&#xff0c;能大概说一说前端路由的实现原理吗&#xff1f; 你又会如何应对呢&#xff1f; 今天勇宝就带着大家一…

移动端WEB开发之响应式布局推特

1&#xff0c;响应式开发 1.1 响应式开发原理 就是使用媒体查询针对不同宽度的设备进行布局和样式的设置&#xff0c;从而适配不同设备的目的 设备划分 尺寸区间 超小屏幕&#xff08;手机&#xff09; …

项目技术栈-解决方案-消息队列

项目技术栈-解决方案-消息队列 概念应用场景1. 异步处理 参考文章消息队列&#xff08;Message Queue&#xff09; 概念 “消息”是在两台计算机间传送的数据单位。 消息可以非常简单&#xff0c;例如只包含文本字符串&#xff1b; 也可以更复杂 &#xff0c;包括对象等。 队…

springboot+maven项目导入本地jar包,以有打包错误问题

1 本地jar包放置路径为&#xff1a; 2添加Modules File->project settings–>Modules–>Dependencies–>–>, 3 添加 Libraies 至此 项目即可成功运行。 mvn 打包错误&#xff0c;需要 运行以下命令 mvn install:install-file -Dfile${project.basedir}/s…

element-plus+vue3项目(侧边栏菜单的使用和历史记录切换问题的解决(高点效果对应不上))

一、使用element-plus的菜单,侧边栏类型 导入element-plus,安装方式有如下几种: # 选择一个你喜欢的包管理器# NPM $ npm install element-plus --save# Yarn $ yarn add element-plus# pnpm $ pnpm install element-plus 在main.js引入和使用: import { createApp } f…

特斯拉一面算法原题

来自太空的 X 帖子 埃隆马斯克&#xff08;Elon Musk&#xff09;旗下太空探索技术公司 SpaceX 于 2 月 26 号&#xff0c;从太空往社交平台 X&#xff08;前身为推特&#xff0c;已被马斯克全资收购并改名&#xff09;发布帖子。 这是 SpaceX 官号首次通过星链来发送 X 帖子&a…

【Acwing】差分矩阵

图1&#xff1a;a和b数组映射表 由于a是b的前缀和数组&#xff0c;因此改变b[ x1][ y1]之后&#xff0c;受到影响的a中元素如右半图所示 图2&#xff1a;求b数组的前缀和 #include<bits/stdc.h> using namespace std;int n,m,q; int a[1010][1010]; int b[1010][1010]…

Vue概念详解【目录】

本专栏简介&#xff1a; 这个专栏是关于 Vue2 和 Vue3 各种概念的大集合&#xff01;它深入挖掘原理&#xff0c;分析各种优势和劣势&#xff0c;适配各种应用场景&#xff0c;部分内容还列出了代码示例&#xff0c;以清晰地讲述原理。在这里&#xff0c;你将全面了解 Vue2 和…

B端系统:故障页面设计,告知用户接下来怎么办?

Hi&#xff0c;大家好&#xff0c;我是贝格前端工场&#xff0c;从事8年前端开发的老司机。很多B端系统体验不好很大一部分原因在于设计不合理&#xff0c;让用户无所适从&#xff0c;大大降低了操作体验&#xff0c;本文着重分析B端系统的故障页面如何设计&#xff0c;欢迎老铁…

基于springboot实现二次元商品购物系统项目【项目源码+论文说明】

基于springboot实现二次元商品购物系统演示 摘要 时代的变化速度实在超出人类的所料&#xff0c;21世纪&#xff0c;计算机已经发展到各行各业&#xff0c;各个地区&#xff0c;它的载体媒介-计算机&#xff0c;大众称之为的电脑&#xff0c;是一种特高速的科学仪器&#xff0…

Vue 组件和插件:探索细节与差异

查看本专栏目录 关于作者 还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#x…