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

初始效果:

优化后的效果:

优化点:控制了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;这个属性是会继承的,所以需要把这个属性覆盖一下

 

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

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

相关文章

go调试工具-delve

go调试工具-delve 简介 go debug工具,专门为go开发的调试工具,并且采用go语言开发,支持多平台。 官网:https://github.com/go-delve/delve 官网有详细的手册,学习起来很方便 快速开始 安装 我本地的go版本 官方…

QGIS 对 GeoJson 文件数据进行压缩

项目场景 地图开发,友商提供的是边界Shapefile文件,文件比较大,例如某个文件就 29.2 M ,这么大的数据,在echarts 上显示地图,前端会很卡,特别是有地图下钻的时候,体验很不好&#x…

Window winget 包管理工具安装踩坑记录

一、简介 想在 window 上安装一个好用的包管理工具,mac 上用 homebrew, window 则考虑再三,使用官方提供的 winget。 winget 官方使用文档。 二、安装流程与踩坑记录 按 win x,选择 Powershell(管理员) 方式打开 c…

mysql数据类型有哪几种

Mysql支持的多种数据类型主要有:数值数据类型、日期/时间类型、字符串类型。 整数 浮点数&定点数 注:定点数以字符串形式存储,对精度要求高时使用decimal较好;尽量避免对浮点数进行减法和比较运算。 时间/日期类型 字符串类型…

网格搜索:Python遍历网格中每个点

遍历网格中每个点 1. 问题描述2. Python实现2.1 网格参数初始化2.2 遍历赋值2.3 矩阵赋值1. 问题描述 最近需要实现一个对矩阵赋值并对矩阵表示的网格参数进行测试的任务,假设网格的长宽均为k,待搜索的两个参数是Pitch 和 Yaw,存在两个列表中。现在需要将网格上不同参数设置…

Redis实战14-分布式锁基本原理和不同实现方式对比

在上一篇文章中,我们知道了,当在集群环境下,synchronized关键字实现的JVM级别锁会失效的。那么怎么解决这个问题呢?我们可以使用分布式锁来解决。本文咱们就来介绍分布式锁基本原理以及不同实现方式对比。 我们先来回顾&#xff…

IMX6ULL裸机篇之I2C实验-硬件原理图

一. I2C 实验简介 I2C实验,我们就来学习如何使用 I.MX6U 的 I2C 接口来驱动 AP3216C,读取 AP3216C 的传感器数据。 AP3216C是一个三合一的环境光传感器,ALSPSIRLED,ALS是环境光,PS是接近传感器,IR是红外L…

若依之权限处理

若依之权限处理 若依前后端不分离版本使用的是shiro进行权限控制,本文主要是对shiro在若依中的使用进行分析。 RBAC权限模型 RBAC是指基于角色的访问控制。其基本思想是,对系统的各种权限不是直接授予具体的用户,而是在用户集合与权限集合…

通过python采集关键字搜索1688工厂数据接口,1688工厂数据接口,1688API接口

1688是一个行业网站,主要提供中小型批发和生产商的信息,是中国供应商向全球采购商展示其产品的平台。在1688上,可以找到许多工厂和制造商的信息,包括公司名称、地址、联系人、联系方式、主要产品等。 采集1688工厂数据可以帮助采…

PDCCH monitoring capability

欢迎关注同名微信公众号“modem协议笔记”。 前段时间看search space set group (SSSG) switching相关内容时,注意到R17和R16的描述由于PDCCH monitoring capability的变化,内容有些不一样。于是就顺带看了下R16 R17PDCCH monitoring capability的内容。…

实战:单点登录的两种实现方式,附源码

最近工作有点忙,好久没更新文章了,正好这两天在整理单点登陆相关的文档,今天趁着小孩睡着了🤫,赶紧码一篇实战文交差。 概念 单点登录(Single Sign-On,SSO)是一种身份验证服务&…

【Mysql】InnoDB 中 B+ 树索引的注意事项

一、根页面万年不动 在之前的文章里,为了方便理解,都是先画存储用户记录的叶子节点,然后再画出存储目录项记录的内节点。 但实际上 B 树的行成过程是这样的: 每当为某个表创建一个 B 树索引,都会为这个索引创建一个根…

单例模式C++实现和观察者模式C++实现

目录 1、单例模式介绍 2、单例代码实现 2.1 static介绍 2.2 C中static的三种用法: (1)静态局部变量 (2)静态成员变量 (3)静态成员函数 3、观察者模式介绍 4、观察者代码实现 1、单例模…

2023年十大最佳自动化测试工具(建议收藏)

Best Automation Testing Tools for 2023 对更快交付高质量软件(或"快速质量")的需求要求组织以敏捷,持续集成(CI)和DevOps方法论来寻找解决方案。测试自动化是这些方面的重要组成部分。最新的《 2018-2019…

使用koa2搭建后端服务器

目录 第一步 第二步 第三步 第四步 第五步 流程说明 1.配置连接数据库 2.添加Schema模型 3.配置路由接口 第一步 npm i -g koa-generator 第二步 koa2 server 第三步 cd server && npm install 第四步 将服务器拖进编译器运行 npm run dev 在浏览器输入…

迅为RK3568开发板2800页手册+220集视频

iTOP-3568开发板采用瑞芯微RK3568处理器,内部集成了四核64位Cortex-A55处理器。主频高达2.0Ghz,RK809动态调频。集成了双核心架构GPU,ARM G52 2EE、支持OpenGLES1.1/2.0/3.2OpenCL2.0、Vulkan 1.1、内高性能2D加速硬件。 内置NPU 内置独立NP…

SpringBoot生成RESTful API文档

由于我一开始学习的SpringBoot是3以上版本,所以我这里用到的也是支持和SpringBoot3能够整合的SpringDoc 这里先说一下,其实SpringDoc就是Swagger3版本,我一开始整合的2版本,比较麻烦况且最后SpringBoot程序都启动不了了&#xff0…

信息竞赛笔记(2)––快速幂

目录 快速幂 定义 分析 代码 递归实现 非递归实现(通用方法) 模意义下取幂 快速幂 定义 快速幂,二进制取幂(Binary Exponentiation,也称平方法),是一个在的时间内计算的小技巧,而暴力的计算需要的时间。 这个技巧也常常用在非计算的场景,因为它可…

yolov5部署到android studio

目录 环境获取demo将pt文件导出为ptl文件修改demo修改PrePostProcessor增加ptl文件并增加类别文件修改MainActivity 大功告成 环境 Ubuntu22.10 Pytorch2.0.1cu117 Android Studio Flamingo | 2022.2.1 Patch 1 获取demo git clone https://github.com/pytorch/android-demo…

day43|动态规划6-完全背包及其应用-零钱兑换II-组合总和IV

完全背包 前情提要: 0-1背包指的是给定背包重量,将物品放入背包中,使得背包中的物品达到最大的价值。(每个物品只能往其中放一次) 在0-1背包问题中,第二层for循环需要是倒序遍历才可以保证每个物品只使用一…