Tooltip — всплывающий информационный блок, который появляется при наведении курсора на элемент графика. Внутри tooltip обычно отображаются:
Система tooltip в Chart.js полностью настраивается через
объект plugins.tooltip.
Подключение через CDN:
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
Разметка:
<canvas id="myChart"></canvas>
Создание графика:
const ctx = document.getElementById('myChart');
new Chart(ctx, {
type: 'line',
data: {
labels: ['Январь', 'Февраль', 'Март', 'Апрель'],
datasets: [{
label: 'Продажи',
data: [120, 190, 300, 250],
borderColor: 'blue'
}]
}
});
По умолчанию tooltip уже включён.
При наведении на точку отображается:
title);label);value);Стандартный tooltip автоматически адаптируется под тип графика:
linebarpiedoughnutradarscatterTooltip включается через параметр:
options: {
plugins: {
tooltip: {
enabled: true
}
}
}
Полный пример:
new Chart(ctx, {
type: 'bar',
data: {
labels: ['A', 'B', 'C'],
datasets: [{
label: 'Доход',
data: [15, 25, 40],
backgroundColor: 'orange'
}]
},
options: {
plugins: {
tooltip: {
enabled: true
}
}
}
});
options: {
plugins: {
tooltip: {
enabled: false
}
}
}
После отключения всплывающие подсказки больше не отображаются.
| Параметр | Назначение |
|---|---|
enabled |
Включение/отключение |
mode |
Режим наведения |
intersect |
Требование точного попадания |
backgroundColor |
Цвет фона |
titleColor |
Цвет заголовка |
bodyColor |
Цвет текста |
borderColor |
Цвет рамки |
borderWidth |
Толщина рамки |
padding |
Внутренние отступы |
cornerRadius |
Скругление углов |
displayColors |
Цветные маркеры |
callbacks |
Пользовательские функции |
Показывается ближайшая точка.
tooltip: {
mode: 'nearest'
}
Особенно полезно для линейных графиков.
Показываются значения всех наборов данных по одной оси X.
tooltip: {
mode: 'index'
}
Пример:
datasets: [
{
label: '2024',
data: [10, 20, 30]
},
{
label: '2025',
data: [15, 25, 35]
}
]
При наведении выводятся оба значения.
Отображается весь набор данных.
tooltip: {
mode: 'dataset'
}
Показывается только конкретная точка.
tooltip: {
mode: 'point'
}
Tooltip появляется только при точном наведении.
tooltip: {
intersect: true
}
Tooltip отображается даже рядом с элементом.
tooltip: {
intersect: false
}
Очень полезно для мобильных устройств.
tooltip: {
backgroundColor: '#222'
}
tooltip: {
titleColor: '#fff',
bodyColor: '#ddd'
}
tooltip: {
borderColor: 'red',
borderWidth: 2
}
tooltip: {
cornerRadius: 10
}
tooltip: {
padding: 15
}
tooltip: {
titleFont: {
size: 18
},
bodyFont: {
size: 14
}
}
По умолчанию возле текста отображаются цветные квадраты.
tooltip: {
displayColors: false
}
Система callback позволяет полностью переопределить содержимое.
Основной раздел:
tooltip: {
callbacks: {
}
}
tooltip: {
callbacks: {
title(items) {
return 'Месяц: ' + items[0].label;
}
}
}
tooltip: {
callbacks: {
label(context) {
return 'Продажи: ' + context.raw;
}
}
}
tooltip: {
callbacks: {
label(context) {
return '$' + context.raw;
}
}
}
tooltip: {
callbacks: {
label(context) {
return new Intl.NumberFormat('ru-RU')
.format(context.raw);
}
}
}
tooltip: {
callbacks: {
label(context) {
return context.raw + '%';
}
}
}
Можно вернуть массив строк.
tooltip: {
callbacks: {
label(context) {
return [
'Значение: ' + context.raw,
'План выполнен',
'Рост продаж'
];
}
}
}
В callback-функциях используется объект context.
Основные свойства:
| Свойство | Описание |
|---|---|
context.label |
Подпись |
context.raw |
Исходное значение |
context.dataset |
Набор данных |
context.datasetIndex |
Индекс dataset |
context.dataIndex |
Индекс элемента |
context.formattedValue |
Отформатированное значение |
tooltip: {
callbacks: {
label(context) {
const datasetName = context.dataset.label;
const value = context.raw;
return datasetName + ': ' + value;
}
}
}
new Chart(ctx, {
type: 'line',
data: {
labels: ['Пн', 'Вт', 'Ср', 'Чт'],
datasets: [{
label: 'Посетители',
data: [120, 150, 180, 210],
borderColor: 'blue'
}]
},
options: {
plugins: {
tooltip: {
enabled: true,
mode: 'index',
intersect: false,
backgroundColor: '#1e1e1e',
titleColor: '#ffffff',
bodyColor: '#cccccc',
borderColor: '#555',
borderWidth: 1,
padding: 12,
cornerRadius: 8,
displayColors: true,
callbacks: {
title(items) {
return 'День: ' + items[0].label;
},
label(context) {
return 'Посетители: ' + context.raw;
}
}
}
}
}
});
Tooltip располагается по центру группы.
tooltip: {
position: 'average'
}
Tooltip размещается рядом с ближайшей точкой.
tooltip: {
position: 'nearest'
}
Chart.js автоматически анимирует появление tooltip.
Дополнительная настройка:
animation: {
duration: 300
}
В круговых диаграммах tooltip особенно важен, поскольку сегменты часто не содержат подписей.
new Chart(ctx, {
type: 'pie',
data: {
labels: ['Chrome', 'Firefox', 'Safari'],
datasets: [{
data: [65, 20, 15]
}]
},
options: {
plugins: {
tooltip: {
callbacks: {
label(context) {
const value = context.raw;
return value + '%';
}
}
}
}
}
});
Для stacked-графиков часто требуется отображение общей суммы.
tooltip: {
callbacks: {
footer(items) {
let total = 0;
items.forEach(item => {
total += item.raw;
});
return 'Итого: ' + total;
}
}
}
Tooltip поддерживает дополнительные секции.
footer(items) {
return 'Всего элементов: ' + items.length;
}
afterBody() {
return 'Дополнительная информация';
}
| Callback | Назначение |
|---|---|
beforeTitle |
Перед заголовком |
title |
Заголовок |
afterTitle |
После заголовка |
beforeBody |
Перед основным текстом |
beforeLabel |
Перед строкой |
label |
Основной текст |
afterLabel |
После строки |
afterBody |
После текста |
beforeFooter |
Перед footer |
footer |
Footer |
afterFooter |
После footer |
tooltip: {
callbacks: {
labelColor(context) {
return {
borderColor: 'red',
backgroundColor: 'yellow'
};
}
}
}
tooltip: {
usePointStyle: true
}
Теперь вместо квадратов используются стили точек графика.
Chart.js позволяет полностью заменить стандартный tooltip собственным HTML-блоком.
tooltip: {
enabled: false,
external: externalTooltipHandler
}
function externalTooltipHandler(context) {
const tooltip = context.tooltip;
let tooltipEl = document.getElementById('chart-tooltip');
if (!tooltipEl) {
tooltipEl = document.createElement('div');
tooltipEl.id = 'chart-tooltip';
document.body.appendChild(tooltipEl);
}
if (tooltip.opacity === 0) {
tooltipEl.style.opacity = 0;
return;
}
tooltipEl.innerHTML = tooltip.body[0].lines[0];
tooltipEl.style.opacity = 1;
tooltipEl.style.position = 'absolute';
tooltipEl.style.left =
context.chart.canvas.offsetLeft +
tooltip.caretX + 'px';
tooltipEl.style.top =
context.chart.canvas.offsetTop +
tooltip.caretY + 'px';
}
При большом количестве данных callback-функции могут вызываться очень часто.
Рекомендации:
label;Неверно:
options: {
tooltip: {
}
}
Правильно:
options: {
plugins: {
tooltip: {
}
}
}
В старых версиях:
options: {
tooltips: {
}
}
В современных версиях:
options: {
plugins: {
tooltip: {
}
}
}
Неверно:
label(context) {
return context.value;
}
Правильно:
label(context) {
return context.raw;
}
new Chart(ctx, {
type: 'bar',
data: {
labels: ['Q1', 'Q2', 'Q3', 'Q4'],
datasets: [{
label: 'Прибыль',
data: [125000, 182000, 210000, 175000],
backgroundColor: '#4caf50'
}]
},
options: {
plugins: {
tooltip: {
backgroundColor: '#111',
titleColor: '#fff',
bodyColor: '#0f0',
borderColor: '#0f0',
borderWidth: 1,
callbacks: {
title(items) {
return 'Квартал: ' + items[0].label;
},
label(context) {
const value =
new Intl.NumberFormat('ru-RU')
.format(context.raw);
return 'Прибыль: ' + value + ' ₽';
},
footer(items) {
return 'Финансовый отчёт';
}
}
}
}
}
});