Chart.js Tooltip 与交互指南:hover、点击事件与自定义提示框详解
【免费下载链接】Chart.jsSimple HTML5 Charts using the项目地址: https://gitcode.com/gh_mirrors/ch/Chart.js
Chart.js是一款基于 HTML5<canvas>标签的轻量级 HTML5 图表库。这份指南面向新手,用最少的话讲透三个核心能力:Chart.js tooltip(提示框)、hover 悬停事件与点击事件(onClick / onHover)——如何配置交互模式、如何自定义提示框内容、如何用 HTML 渲染自定义提示框,帮你从零做出完全可控的交互式图表。📊
一、为什么 Tooltip 默认就能用?
Chart.js 初始化后会自动监听mousemove、mouseout、click、touchstart、touchmove等浏览器事件(见 docs/configuration/interactions.md)。鼠标移到数据点附近,提示框就会自动弹出并跟随指针,无需任何额外代码。
提示框插件的源码位于 src/plugins/plugin.tooltip.js,全部可配置项汇总在官方文档 docs/configuration/tooltip.md 中。
二、快速上手:配置 hover 交互模式
交互行为由options.interaction统一控制,最常用的三个选项:
| 选项 | 默认值 | 作用 |
|---|---|---|
mode | 'nearest' | 提示框/悬停命中哪些元素 |
intersect | true | true时鼠标必须精确压到元素上才触发 |
axis | 'x'或'xy' | 按哪个坐标轴计算距离('x'/'y'/'xy'/'r') |
内置交互模式一览(详细说明见 docs/samples/tooltip/interactions.md):
| 模式 | 行为 | 典型场景 |
|---|---|---|
point | 命中鼠标压住的所有点 | 散点图 |
nearest | 取距鼠标最近的元素 | 混合图中点被柱形遮挡时 |
index | 同一索引的所有数据集 | 多系列折线对比(最常用) |
dataset | 同一数据集的所有点 | 单条曲线整体高亮 |
x/y | 同一横/纵坐标上的所有点 | 竖直/水平十字光标 |
想要"鼠标不压住点也显示提示框"的顺滑体验,只需两行配置:
options: { interaction: { mode: 'index', intersect: false } }三、捕获点击与悬停事件:onClick 与 onHover
图表级事件回调定义在options顶层(完整表格见 docs/configuration/interactions.md):
| 回调 | 触发时机 | 参数 |
|---|---|---|
onHover | 监听事件在图表区域触发时 | (event, activeElements, chart) |
onClick | mouseup/click/contextmenu | (event, activeElements, chart) |
activeElements就是当前命中的元素数组,可直接拿到datasetIndex与index。如果想让图表只响应点击(例如做"点选查看明细"的报表),可以用events选项收窄监听范围:
options: { events: ['click'], // 图表只监听点击 onClick: (e, elements, chart) => { // elements 为空 = 点击了空白区域 } }💡 小贴士:options.plugins.tooltip.events还能单独限制提示框只响应哪些事件,例如tooltip: { events: ['click'] }可实现"点击才出提示框"。
把鼠标坐标换算成数据值
"点在哪,就取哪个值"是最常见的需求,官方提供两个辅助函数即可完成像素→数据的换算(见 docs/configuration/interactions.md):
onClick: (e) => { const pos = Chart.helpers.getRelativePosition(e, chart); const dataX = chart.scales.x.getValueForPixel(pos.x); const dataY = chart.scales.y.getValueForPixel(pos.y); }四、hover 高亮:让被悬停的元素更醒目
Chart.js 为每类元素都提供hover前缀选项,悬停时自动切换样式,例如折线/柱状图中常用的:
hoverBorderWidth: 5—— 加粗边框hoverBorderColor: 'green'—— 变绿hoverRadius: 8—— 数据点放大
这些样式配置在数据集上即可生效,完整示例见 docs/samples/advanced/programmatic-events.md。
五、自定义提示框内容:callbacks 回调
提示框的文本几乎全部由options.plugins.tooltip.callbacks控制,核心回调:
| 回调 | 作用 | 可否按数据集覆盖 |
|---|---|---|
title/beforeTitle/afterTitle | 控制标题行 | 否 |
label | 控制每个数据项的文本(最常用) | ✅ 是 |
afterBody/footer | 追加汇总信息(如合计值) | 否 |
itemSort/filter | 对提示框条目排序/过滤 | 否 |
最常见的改造——给数值加上货币单位(返回undefined则回退默认文本,返回空字符串则整行删除):
plugins: { tooltip: { callbacks: { label: (ctx) => '$' + ctx.parsed.y.toLocaleString() } } }回调函数拿到的ctx(即 Tooltip Item Context)包含parsed、raw、dataset、datasetIndex、dataIndex等完整字段,完整字段表见 docs/configuration/tooltip.md。
控制提示框的停靠位置
position:'average'(默认,取条目平均位置)或'nearest'(跟随最近元素),还可以向Chart.Tooltip.positioners注册自定义定位函数;xAlign/yAlign:强制箭头朝向(left/center/right、top/center/bottom);- 配色类选项:
backgroundColor、titleColor、padding、cornerRadius、displayColors(显示彩色小方块)、usePointStyle(用点样式代替方块)等一应俱全。
带footer汇总的完整示例见 docs/samples/tooltip/content.md,位置模式示例见 docs/samples/tooltip/position.md。
六、进阶:HTML 自定义提示框(external)
Canvas 绘制的提示框样式能力有限。若需要卡片阴影、图标、富文本,可用external选项完全接管渲染——把提示框画在 Canvas 之外的 HTML 元素里:
- 设置
tooltip: { enabled: false, external: handler }; - 在
handler(context)里创建/复用div,用context.tooltip中的title、body、labelColors组装内容; - 当
tooltip.opacity === 0时隐藏,否则按caretX/caretY定位并跟随。
官方提供了一份可直接抄作业的完整实现,见 docs/samples/tooltip/html.md 与 docs/configuration/tooltip.md 的 "External (Custom) Tooltips" 章节。✨
七、程序化触发:不用鼠标也能弹出提示框
在"点击列表项 → 图表高亮并弹出提示框"这类联动场景,可以直接用 API 激活元素,无需模拟鼠标事件:
chart.setActiveElements([{ datasetIndex: 0, index: 0 }]); // hover 高亮 chart.tooltip.setActiveElements( [{ datasetIndex: 0, index: 2 }, { datasetIndex: 1, index: 2 }], { x: 200, y: 120 } // 提示框锚点坐标 ); chart.update();可交互的完整示例见 docs/samples/advanced/programmatic-events.md。
八、总结与参考路径
| 想做什么 | 关键配置 / 文档 |
|---|---|
| 调整提示框命中范围 | options.interaction(interactions.md) |
| 点击/悬停业务逻辑 | onClick/onHover+events |
| 自定义提示框文字与样式 | tooltip.callbacks(tooltip.md) |
| HTML 富文本提示框 | tooltip.external(samples/tooltip/html.md) |
| 程序化触发提示框 | setActiveElements(programmatic-events.md) |
掌握interaction+events+callbacks三板斧,Chart.js 的交互体验就已经足够应对绝大多数数据看板需求;需要更强表现力时,再用external与setActiveElements打开自定义渲染的大门。🚀
【免费下载链接】Chart.jsSimple HTML5 Charts using the项目地址: https://gitcode.com/gh_mirrors/ch/Chart.js
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考