В этой статье вы узнаете, как сделать круглые canvas часы, в низу сможете скачать код программы, она была взята со этого сайта.
Если хотите сделать обычные часы, то посмотрите статью
«Часы на JavaScript».
Делаем часы на Canvas:
Первым делом нужно объявить нужные функцию в которой будет код всей программы.
1 2 3 | function clockPainting() { ... } |
Внутри объявляем переменные, которые будут хранить в себе секунды, минуты и часы, в конце берём canvas элемент и делаем его для 2D рисования.
1 2 3 4 5 6 7 8 9 | let now = new Date(); // Создаём объект время let sec = now.getSeconds(); // Получаем секунды let min = now.getMinutes(); // Получаем минуты let hr = now.getHours(); // Получаем часы // Берём Canvas элемент и делаем его для 2D let ctx = document.getElementById("canvas").getContext("2d"); // Сохраняем текущий контекст в стэк ctx.save(); |
Дальше уже делаем базовые настройки canvas, чтобы всё правильно отображалось.
1 2 3 4 | ctx.clearRect(0,0,150,150); // Очищаем Canvas ctx.translate(75, 75); // Перемешаем центр часов в центр Canvas ctx.scale(0.4,0.4); // Уменьшаем размер отображения Canvas ctx.rotate(-Math.PI/2); // Отзеркаливание Canvas |
Тут делаем базовую настройку от рисовки, в начале всё поле, потом центром для отображения делаем центр canvas элемента, уменьшаем размер всей рисовки, это нужно для более компактного размера и чтобы часы за границу не выходили, поседение это отзеркаливание, чтобы стрелки на часах были в правильной позиции.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | ctx.strokeStyle = "black"; // Задаём цвет обводки чёрный ctx.fillStyle = "black"; // Задаём цвет заливки чёрный ctx.lineWidth = 8; // Задаём ширину линий ctx.lineCap = "round"; // определяем как будут выглядеть концы линий ctx.save(); // Сохраняем в контекст ctx.beginPath(); // Ставим кисть // Рисуем циферблат for (var i = 0; i < 12; i++) { ctx.rotate(Math.PI/6); ctx.moveTo(100,0); ctx.lineTo(120,0); } ctx.stroke(); // Нарисовали то, что ранее описали ctx.restore(); // Достаем последний сохраненный контекст из стэка ctx.save(); // Сохранение в стэки |
В этой части кода делаем циферблат, пока без стрелок, пока только полоски которые будут указывать на время, вначале из настраиваем, потом отрисовываем внутри цикла for.
Рисуем всё что мы описали раньше, достаём всё ранее сохранённое в стэки и снова сохраняем в стеки.
1 2 3 4 5 6 7 8 9 10 11 | // Минутная стрелка ctx.rotate((Math.PI/30*min) + (Math.PI/1800)*sec); ctx.lineWidth = 10; // Ширина стрелки ctx.beginPath(); // Ставим кисть ctx.moveTo(-28,0); // Перемешаем кисть ctx.lineTo(112,0); // Рисуем линию ctx.stroke(); // Обводит ctx.restore(); // Восстанавливаем всё сохранённого стэка ctx.save(); // Сохраняем в стэк |
В этом коде делаем минутную стрелку, в конце опять всё сохраняем в стэк.
1 2 3 4 5 6 7 8 9 10 11 12 13 | // Cекундная стрелка ctx.rotate(sec * Math.PI/30); // Поворот стрелки ctx.strokeStyle = "#D40000"; // Цвет контура ctx.fillStyle = "#D40000"; // Цвет заливки ctx.lineWidth = 6; // Ширина линии ctx.beginPath(); // Указываем позицию кисть ctx.moveTo(-30,0); // Перемешаем кисть ctx.lineTo(83,0); // Делаем линию ctx.stroke(); // Выравнивание обводки ctx.restore(); // Восстановление состояния из стэка ctx.restore(); // Восстановление состояния из стэка |
Это последний кусочек кода в функции clockPainting(), и тут мы точно по такому же принципу, как и в предыдущем кусочки, но уже делаем секундную стрелку.
Теперь всё это нужно добавить в интервал в одну секунду.
1 2 3 4 5 | // Событие загрузки страницы window.addEventListener('load', function () { // Создаём интервал setInterval(clockPainting, 1000); }); |
В начале добавляем отслеживание события загрузки страницы, это нужно чтобы вес canvas нормально погрузился, потом уже внутри делаем интервал, в котором используем функцию часов, вот что получилось.

Вывод:
В этой статье вы прочитали как сделать Canvas часы, как видите кода достаточно много, но он не сильно сложный.

