如何实现ECharts图表根据屏幕大小自适应?

​🌈个人主页:前端青山
🔥系列专栏:Vue篇
🔖人终将被年少不可得之物困其一生

依旧青山,本期给大家带来Vue篇专栏内容:Vue-ECharts自适应

目录

前言

1920*1080分辨率示图

8184*2432分辨率示图 

以vue3+ts开发为例

(一)Echarts Resize 方法

(二)window.addEventListener事件监听方法

(三)根据浏览器窗口的宽度动态计算字体大小

注意

  • 前言

嘿,小伙伴们!是不是有时候你会遇到这样的烦恼:好不容易做好的图表,在不同的设备上显示效果就变了样,要么字太小看不清,要么图太大撑破边框?最近作者也是接到了这么一个需求,既要满足1920*1080分辨率,又得适应超大屏幕8184*2432分辨率,,别急,今天咱们就聊聊如何让你的图表——尤其是用 Vue 和 ECharts 做的那些——在各种屏幕大小下都能保持最佳状态

1920*1080分辨率示图

8184*2432分辨率示图 

以vue3+ts开发为例
<template><div ref="hydrologyChart" style="width: 100%; height: 100%;"></div>
</template>

通过ref属性"hydrologyChart",并设置样式为宽度100%,高度100%。方便撑满父组件盒子宽高

// 使用 ref 创建响应式引用
const hydrologyChart = ref<HTMLElement | null>(null);
const zgrwczqktance = ref<echarts.ECharts | any>(null);
  • hydrologyChart是一个对HTML元素的引用,初始值为null。它可以通过.value属性来获取或设置对应的元素。
  • zgrwczqktance是一个对echarts图表实例的引用,初始值为null。它可以通过.value属性来获取或设置对应的图表实例。

此后在onMounted钩子函数中使用nextTick函数在DOM更新后执行初始化图表

onMounted(() => {if (hydrologyChart.value) {nextTick(() => {zgrwczqktance.value = echarts.init(hydrologyChart.value);// 初始化图表时使用空数据zgrwczqktance.value.setOption(defaultOption);
})
(一)Echarts Resize 方法

ECharts Resize 方法解释

在 ECharts 中, myChart.resize() 方法用于使图表自适应其容器的新尺寸。当图表所在的容器大小发生变化时(例如,浏览器窗口被调整大小,或者图表所在元素的尺寸发生改变),需要调用此方法来确保图表能够正确地填充新的可用空间。

故此,我们可以先尝试在onMounted钩子函数中调用此方法

onMounted(() => {if (hydrologyChart.value) {nextTick(() => {zgrwczqktance.value = echarts.init(hydrologyChart.value);// 初始化图表时使用空数据zgrwczqktance.value.setOption(defaultOption);zgrwczqktance.value.resize();//调用自适应方法
})
(二)window.addEventListener事件监听方法
onMounted(() => {......其余代码...// 添加窗口大小变化的监听器window.addEventListener('resize', function(){nextTick(() => {resizeHandler();});})
})const resizeHandler = () => {if(zgrwczqktance.value){zgrwczqktance.value.resize();}updateFontSize();};// 监听窗口大小变化,更新字体大小const updateFontSize = () => {if (zgrwczqktance.value) {const windowWidth = window.innerWidth;// 使用平方根计算字体大小,这样在大屏幕下字体可以更大const fontSize = Math.max(12, Math.min(60, Math.sqrt(windowWidth))); const option = {yAxis: {nameTextStyle: {fontSize: fontSize + 'px',},axisLabel: {textStyle: {fontSize: fontSize+'px',},},},};zgrwczqktance.value.setOption(option, true);}};

这段代码是在window上添加一个resize事件监听器。当resize事件触发时,它会使用Vue的nextTick函数,在DOM更新之后调用resizeHandler函数。这样做的目的是确保resizeHandler函数在DOM更新之后执行,以便获取最新的DOM状态。

(三)根据浏览器窗口的宽度动态计算字体大小
 * @param {any} res - 需要根据字体大小进行调整的尺寸值。* @returns {number} - 返回经过字体大小调整后的尺寸值。*/
const fontSize = (res: any) => {// 获取浏览器窗口的宽度。优先使用window.innerWidth,如果不可用,则尝试使用document.documentElement.clientWidth,// 如果仍然不可用,则使用document.body.clientWidth。let clientWidth =window.innerWidth ||document.documentElement.clientWidth ||document.body.clientWidth;// 如果无法获取到客户端宽度,则直接返回,不进行后续计算。if (!clientWidth) return;// 根据窗口宽度与参考宽度的比例,计算字体大小。基础字体大小为100px,参考宽度为1920px。let fontSize = 100 * (clientWidth / 1920);// 返回传入参数res乘以计算得到的字体大小,用于进一步的尺寸计算或应用。return res * fontSize;
}

此函数旨在根据浏览器窗口的宽度,动态调整字体大小,以实现响应式设计的一部分。

它基于一个假设的参考宽度1920px,将当前窗口宽度与参考宽度的比例应用于基础字体大小100px, 从而得出一个新的字体大小值。这个新的字体大小值将被用于计算传入参数res所代表的尺寸。

然后在我们图表的options配置里面使用fontSize()函数

// 封装 option 配置
const defaultOption: any = {grid: {top: "0%",bottom: "2%",left: "34%",right: "20%"},xAxis: {show: false,type: "value",boundaryGap: [0, 0]},yAxis: [{type: "category",data: [],axisTick: [{show: false}],axisLine: {show: false,lineStyle: {color: '#B8E8FF',}},axisLabel: {color: '#fff',fontSize: fontSize(0.075), // 设置字体大小// 这里的formatter函数可以根据你的需要进行调整  formatter: function (value: any, index: any) {// 自定义富文本格式return `{${index + 1}| }${value}`;},// width: 80,rich: {1: {height: fontSize(0.13),width: fontSize(0.13),align: "center",backgroundColor: {image: jyl,},},2: {height: fontSize(0.13),width: fontSize(0.13),align: "center",backgroundColor: {image: jyl,},},3: {height: fontSize(0.13),width: fontSize(0.13),align: "center",backgroundColor: {image: jyl,},},},},}],series: [{name: "",type: "bar",zlevel: 1,barWidth: "20%",label: {normal: {show: true,position: 'right',formatter: '{c}',textStyle: {color: '#BCFBFF', //color of valuefontSize: fontSize(0.075),}}},data: []},]
};

即可实现在不同分辨率下实现不同字体大小

注意

在组件卸载时,要清理echarts实例和移除窗口大小变化的监听器

onUnmounted(() => {if (zgrwczqktance.value) {zgrwczqktance.value.dispose(); // 清理echarts实例}// 使用相同的函数引用来移除监听器// 移除窗口大小变化的监听器window.removeEventListener('resize', resizeHandler) // 移除监听器
});

都需结合Echarts Resize ()方法使用才能达到自适应分辨率屏幕大小

作者使用的是第三种方法根据浏览器窗口的宽度动态计算字体大小,大家可以尝试,有什么建议或不足可参与讨论

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

C++第十弹 ---- vector的介绍及使用

目录 前言vector的介绍及使用1. vector的使用1.1 vector的定义1.2 iterator的使用1.3 vector空间增长问题1.4 vector增删查改 2. vector迭代器失效问题(重点) 总结 前言 本文介绍了C中的vector数据结构及其使用方法。 更多好文, 持续关注 ~ 酷酷学!!! 正文开始 vector的介绍…

面试场景题系列--(2)短 URL 生成器设计:百亿短 URL 怎样做到无冲突?--xunznux

文章目录 面试场景题&#xff1a;短 URL 生成器设计&#xff1a;百亿短 URL 怎样做到无冲突&#xff1f;1. 需求分析2. 短链接生成算法2.1 自增法2.2 散列函数法2.3 预生成法 3. 部署模型3.1 其他部署方案 4. 设计4.1 重定向响应码4.2 短 URL 预生成文件及预加载4.3 用户自定义…

代码静态检查简介

在软件开发领域&#xff0c;确保代码质量是项目成功的关键要素之一。代码静态检查作为一种重要的质量保证手段&#xff0c;通过在不运行代码的情况下&#xff0c;对代码进行自动化的分析和审查&#xff0c;帮助开发团队及时发现并修复潜在的缺陷、安全漏洞以及不符合编码规范的…

Jenkins详细使用教程

目录 1. 什么是Jenkins&#xff1f; 2. 为什么使用Jenkins&#xff1f; 3. 安装Jenkins 3.1 下载相关文件 3.2 解压Linux版本的JDK 3.3 配置JDK环境 3.4 运行jenkins.war 3.5 安装完成 4. 访问Jenkins 5. 修改密码 6. 集成JDK 7. Jenkins集成Git 7.1 使用Jenkins拉取…

7月26日贪心练习-摆动序列专题

前言 大家好&#xff0c;今天学习用贪心思想解决摆动序列问题&#xff0c;共三题&#xff0c;分享自己的思路&#xff0c;请大家多多支持 算法思想 大家可以先看看这道我们后面会讲的题看看怎么个事&#xff0c;. - 力扣&#xff08;LeetCode&#xff09; 由此题题解说明算…

若依ruoyi+AI项目二次开发

//------------------------- //定义口味名称和口味列表静态数据 const dishFlavorListSelectref([ {name:"辣度",value:["不辣","微辣","中辣","重辣"]}, {name:"忌口",value:["不要葱","不要…

JVM之对象的创建过程

目录 对象的创建&#xff1a; 对象内存分配的两种方式&#xff1a; 指针碰撞&#xff1a; 空闲列表&#xff1a; 对象的内存布局&#xff08;基本结构&#xff09;&#xff1a; 对象的访问定位&#xff1a; 主流的访问方式主要有使用句柄和直接指针两种。 对象的创建&…

基于微信小程序+SpringBoot+Vue的流浪动物救助(带1w+文档)

基于微信小程序SpringBootVue的流浪动物救助(带1w文档) 基于微信小程序SpringBootVue的流浪动物救助(带1w文档) 本系统实现的目标是使爱心人士都可以加入到流浪动物的救助工作中来。考虑到救助流浪动物的爱心人士文化水平不齐&#xff0c;所以本系统在设计时采用操作简单、界面…

FPGA实现LCD1602控制

目录 注意&#xff01; 本工程采用野火征途PRO开发板&#xff0c;外接LCD1602部件进行测试。 有偿提供代码&#xff01;&#xff01;&#xff01;可以定制功能&#xff01;&#xff01;&#xff01; 联系方式见底部 一、基础知识 1.1 引脚信息 1.2 指令 1.2.1 清屏 1.…

ubuntu实践

目录 扩容 本机上ping不通新建立的虚拟机 ssh连接 装sshd ssh客户端版本较低&#xff0c;会报key exchange算法不匹配问题 ubuntun上装docker 将centos7下的安装包改造成适配 ubuntu的包 参考文章 扩容 Hyper-V 管理器安装的ubutun扩容磁盘空间说明_hype-v磁盘扩容-…

人工智能算法工程师(中级)课程20-模型注意力机制之注意力机制的原理、计算方式与代码详解

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能算法工程师(中级)课程20-模型注意力机制之注意力机制的原理、计算方式与代码详解。本文深入探讨了注意力机制在深度学习中的应用与原理&#xff0c;尤其聚焦于序列到序列模型的上下文中。通过直观的解释和详…

48 mysql 全局变量修改了时区, 客户端拿到的依然是旧时区

前言 这是一个 我们最近碰到的问题 在我们的一个 服务平台 查询到的时间字段 比 当前时区的当前时间多 8 小时 然后 这个问题 也是挺神奇的, navicate 上面查询到的 时间是在正常的时间 然后 查询环境变量 tz_zone 是 “08:00”, 也没有问题, 但是 客户端这边 拿到的是 当…

【HTML+CSS】HTML超链接:构建网页导航的基石

目录 什么是HTML超链接&#xff1f; 基本语法 示例 链接到另一个网页 链接到同一页面内的不同部分 常用属性 在Web开发的广阔世界中&#xff0c;HTML&#xff08;HyperText Markup Language&#xff09;作为网页内容的标准标记语言&#xff0c;扮演着至关重要的角色。而在…

nodejs安装及环境配置轨道交通运维检测系统App-OA人事办公排班故障维修

✌网站介绍&#xff1a;✌10年项目辅导经验、专注于计算机技术领域学生项目实战辅导。 ✌服务范围&#xff1a;Java(SpringBoo/SSM)、Python、PHP、Nodejs、爬虫、数据可视化、小程序、安卓app、大数据等设计与开发。 ✌服务内容&#xff1a;免费功能设计、免费提供开题答辩P…

【SpringCloud】企业认证、分布式事务,分布式锁方案落地-2

目录 高并发缓存三问 - 穿透 缓存穿透 概念 现象举例 解决方案 缓存穿透 - 预热架构 缓存穿透 - 布隆过滤器 布隆过滤器 布隆过滤器基本思想​编辑 了解 高并发缓存三问 - 击穿 缓存击穿 高并发缓存三问 - 雪崩 缓存雪崩 解决方案 总结 为什么要使用数据字典&…

对Linux目录结构的补充

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 ☁️运维工程师的职责&#xff1a;监…

白鲸开源CEO郭炜荣获「2024中国数智化转型升级先锋人物」称号

2024年7月24日&#xff0c;由数据猿主办&#xff0c;IDC协办&#xff0c;新华社中国经济信息社、上海大数据联盟、上海市数商协会、上海超级计算中心作为支持单位&#xff0c;举办“数智新质力拓未来 2024企业数智化转型升级发展论坛——暨AI大模型趋势论坛”数据猿“年中特别策…

数据结构_study(一)

术语 程序设计数据结构算法 数据结构&#xff1a;相互之间存在一种或多种特定关系的数据元素的集合 数据&#xff1a;输入到计算机中可以操作的对象&#xff0c;数值类型&#xff08;整型&#xff0c;浮点型&#xff09;&#xff0c;非数值类型&#xff08;字符&#xff0c;…

算法——二分查找(day10)

目录 69. x 的平方根 题目解析&#xff1a; 算法解析&#xff1a; 代码&#xff1a; 35. 搜索插入位置 题目解析&#xff1a; 算法解析&#xff1a; 代码&#xff1a; 69. x 的平方根 69. x 的平方根 - 力扣&#xff08;LeetCode&#xff09; 题目解析&#xff1a; 老…

Linux 安装mysql-client-core-8.0

在Linux上安装mysql-client-core-8.0 安装流程 下面是安装mysql-client-core-8.0的步骤和相应的命令&#xff1a; 步骤1&#xff1a;更新系统软件源 我们首先需要更新系统的软件源&#xff0c;以确保我们能够获取到最新的软件包列表。使用以下命令更新软件源&#xff1a; …