ECharts复杂业务:与tooltip的交互

总是遇到一些神奇的需求,ECharts文档的属性真的有点不好找,靠ChatGPT帮助+反复尝试摸索完成的一些内容,在此记录一下。

背景

期望用ECharts实现------鼠标可以进入图表的tooltip框,并点击其中的内容进行交互

问题1:tooltip会跟随光标移动,光标永远在tooltip框外

设置enterable属性,使鼠标可以进入tooltip

yaml 复制代码
tooltip: {
  enterable: true
}

问题2:图表数据点超多,点与点之间很紧密,即使设置了可以进入tooltip,但移动鼠标后,还没进入,tooltip就飘到下一个点上了,永远追不到

将tooltip紧贴鼠标,使鼠标能够轻松进入框内

js 复制代码
tooltip: {
    position: function (point, params, dom, rect, size) {
      // 提示框位置
      let x, y
      // 当前鼠标位置
      const pointX = point[0]
      const pointY = point[1]
      // 提示框尺寸
      const boxWidth = size.contentSize[0]
      const boxHeight = size.contentSize[1]
      // 容器尺寸
      const viewWidth = size.viewSize[0]
      // const viewHeight = size.viewSize[1]
      // 设置光标左右位置
      if (viewWidth - boxWidth < pointX) {
        // 光标位置 大于 容器减去提示框的位置,右边放不下,放在左侧
        x = pointX - boxWidth
      } else {
        // 默认紧贴光标右侧显示
        x = pointX
      }
      // 设置光标上下位置
      if (boxHeight < pointY) {
        // 光标位置 小于 提示框位置,上面放不下,放在下侧
        y = pointY - boxHeight
      } else {
        // 默认紧贴光标上侧显示
        y = pointY
      }
      // 记录提示框位置
      // if (window.tooltipSpace?.position) window.tooltipSpace.position = [x, y]
      return [x, y]
    }
}

问题3:tooltip过长,超出容器被截断

confine, appendTo, appendToBody等方法在部分情况下都没有用,这里产生的问题归根结底还是tooltip被置入了chart这个元素下,但是其父级设置了overflow: hidden; 而产生的问题,如果其他方法都不生效,可以改动各元素的overflow来解决

问题4:tooltip的formatter使用模版字面量,如何良好的进行交互?

将需要调用的函数绑定在window上,并在挂载和卸载时分别设置和删除(本例基于react)

js 复制代码
// formatter中的模版字面量
// `<div onclick="window.tooltipSpace.expandList(${dataIndex}, ${index})">More</div>`

// useTooltip.js
// 通用内容提取在该文件中
function useTooltip(list) {
  useEffect(() => {
    if (!window.tooltipSpace) {
      window.tooltipSpace = {}
    }
    for (const key in list) {
      window.tooltipSpace[key] = list[key]
    }
    return () => {
      delete window.tooltipSpace
    }
  }, [])
  // return { ... }
}

// app.js
// 在页面上使用
useTooltip({
  expandList: expandList,
  // data: Array(30).fill({ status: -1 }),
  // lastDataIndex: -1
})
function expandList() {}

问题5:在tooltip上交互后,其上的内容不会自动渲染(点击后没有变化)

调用ECharts的dispatchAction使tooltip先消失再显示,实现自动渲染

js 复制代码
export const updateTooltip = (dataIndex: number, chart) => {
  // 先消失后显示,以此实现数据更新
  chart.dispatchAction({
    type: 'hideTip',
    seriesIndex: 0,
    dataIndex // 第几个节点的tooltip
  })
  chart.dispatchAction({
    type: 'showTip',
    seriesIndex: 0,
    position: window.tooltipSpace?.position,
    dataIndex
  })
}

动图DEMO:github.com/Powderbluee...

相关推荐
h_654321012 天前
echarts实现柱状图加一条横线
前端·echarts
速易达网络12 天前
ECharts 图表制作完全指南:从零到可视化实战
前端·javascript·echarts
paopaokaka_luck12 天前
灾害应急物资管理系统(AI应急助手、Echarts可视化数据看板、捐赠入库联动、 物资全流程管理、库存变动追溯、灾情资讯与互动反馈、物资发放公示)
java·前端·javascript·spring boot·mysql·tomcat·echarts
paopaokaka_luck15 天前
基于springboot+vue的益暖微光公益服务平台(DeepSeek公益助手、善款信息追溯、志愿服务积分闭环、ECharts运营分析、活动状态自动流转)
java·前端·javascript·spring boot·mysql·架构·echarts
腾讯数据架构师16 天前
任务跑完怎么直接出图表?CubeStudio 任务可视化 ECharts 数据格式实操(CSV/JSON + metric.json,11 种图表一键渲染)
前端·json·echarts·数据可视化
总要学点什么17 天前
第81篇:数据可视化-PM2.5分布——让圆点的胖瘦替每座城市报出浓度
前端·信息可视化·echarts·cesium·空间分析
paopaokaka_luck17 天前
社区服务平台(加权协同过滤推荐、Jieba中文词频分析、WebSocket实时聊天、求助处理闭环、 活动积分闭环、ECharts多维分析)
java·前端·spring boot·mysql·echarts·mybatis
mmsx17 天前
Android 并发考古:newThread 与 RxJava 共存,以及 GlobalScope 的三宗罪
android·echarts·rxjava
DataGear18 天前
DataGear 6.1.1 发布,数据可视化分析平台
javascript·信息可视化·数据分析·echarts·数据可视化
paopaokaka_luck19 天前
流浪动物救助与收养系统(DeepSeek AI对话、 ECharts多维分析、救助流程衔接、领养与回访衔接、 捐赠确认与公示、志愿者协作)
java·前端·javascript·人工智能·mysql·echarts·推荐算法