javascript - ChartJS 工具提示滚动条防止数据溢出?
问题描述
我正在使用一个chartJS,其中我有回调函数来在工具提示中显示数据。随着数据的增加,工具提示的溢出部分从画布中隐藏。有没有办法防止工具提示溢出并添加滚动条来滚动工具提示中的数据?
以下是工具提示配置部分
options: {
responsive: true,
tooltips: {
yAlign: "bottom",
enabled: true,
callbacks: {
label: function () {
const item = ["Test1", "Test1", "Test1", "Test1", "Test1", "Test1", "Test1", "Test1", "Test1", "Test1", "Test1", "Test1", "Test1", "Test1", "Test1", "Test1", "Test1", "Test1", "Test1", "Test1", "Test1", "Test1", "Test1", "Test1", "Test1", "Test1", "Test1", "Test1", "Test1"]
let finalLabelValue = [];
item.map(single => finalLabelValue.push(single))
return finalLabelValue;
}
},
},
}
有没有办法在工具提示中添加滚动条并防止画布溢出?
解决方案
不,这是不可能的。如果你真的需要这么大的工具提示,你应该切换到外部HTML 工具提示。
const getOrCreateTooltip = (chart) => {
let tooltipEl = chart.canvas.parentNode.querySelector('div');
if (!tooltipEl) {
tooltipEl = document.createElement('div');
tooltipEl.style.background = 'rgba(0, 0, 0, 0.7)';
tooltipEl.style.borderRadius = '3px';
tooltipEl.style.color = 'white';
tooltipEl.style.opacity = 1;
tooltipEl.style.pointerEvents = 'none';
tooltipEl.style.position = 'absolute';
tooltipEl.style.transform = 'translate(-50%, 0)';
tooltipEl.style.transition = 'all .1s ease';
const table = document.createElement('table');
table.style.margin = '0px';
tooltipEl.appendChild(table);
chart.canvas.parentNode.appendChild(tooltipEl);
}
return tooltipEl;
};
const externalTooltipHandler = (context) => {
// Tooltip Element
const {chart, tooltip} = context;
const tooltipEl = getOrCreateTooltip(chart);
// Hide if no tooltip
if (tooltip.opacity === 0) {
tooltipEl.style.opacity = 0;
return;
}
// Set Text
if (tooltip.body) {
const titleLines = tooltip.title || [];
const bodyLines = tooltip.body.map(b => b.lines);
const tableHead = document.createElement('thead');
titleLines.forEach(title => {
const tr = document.createElement('tr');
tr.style.borderWidth = 0;
const th = document.createElement('th');
th.style.borderWidth = 0;
const text = document.createTextNode(title);
th.appendChild(text);
tr.appendChild(th);
tableHead.appendChild(tr);
});
const tableBody = document.createElement('tbody');
bodyLines.forEach((body, i) => {
const colors = tooltip.labelColors[i];
const span = document.createElement('span');
span.style.background = colors.backgroundColor;
span.style.borderColor = colors.borderColor;
span.style.borderWidth = '2px';
span.style.marginRight = '10px';
span.style.height = '10px';
span.style.width = '10px';
span.style.display = 'inline-block';
const tr = document.createElement('tr');
tr.style.backgroundColor = 'inherit';
tr.style.borderWidth = 0;
const td = document.createElement('td');
td.style.borderWidth = 0;
const text = document.createTextNode(body);
td.appendChild(span);
td.appendChild(text);
tr.appendChild(td);
tableBody.appendChild(tr);
});
const tableRoot = tooltipEl.querySelector('table');
// Remove old children
while (tableRoot.firstChild) {
tableRoot.firstChild.remove();
}
// Add new children
tableRoot.appendChild(tableHead);
tableRoot.appendChild(tableBody);
}
const {offsetLeft: positionX, offsetTop: positionY} = chart.canvas;
// Display, position, and set styles for font
tooltipEl.style.opacity = 1;
tooltipEl.style.left = positionX + tooltip.caretX + 'px';
tooltipEl.style.top = positionY + tooltip.caretY + 'px';
tooltipEl.style.font = tooltip.options.bodyFont.string;
tooltipEl.style.padding = tooltip.options.padding + 'px ' + tooltip.options.padding + 'px';
};
const myPieChart = new Chart(ctx, {
type: 'pie',
data: data,
options: {
plugins: {
tooltip: {
// Disable the on-canvas tooltip
enabled: false,
external: externalTooltipHandler
}
}
}
});
推荐阅读
- python - Python XGBoost 单调约束
- android - ionic cordova build android throwing error The specified command run is invalid
- python - 在 Python 中写入数据后,文本文件保持空白
- sql - 访问 SQL GROUP BY 问题(例如,tbl_Produktion.ID 不是聚合函数的一部分)
- classification - IndexError:索引 5 超出轴 1 的范围,大小为 5
- azure - Azure 存储模拟器无法启动
- python - 如何覆盖 Qt Designer 生成的 PySide2 小部件的方法?
- javascript - Simplebar-vue 在模态框内不起作用
- r - 从R中的字符向量创建文本字符串
- typescript - TypeScript 是否错误地输入了这个 reduce 表达式?为什么?