ECharts 中的 Tooltip 是用于展示数据项的详细信息的组件,它会在鼠标悬停在图表上时触发,并显示与鼠标位置对应的数据项的信息。
其实现原理的如下五个方面:
- 事件监听:ECharts 在图表初始化时会调用 initEvents监听鼠标移动、点击等事件。当鼠标移动到图表上时,会触发会触发 mousemove 事件,并调用 dispatchAction 方法。
this._zr.on('mousemove', this._onmousemove)
- 数据定位:当鼠标移动到图表上时,ECharts 会根据鼠标的位置计算出对应的数据项。这一过程涉及到坐标系的转换和数据的映射。
var payload = {
type: 'showTip',
x: x,
y: y,
tooltipOption: option.tooltip,
dataIndex: dataIndex,
seriesIndex: seriesIndex,
from: this.uid
}
- Tooltip 显示:一旦确定了鼠标所指向的数据项,ECharts 就会根据配置中的设置,监听 showTip 命令,生成相应的 Tooltip 内容。Tooltip 可以包含标题、数值、单位等信息,也可以自定义显示内容。同时,Tooltip 的样式、位置等也可以进行配置。
chart.on('showTip', function (param) {
var seriesIndex = param.seriesIndex;
var dataIndex = param.dataIndex;
var tooltipOption = param.tooltipOption;
// 根据 seriesIndex 和 dataIndex 获取对应的数据项
var data = chart.getModel().getSeriesByIndex(seriesIndex).getData();
var itemModel = data.getItemModel(dataIndex);
// 根据配置生成 Tooltip 的内容
var content = [
'<div class="tooltip-title">' + itemModel.get('name') + '</div>',
'<div class="tooltip-content">'
+ itemModel.get('value') + tooltipOption.unit
+ '</div>'
].join('');
// 显示 Tooltip
tooltip.showTooltip({
content: content,
position: [param.x, param.y]
});
});
- Tooltip 定位:根据鼠标的位置和 Tooltip 的样式配置,ECharts 会计算出 Tooltip 的显示位置,并将其显示在对应的位置上。
Tooltip.prototype.showTooltip = function (params) {
var content = params.content;
var position = params.position;
// 计算 Tooltip 的大小和位置
var size = this._getSize(content);
var x = position[0] - size.width / 2;
var y = position[1] - size.height - 10;
// 设置 Tooltip 的内容和位置
this._$tooltip.html(content).css({
left: x,
top: y
});
// 显示 Tooltip
this._$tooltip.show();
};
- Tooltip 的交互:除了显示数据项的信息,Tooltip 还支持交互操作。例如,可以通过配置开启 Tooltip 的坐标轴触发,当鼠标悬停在坐标轴上时也会触发 Tooltip,并显示相应的信息。
总的来说,ECharts 中的 Tooltip 实现原理主要包括事件监听、数据定位、Tooltip 内容生成和定位等步骤。通过这些步骤,ECharts 能够在鼠标悬停在图表上时,准确地显示对应的数据项的详细信息。
那么,在Echarts中会遇到需要自定义tooltip提示框的场景,如何进行提示框内容及样式的自定义呢?
以下为样例:
大体实现逻辑分为三个方面:
1. 更改tooltip背景样式(透明度、边框、背景色、padding)
2. 自定义tooltip文字显示内容
3. 根据不同饼图模块显示不同提示框颜色
实现方式:
1. 通过设置tooltip原生属性
a. backgroundColor背景色为transparent
b. borderColor为transparent
c. padding为0
d. borderWith为0
2. 自定义tooltip文字显示内容
a. formatter定义函数定义文字显示内容,返回值应为一个字符串类型DOM结构即可
formatter: function(params) {
// 显示内容设置
return String
}
3. 根据不同饼图模块显示不同提示框颜色
a. 需要配合饼图的颜色进行提取,饼图series属性中可以设置itemStyle属性的color为颜色数组
itemStyle: {
color: function (colors) {
const colorArr = [ 'xxx', 'yyy', 'zzz' ]
return colorArr[colors.dataIndex]
}
}
b. 需要配合饼图的颜色修改自定义tooltip的formatter函数,进行颜色设置。其中通过params接收饼图的颜色,根据其颜色做处理即可
formatter: function(params) {
// 显示内容设置
return `
<div style='background-color: ${func(params.color)}'>
// 内容
</div>
`
}
如有其他实现方式,欢迎大家补充!