В Chart.js анимация обновления данных является встроенным механизмом, который активируется при изменении состояния графика и вызове метода обновления экземпляра диаграммы. Анимация применяется как к изменению значений наборов данных, так и к структурным изменениям: добавлению, удалению или перестановке элементов.
Основная идея заключается в том, что каждое обновление состояния графика интерпретируется как переход между двумя наборами значений, а библиотека автоматически интерполирует промежуточные состояния.
Обновление графика выполняется через метод:
chart.update();
При вызове update() Chart.js:
requestAnimationFrameЕсли данные изменяются без отключения анимации, каждое обновление превращается в плавный визуальный переход.
Анимация в Chart.js строится вокруг следующих этапов:
Каждый слой (datasets, axes, tooltip элементы) анимируется независимо, но синхронизировано по времени.
Основной объект управления анимацией:
const config = {
type: 'line',
data: {
labels: ['A', 'B', 'C'],
datasets: [{
label: 'Пример',
data: [10, 20, 15]
}]
},
options: {
animation: {
duration: 1000,
easing: 'easeOutQuart'
}
}
};
Easing-функции определяют, как изменяется скорость анимации во времени.
Наиболее часто используемые:
linear — равномерное движениеeaseInQuad — ускорение в началеeaseOutQuad — замедление в концеeaseInOutQuart — плавный старт и финишПример применения:
options: {
animation: {
easing: 'easeInOutQuart'
}
}
Разные easing-функции существенно влияют на восприятие динамики данных, особенно в графиках с резкими изменениями значений.
При изменении массива данных:
chart.data.datasets[0].data = [5, 10, 25, 40];
chart.update();
Chart.js сравнивает предыдущий и новый массив и интерполирует значения по индексу. Это означает:
chart.data.labels.push('D');
chart.data.datasets[0].data.push(30);
chart.update();
Новая точка появляется с нулевого или неопределённого состояния и плавно достигает конечного значения.
chart.data.labels.pop();
chart.data.datasets[0].data.pop();
chart.update();
Удалённая точка анимируется в исчезновение, после чего перерасчитываются оси и масштаб.
Chart.js позволяет управлять анимацией на уровне элементов конфигурации:
options: {
animation: {
x: {
duration: 800
},
y: {
duration: 1200
}
}
}
Такой подход позволяет разделять поведение по осям, создавая асинхронные визуальные эффекты.
В случаях массового обновления данных анимацию часто отключают:
chart.update('none');
или глобально:
options: {
animation: false
}
Отключение анимации используется при:
Chart.js предоставляет хуки для отслеживания прогресса:
options: {
animation: {
onProgress: function(animation) {
console.log(animation.currentStep);
},
onComplete: function() {
console.log('Анимация завершена');
}
}
}
Вызывается на каждом кадре анимации. Используется для:
Срабатывает после завершения всех анимационных фаз.
Если график содержит несколько datasets:
datasets: [
{ data: [10, 20, 30] },
{ data: [15, 25, 35] }
]
Chart.js анимирует каждый набор независимо, но в рамках общего временного окна. Это создаёт эффект параллельных, но согласованных переходов.
При смене типа диаграммы:
chart.config.type = 'bar';
chart.update();
происходит более сложный процесс:
Такие переходы называют структурными анимациями.
Анимация основана на линейной или нелинейной интерполяции:
value(t) = start + (end - start) * progress
где progress изменяется от 0 до 1 в течение
duration.
Для easing-функций применяется преобразование progress:
progress' = easing(progress)
При работе с большими массивами (тысячи точек) анимация становится нагрузкой на canvas.
Используются подходы:
durationdecimation (упрощение данных)При частом изменении данных рекомендуется группировать изменения:
chart.data.datasets[0].data = newData;
chart.data.labels = newLabels;
chart.update();
Это позволяет избежать множественных анимационных циклов.
Chart.js поддерживает настройку стартовых значений:
options: {
animation: {
from: 0
}
}
или через индивидуальные конфигурации элементов, где можно задать начальные параметры отрисовки.
Типовые сценарии:
В каждом случае характер анимации подбирается под частоту обновлений и объём данных.
Если изменяется только часть значений:
chart.data.datasets[0].data[2] = 100;
chart.update();
анимируется только изменённый сегмент, остальные остаются статичными, что снижает визуальный шум и нагрузку.
Chart.js позволяет связывать обновление графика с внешними процессами:
Каждое обновление может инициировать новый анимационный цикл, при этом предыдущий может быть прерван или завершён в зависимости от конфигурации.