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

news2025/2/24 18:31:21

​🌈个人主页:前端青山
🔥系列专栏: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 value
            fontSize: fontSize(0.075),
          }
        }
      },
      data: [
      ]
    },

  ]
};

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

注意

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

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

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

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

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

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

相关文章

CSS 如何实现彩色渐变效果的文字

效果图如下&#xff1a;实现文字的字体颜色由 #ad4bd7 向 #6351fe 的颜色渐变效果。 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widt…

python 直接引用、浅拷贝、深拷贝的区别

1. 简述 简单来讲&#xff0c;直接引用所指向的地址是原对象的地址&#xff0c;深拷贝所指向的是新对象的地址&#xff0c;浅拷贝介于二者之间&#xff0c;原对象的直接子对象为新&#xff0c;子孙对象为原子孙对象。 下面用两个变量 a、b&#xff0c;一个字典对象 {‘aaa’:…

数学建模--拟合算法

目录 拟合与插值的区别 常用的拟合算法 应用实例 总结 最小二乘法在不同数据分布下的性能表现如何&#xff1f; 傅里叶级数拟合在图像处理中的应用案例有哪些&#xff1f; 贝叶斯估计法与最大似然估计法在参数估计中的优缺点分别是什么&#xff1f; 最大似然估计法&…

QT QTableView使用自定义数据模型

创建一个Qt工程-QMainWindow 添加控件 给按钮加上点击事件 创建数据结构 4.1 使用结构体或类定义自己的数据结构 4.2 声明数据结构体 #pragma once #ifndef MYDATA_H #define MYDATA_H #include<QString> struct Data {int index;QString name;QString sex; }; #endif …

auto和范围for

auto auto&#xff1a;自动推导类型功能 1.在早期 C/C 中 auto 的含义是&#xff1a;使用 auto 修饰的变量&#xff0c;是具有自动存储器的局部变量&#xff0c;后来这个 不重要了。 C11 中&#xff0c;标准委员会变废为宝赋予了 auto 全新的含义即&#xff1a; auto 不再是一…

MATLAB画散点密度图(附代码和测试数据的压缩包)

1. 有关 Matlab 获取代码关注WZZHHH回复关键词&#xff0c;或者咸鱼关注&#xff1a;WZZHHH123 怀俄明探空站数据解算PWV和Tm&#xff1a;怀俄明探空站数据解算PWV和Tm 怀俄明多线程下载探空站数据&#xff08;包括检查和下载遗漏数据的代码&#xff09;&#xff1a;怀俄明多线…

UE5 Niagara 粒子缩放—跟随物体缩放

使用Niagara粒子时&#xff0c;默认情况下&#xff0c;在世界大纲中的粒子不会随着actor的Scale缩放而改变 方法一&#xff1a;添加Scale Sprite Size 节点 方法二&#xff1a;使用 Apply Owner Scale to Attributes 节点 根据需要缩放的变量进行设置。 方法三&#xff1a;使用…

《Redis设计与实现》读书笔记-客户端

目录 1.Client简介 2.客户端属性 1&#xff09;&#xff08;本文重点&#xff09;比较通用的属性 2&#xff09;&#xff08;后续分享&#xff09;另外一类是和特定功能相关的属性 2.1套接字文件描述符 2.2名字 2.3标志&#xff08;flag&#xff09; 2.4输入缓冲区 2.…

esp-idf-v5.1.1所有官方例程讲解(esp32、esp32-C2、esp32-S3)之 a2dp_sink 详解

目录 1. 获取ESP-IDF和示例代码 2. 导航到示例代码 3. 示例代码结构 4. 关键文件解析 main.c 初始化和配置: bt_app_core.c 和 bt_app_core.h bt_app_av.c 和 bt_app_av.h A2DP事件处理: AVRCP事件处理: bt_app_sink.c 和 bt_app_sink.h 5. 编译和烧录 6. 测试…

【Linux】全志Tina etc目录下关键文件内容修改

一、文件位置 V:\f1c100s\Evenurs\f1c100s\tina\target\allwinner\c200s-F1C200s\busybox-init-base-files\etc\ssv6x5x-wifi.cfg 二、文件内容 三、介绍 在此目录下&#xff0c;可以修改在etc目录下的文件内容&#xff0c;此处举例修改一个wifi模块的配置文件数据。

探索Python的`retries`库:让代码更健壮的利器

探索Python的retries库&#xff1a;让代码更健壮的利器 背景&#xff1a;为何选择retries库&#xff1f; 在软件开发过程中&#xff0c;我们经常会遇到需要重复尝试执行某些操作的情况&#xff0c;比如网络请求、文件读写等。这些操作可能会因为各种原因暂时失败&#xff0c;但…

计算机专业,如何在大一领先其他人?关键是打破信息差!

高考录取陆续结束&#xff0c;不少同学报考计算机专业&#xff0c;然而&#xff0c;大部分人面对即将开启的计算机本科课程还是一无所知。 计算机的大学四年&#xff0c;都学些什么&#xff1f;要一直跟字符打交道吗&#xff1f;其实不然&#xff0c;编程的世界远比我们想象的…

[BJDCTF2020]EasySearch (SSI注入漏洞)

这题ctrlU发现往index.php提交数据&#xff0c;但是我目录&#xff0c;git泄露&#xff0c;sqlmap&#xff0c;爆破admin密码都没有作用&#xff0c;数据包页面也没有什么重置密码注册的功能 这种三无题多半是要拿源码做的&#xff0c;我又拿我备份文件字典扫了一下结果发现ind…

开发无人带货直播插件

在当今快速发展的电商行业中&#xff0c;直播带货已成为推动销售增长的重要力量&#xff0c;然而&#xff0c;随着直播市场的日益饱和和消费者需求的不断变化&#xff0c;如何在保持直播互动性的同时&#xff0c;实现高效、低成本的运营成为许多商家关注的焦点。 无人带货直播…

Python | Leetcode Python题解之第300题最长递增子序列

题目&#xff1a; 题解&#xff1a; class Solution:def lengthOfLIS(self, nums: List[int]) -> int:d []for n in nums:if not d or n > d[-1]:d.append(n)else:l, r 0, len(d) - 1loc rwhile l < r:mid (l r) // 2if d[mid] > n:loc midr mid - 1else:l…

c语言排序(1)

前言 排序在数据结构中占有非常重要的地位&#xff0c;我们在前面二叉树的数组实现时也用到了堆排序&#xff0c;下面我们就系统地讲一下排序。 1. 排序及其运用 1.1 什么是排序 所谓排序&#xff0c;就是使⼀串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff…

合并两个列头不同的表格

有两个Excel的"named ranges"&#xff0c;Events1和Events2。从第2行开始&#xff0c;它们都可以看做带表头的表格&#xff0c;并有部分表头相同。 Column1Column2Column3Column4DATEFIRST NAMESURNAMECODE1/2/2024JohnSmith31/2/2024LilyJJ33 Column1Column2Column…

【C++】类和对象——流插入和流提取运算符重载

目录 前言ostream和istream自定义类型的流插入重载自定义类型的流提取重载解决私有问题日期类总接口 前言 我们在上一节实现日期类时&#xff0c;在输入和输出打印时&#xff0c;经常会调用两个函数&#xff1a; void Insert()//输入函数{cin >> _year;cin >> _mo…

四款免费文案生成器app,你的文案创作神器

文案创作不仅需要创意和洞察力&#xff0c;还需要对语言的精准掌握。对于许多个人创作者和中小企业来说&#xff0c;聘请专业文案人员可能成本过高&#xff0c;而自己创作又可能面临灵感枯竭的困境。这时&#xff0c;免费的文案生成器App就显得尤为重要。免费文案生成器app的出…