echarts的y轴数据显示过长占不下,内容截取,鼠标hover上去显示全部

news2024/12/23 11:16:48

初始效果:

优化后的效果:

优化点:控制了y轴显示字数,鼠标hover上去显示全部

主要实现思路参考了这位同学的文章:https://www.cnblogs.com/liuboren/p/9040622.html

我是用vue实现的,因为我需要一个页面中显示多个同类型的折线图,所以需要封装一个通用的折线图组件,下面主要说一下我的实现方式:

1. 封装一个折线图组件LineEchart,折线图的dom结构如下图所示:

 其中包含两个动态的参数:domIdheight,这两个参数均由调用该组件的父组件传入

domId由外部传入,主要是为了避免同一个页面多次调用该组件,dom节点id相同

height由外部传入,是为了动态控制折线图的高度

2. 激活y轴的鼠标事件(将 yAxis 的 triggerEvent 设置为 true),并对y轴内容显示的长度做一个截取。

因为我的erchart组件兼容了 value 和 category 两个类型,只在 category 类型的时候才需要触发这个效果,所以我加了判断。你们使用的时候可以直接设置 triggerEvent: true。

其中, 

  • getLabelFn是我封装的一个字符串处理的方法
  • yOneLineWordsNum 表示一行最多显示的字数,
  • yLineNum 表示最多显示的行数

getLabelFn的代码如下所示:

getLabelFn(oriName, column, maxRow = 0) {
      let newName = oriName;
      if (maxRow > 0 && oriName.length > column * maxRow) {
        newName = oriName.slice(0, column * maxRow - 1); // 当字符长度超出最大字数时,对字符进行截取
      }
      const nameLastStr = newName.slice(-1);
      const nameOther = newName.slice(0, -1);
      const str = `(.{${column}})`;
      const reg = new RegExp(str, "g");
      let content =
        newName.length > column
          ? nameOther.replace(reg, "$1\n") + nameLastStr
          : newName; // 文本超出一行的字数,换行
      if (maxRow > 0 && oriName.length > column * maxRow) {
        content = content + "...";
      }
      return content;
    },

  3. 自定义extensionFn方法(实现鼠标事件),并调用

简单来说,需要实现3个鼠标事件,分别是:

  • 鼠标移入,显示提示信息
  • 鼠标移动,动态更新提示框信息
  • 鼠标移出,隐藏提示框

extensionFn主要代码如下所示:

extensionFn(mychart, chartDom) {
      const _this = this;
      const tId = `${_this.domId}-tipDom`; // 创建的dom提示框id
      mychart.on("mouseover", function (params) {
        if (
          params.componentType === "yAxis" &&
          params.value.length > _this.yOneLineWordsNum * _this.yLineNum
        ) {
          // 判断是否创建过div框,如果创建过就不再创建了
          let tipDom = document.getElementById(tId);
          if (!(tipDom && chartDom.contains(tipDom))) {
            tipDom = document.createElement("div");
            tipDom.id = tId;
            tipDom.className = "tooltip-box";
            chartDom.appendChild(tipDom);
          }
          tipDom.style.display = "block";
          const arr = _this.getTipLocationFn(params);
          tipDom.style.left = arr[0];
          tipDom.style.top = arr[1];
          tipDom.innerHTML = params.value;
        }
      });
      mychart.on("mouseout", function (params) {
        const tipDom = document.getElementById(tId);
        if (tipDom) {
          tipDom.style.display = "none";
        }
      });
      // 鼠标移动时更新提示框的位置
      mychart.on("mousemove", function (params) {
        const tipDom = document.getElementById(tId);
        if (tipDom) {
          const arr = _this.getTipLocationFn(params);
          tipDom.style.left = arr[0];
          tipDom.style.top = arr[1];
        }
      });
    },

其中有几点需要注意:

  1. 创建的dom提示框id需要和当前的domId绑定,原因在于,一个页面上可能会多次调用该组件,若固定一个字符串,会导致重复,找不到正确的提示框dom。
  2. tooltip-box 是自定义的提示框样式,我直接将echarts的提示框样式拿过来复用了,代码如下:
    ::v-deep .tooltip-box {
      position: absolute;
      top: 0;
      overflow: hidden;
      max-width: 395px;
      border-style: solid;
      z-index: 9999999;
      box-shadow: rgba(0, 0, 0, 0.2) 1px 2px 10px;
      transition: opacity 0.2s cubic-bezier(0.23, 1, 0.32, 1) 0s,
        visibility 0.2s cubic-bezier(0.23, 1, 0.32, 1) 0s,
        transform 0.4s cubic-bezier(0.23, 1, 0.32, 1) 0s;
      background-color: rgb(255, 255, 255);
      border-width: 1px;
      border-radius: 4px;
      color: rgb(102, 102, 102);
      font: 14px / 21px "Microsoft YaHei";
      padding: 10px;
      border-color: rgb(255, 255, 255);
      word-break: break-all;
    }
  3. getTipLocationFn方法是依据当前鼠标的位置定位提示框的位置,代码如下:
getTipLocationFn(params) {
      const x = `${params.event.offsetX + 10}px`;
      const y = `${params.event.offsetY + 20}px`;
      return [x, y];
    },

初始化echart时,调用extensionFn方法:

在说遇到的一个小坑,坐标系中间也需要加提示框,效果如下所示:

 官方提供的提示框组件是没有换行的,需要自己换行,我这里用的最大宽度及换行属性都没有用,后面发现官方给提示框设置了white-space: nowrap;这个属性是会继承的,所以需要把这个属性覆盖一下

 

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

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

相关文章

各算法/协议知识理论笔记(fpga)

一、利用fifo对3行数据求和 需要2个fifo保存第0行和第1行的数据,如下图 比如有20行数据,则将一行一行的输给fifo2, fifo2出来的数据再给fifo1.当fifo和fifo1有数据时,在准备给 fifo2输入新的一行数据时,同时读出fifo2,…

Linux进程间通信(信号)

信号发送 信号是 Linux 系统响应某些条件而产生的一个事件,接收到该信号的进程会执行相应的操作。 信号的产生有三种方式: (1)由硬件产生,如从键盘输入 CtrlC 可以终止当前进程 (2)由其他进程发送,如可在 …

PostgreSQL修炼之道之高可用性方案设计(十七)

目录 20 高可用性方案设计(二) 20.2 基于共享存储的高可用方案 20.2.1 SAN存储的方案 20.2.2 DRBD的方案 20.3 WAL日志同步或流复制同步的方案 20.3.1 持续复制归档的standby的方法 20.3.2 异步流复制的方案 20.3.3 基于同步流复制方案 20.4 基于…

国内外低代码开发平台发展情况如何?

国内外低代码开发平台发展情况如何?之前有些过很多关于低代码的内容,这篇就来详细梳理下国内外低代码开发平台发展现状。 关于低代码解读看这篇>>什么是低代码(Low-Code)?关于低代码平台看这篇>>主流的开…

业务高速增长,如祺出行如何用腾讯云消息队列 RocketMQ 应对挑战

导语 作为广汽集团旗下的智慧出行平台,如祺出行上线四年时间,用户规模和订单量保持高速增长。在过去的2022年,如祺出行平台累计注册用户突破1800万,同比增长64%,年度订单总量超7000万,同比增长52%。 高速…

【MCS-51】串行I/O接口及其通信

我们知道MCS-51中有很多的引脚,这些引脚很多一般都是用作输入或者输出口,其中有两个引脚P3.0和P3.1比较特殊,我们常将其用作串行通信的数据发送和接收端TXD、RXD。 目录 🐱通信方式 🐱串行通信的传输方式和数据通信…

python笔记17_实例演练_二手车折旧分析p2

…… 书接上文 4.车辆等级维度 探查车龄为5年的车辆,折旧价值与车辆等级的关系。 # 筛选出车龄为5的数据创建新表 data_age5 data[data[age] 5] data_age5 # 分组聚合计算均值 data_car_level data_age5.groupby(car_level_name)[lowest_price].mean().reset…

16.2:岛屿数量问题

文章目录 岛屿数量问题方法一:采用递归的方法方法二:使用并查集的方法(map)方法三:使用并查集的方法(数组) 岛屿数量问题 测试链接:https://leetcode.com/problems/number-of-islan…

大数据:分布式计算,MapReduce,hadoop的计算组件,hive是sql分布式计算框架,底层就是基于MapReduce的

大数据:分布式计算,MapReduce,hadoop的计算组件,hive是sql分布式计算框架,底层就是基于MapReduce的 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学…

【C++】一文带你入门 STL

一 STL 组成 graph LRA[STL] --- B[容器 container]A --- C[配接器 adapter]A --- D[迭代器 iterator]A --- E[仿函数 function]A --- F[算法 algorithm]A --- G[空间配置器 allocator]二 常用容器 容器简介 下面我们来简单看一下这些容器的常用接口的使用,并分析…

更新中-深度学习实战中遇到的一些概念+少量代码

onnx ONNX 是一种用于机器学习模型的开放式表示格式,它可以让不同的深度学习框架之间共享模型。 import onnxruntime # 加载模型 session onnxruntime.InferenceSession(model.onnx) # 运行模型。第一个参数是输出变量列表,不指定的话返回所有值 outp…

ESP8266使用MicroPython接入ThingsBoard

1、概述 我们老大当初叫我学习microPython,这个可以直接将代码发到板子上,然后就可以跑,就相当于设备业务代码由我们来写,不仅仅是让嵌入式来写,嵌入式做的就是封装函数,我们可以调用.最终这个还是实现了,但是没有推广. 2、设备 我自己购买的设备是ESP8266,某宝上购买的,mic…

智能仓储系统哪家公司做的比较好?求推荐排名不错的智能仓储公司?

什么是仓储服务信息平台?仓储服务信息平台可以为企业提供哪些便利? 随着电商和物流行业的快速发展,仓储服务越来越受到人们的关注。为了更好地管理仓储服务,提高效率,降低成本,仓储服务信息平台也应运而生…

CTF国赛2023 - ukfc(四道逆向已下班)

没啥好说的,惜败已复现:badkey1、国粹、ezbyte、moveAside、ezAndroid Notice:复现时候的一些题解来源于各大战队的wp,比如F61d,侵删 Re ezbyte 首先跟踪很容易分析到前后缀 至于里面的,得知道是dwarf…

哪个牌子的电容笔好用?Apple Pencil平替

随着时代的进步,数码产品在人们日常生活中的使用频率越来越高,一个iPad和一支电容笔似乎已然成为人们主要的学习工具了。电容笔的发展速度很快,在众多的电容笔牌子中,什么牌子好用又便宜?下面,我来给大家推…

深度学习进阶篇[8]:对抗神经网络GAN基本概念简介、纳什均衡、生成器判别器、解码编码器详解以及GAN应用场景

【深度学习入门到进阶】必看系列,含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等 专栏详细介绍:【深度学习入门到进阶】必看系列,含激活函数、优化策略、损失函数、模型调优、归一化…

FastReport Business Graphics .NET 2023.1 Crack

FastReport 商业图形 .NET .NET WinForms 的数据可视化库 使用 FastReport 业务图形库,您可以可视化不同层次的数据,构建业务图表以供进一步分析和决策。 所有这些都可以直接在您的应用程序中工作! 利用 .NET 7、.NET Core、Blazor、ASP.NE…

数据采集学习心得

数据采集是指从互联网或其他数据源中收集数据的过程。在当今信息时代,数据采集已经成为了一项非常重要的技能。无论是在商业领域还是学术领域,数据采集都是非常必要的。本文将分享我在学习数据采集过程中的心得体会。 一、数据采集的重要性 在当今信息…

高考即将到来,如何选择大学和专业?(2023版本)

同学们,高考又快到了,怎么选择大学和专业一直是同学们心烦的事情,正所谓“选择大于努力”,选择错了,努力方向自然就错了,事倍功半,甚至南辕北辙,所以对此我们必需慎之又慎&#xff0…

Mybatis自定义分页插件及PageHelper源码分析

文章目录 前言一、自定义一个简单的mybatis分页插件?1.判断当前传参是不是一个Page,如果是page就进行转换。2.分页查询总条数3.修改原有sql4.执行原有方法5.存在问题: 二、PageHelper分析1.PageHelper简介2.PageHelper源码分析 三&#xff1a…