HTML-элемент <canvas> служит базовой точкой входа
для работы с Chart.js, поскольку вся отрисовка графиков выполняется
именно внутри него через Canvas API браузера.
Создание графика начинается с добавления элемента
<canvas> в структуру страницы. Этот элемент
представляет собой пустую область рисования, в которой библиотека будет
формировать изображение графика.
<canvas id="chartCanvas"></canvas>
Идентификатор id используется как связующее звено между
DOM и JavaScript-кодом, позволяя получить доступ к элементу и
инициализировать контекст рисования.
Минимальная структура страницы для работы с графиками включает подключение библиотеки и подготовку canvas:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Chart.js Canvas</title>
</head>
<body>
<canvas id="chartCanvas"></canvas>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
</body>
</html>
Canvas сам по себе не выполняет отрисовку — требуется получить
контекст 2d, который предоставляет API для рисования:
const canvas = document.getElementById('chartCanvas');
const ctx = canvas.getContext('2d');
Контекст ctx является ключевым объектом, через который
Chart.js выполняет все операции построения графиков.
При создании графика в Chart.js передаётся либо DOM-элемент
<canvas>, либо его контекст. На практике чаще
используется сам элемент:
const chart = new Chart(canvas, {
type: 'bar',
data: {
labels: ['A', 'B', 'C'],
datasets: [{
label: 'Пример',
data: [10, 20, 30]
}]
}
});
Библиотека автоматически извлекает контекст и управляет отрисовкой.
Размер canvas определяется двумя способами:
width, height)Эти два подхода не эквивалентны.
<canvas id="chartCanvas" width="600" height="400"></canvas>
Эти значения задают внутреннее разрешение области рисования. Именно они влияют на плотность пикселей и качество изображения.
#chartCanvas {
width: 600px;
height: 400px;
}
CSS изменяет визуальный размер, но не внутреннее разрешение, что может приводить к размытию при несоответствии с атрибутами.
На дисплеях Retina и аналогичных устройствах важно учитывать
devicePixelRatio. Chart.js автоматически адаптируется, но
понимание механизма критично при ручной настройке canvas.
Принцип работы:
Пример ручной настройки:
const canvas = document.getElementById('chartCanvas');
const ctx = canvas.getContext('2d');
const ratio = window.devicePixelRatio;
canvas.width = 600 * ratio;
canvas.height = 400 * ratio;
canvas.style.width = '600px';
canvas.style.height = '400px';
ctx.scale(ratio, ratio);
Chart.js внутри себя управляет:
При изменении размера окна браузера библиотека может пересчитывать геометрию графика, если включена адаптивность:
const chart = new Chart(canvas, {
type: 'line',
data: {...},
options: {
responsive: true,
maintainAspectRatio: false
}
});
Canvas без размеров становится невидимым или имеет дефолтное значение 300×150 пикселей, что часто приводит к неожиданному отображению графика.
Если заданы только CSS-размеры без атрибутов, изображение масштабируется браузером, что ухудшает качество рендеринга.
При создании нескольких графиков на одном элементе без уничтожения предыдущего экземпляра происходит наложение данных и утечки памяти.
chart.destroy();
Для отображения нескольких графиков создаются отдельные элементы:
<canvas id="chart1"></canvas>
<canvas id="chart2"></canvas>
new Chart(document.getElementById('chart1'), {...});
new Chart(document.getElementById('chart2'), {...});
Каждый canvas управляется независимо, включая контекст, размеры и конфигурацию.
Canvas часто размещается внутри блоков с ограниченной шириной:
<div class="chart-wrapper">
<canvas id="chartCanvas"></canvas>
</div>
.chart-wrapper {
width: 100%;
max-width: 800px;
}
При включённой адаптивности Chart.js подстраивает размеры под родительский контейнер, используя его как основу для вычисления ширины.
Корректная последовательность работы:
const canvas = document.getElementById('chartCanvas');
if (canvas) {
new Chart(canvas, {
type: 'pie',
data: {
labels: ['X', 'Y'],
datasets: [{
data: [40, 60]
}]
}
});
}
Перед повторной отрисовкой Chart.js полностью управляет содержимым canvas. При ручной работе очистка выполняется через:
ctx.clearRect(0, 0, canvas.width, canvas.height);
Однако в рамках Chart.js эта операция обычно не требуется, поскольку библиотека самостоятельно перерисовывает сцену при обновлении данных.
Canvas является блочным элементом и подчиняется стандартным правилам CSS. Его поведение зависит от:
При использовании в адаптивных интерфейсах важно учитывать, что изменение размеров контейнера приводит к пересчёту графика.
Canvas выступает как изолированная графическая поверхность, в которой:
Такая модель позволяет Chart.js обеспечивать высокую производительность при работе с большими наборами данных и частыми обновлениями.