The JavaScript code snippet helps you to create a Canvas based Countdown Timer on a webpage. It uses an HTML canvas element to create a visual representation of the remaining days, hours, minutes, and seconds until a specified date. This timer is helpful for tracking time intervals or creating a sense of urgency on your website.
You can use this code on your website to add a stylish countdown timer. It’s beneficial for creating a sense of urgency, such as for limited-time promotions or event countdowns.
How to Create a Javascript Canvas Countdown Timer
1. First of all, load the Reset CSS by adding the following CDN link into the head tag of your HTML document.
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/meyer-reset/2.0/reset.min.css">
2. Create the HTML structure for your countdown timer. You can place it anywhere on your webpage. The code provides four canvas elements for days, hours, minutes, and seconds.
<div class="item-time">
<div class="card">
<div class="word">DAYS</div>
<canvas class="days" width="50" height="50"></canvas>
</div>
<div class="card">
<div class="word">HOUR</div>
<canvas class="hours" width="50" height="50"></canvas>
</div>
<div class="card">
<div class="word">MIN</div>
<canvas class="minutes" width="50" height="50"></canvas>
</div>
<div class="card">
<div class="word">SEC</div>
<canvas class="seconds" width="50" height="50"></canvas>
</div>
</div>
3. Add styles to your countdown timer using CSS. Customize the appearance to match your website’s design. The following CSS code helps you get started with a dark-themed countdown timer.
body{
font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif;
background: #141414;
display: flex;
justify-content: center;
}
.item-time {
display: grid;
margin-top: 2rem;
grid-template-columns: repeat(4, 1fr);
column-gap: .5rem;
}
.word {
text-align: center;
font-size: 0.8rem;
text-shadow: 0 1px 2px #000;
color: #c1c1c1;
}
.card {
background: #333;
color: #ccc;
padding: 0.5rem;
border-radius: 0.4rem;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.7);
}
4. Finally, add the following JavaScript code to your project. It divides this time into days, hours, minutes, and seconds, and updates the canvas elements accordingly.
class Countdown {
/**
* @param {Date} dateTo
*/
constructor(itemSelector, dateTo) {
this.itemSelector = itemSelector;
let $ = el => document.querySelector(el);
this.dateSelectors = {
d: $('.days').getContext('2d'),
h: $('.hours').getContext('2d'),
m: $('.minutes').getContext('2d'),
s: $('.seconds').getContext('2d')
};
this.dateTo = dateTo;
requestAnimationFrame(() => this.set());
}
/**
* Main function
*/
set() {
let today = new Date();
for (let selector in this.dateSelectors) {
let s = this.dateSelectors[selector];
this.clear(s);
this.setTime(s, this.dateDiff(selector, today, this.dateTo));
}
requestAnimationFrame(() => this.set());
}
/**
* Clear canvas
* @param {canvas} ctx
*/
clear(ctx) { ctx.clearRect(0, 0, 60, 60); }
setTime(ctx, until) {
ctx.font = 'bold 2rem sans-serif';
ctx.shadowColor = "#000";
ctx.shadowOffsetX = 0;
ctx.shadowOffsetY = 1;
ctx.shadowBlur = 2;
ctx.fillStyle = "#ccc";
ctx.textAlign = "center";
ctx.fillText(until, 25, 40);
}
/**
*
* @param {String} datepart enum {'m', 'd', 'h', 's'}
* @param {Date} fromdate
* @param {Date} todate
*/
dateDiff(datepart, fromdate, todate) {
datepart = datepart.toLowerCase();
let diff = todate - fromdate;
let divideBy = {
d: 86400000,
h: 3600000,
m: 60000,
s: 1000,
ms: 1
};
let modulo = {
d: 1,
h: divideBy['d'],
m: divideBy['h'],
s: divideBy['m'],
ms: divideBy['s']
}
return Math.floor(diff % modulo[datepart] / divideBy[datepart]);
}
}
//set tomorrow date
new Countdown('.item-time', new Date(new Date().getTime() + 24 * 60 * 60 * 1000));
That’s all! hopefully, you have successfully created the JavaScript Canvas Countdown Timer on your website. If you have any questions or suggestions, feel free to comment below.
Similar Code Snippets:

I code and create web elements for amazing people around the world. I like work with new people. New people new Experiences.
I truly enjoy what I’m doing, which makes me more passionate about web development and coding. I am always ready to do challenging tasks whether it is about creating a custom CMS from scratch or customizing an existing system.

