Hướng dẫn real time clock css - đồng hồ thời gian thực css

Bài viết hôm nay chúng ta sẽ cùng nhau đi vào tìm hiểu cách tạo đồng hồ đếm ngược (countdown timer) nhé. Trong trang web thì nó thường được sử dụng chủ yếu cho việc đếm thời gian còn lại của các chương trình khuyến mãi, thời gian ra mắt sản phẩm mới, sự kiện sắp được tổ chức... mà bạn muốn thông báo đến khách hàng. Và để hiểu rõ hơn chúng ta hãy cùng nhau đi vào tìm hiểu nhé!

Nội dung chính ShowShow

  • Cách Tạo Countdown Timer Bằng HTML CSS JS
  • Draft Countdown
  • Pure CSS SVG Countdown (Ready)
  • Javascript Countdown
  • Countdown Timer
  • Pomodoro Clock
  • CSS Variable-Powered Clock
  • FlipDown.js Example
  • Animated Countdown
  • Vanilla JS Countdown clock
  • Material Clock Countdown
  • Colored Countdown
  • Countdown Timer Javascript.
  • CSS Javascript Countdown
  • CSS Countdown Numbers
  • Puff the Magic Countdown (CSS3)
  • Countup and Countdown
  • Google I/O - Countdown 16
  • GSAP New Year Countdown Clock
  • jQuery.countdown example
  • Fancy Countdown Timer
  • Modern Countdown
  • Countdown Timer UI
  • Minimal Countdown Timer
  • Tổng kết:

Cách Tạo Countdown Timer Bằng HTML CSS JS

Đầu tiên khi muốn xây dựng một thứ gì đó thì bạn cần tạo một cấu trúc HTML cho nó. Do đó bạn xem đoạn code dưới đây để thấy được các phần tử HTML có trong Countdown timer nhé:

 

  
    👉
    Thời Gian Khuyến Mãi Kết Thúc
    
      
        10
        9
        8
        7
        6
        5
        4
        3
        2
        1
        0
      
    
  
  Reset

Và kết quả bạn xem ở dưới đây nhé:

See the Pen cau truc html cho coundown timer by haycuoilennao19 (@haycuoilennao19) on CodePen.

Bước tiếp theo là chúng ta cần trang trí lại phần tử nút (button) trong HTML bằng đoạn mã CSS sau đây nhé:

button {
  border-radius: 5px;
  border: none;
  padding: 15px 30px;
  font-size: 24px;
  display: block;
  text-transform: uppercase;
  letter-spacing: 2px;
  cursor: pointer;
  transition: 0.3s ease all;
  line-height: 1;
  display: flex;
  background-color: DodgerBlue;
  color: white;
}
button:hover {
  background: #eee;
  color: #000;
}
.icon {
  margin-right: 8px;
}
.reset {
  font-size: 12px;
  padding: 8px 16px;
  margin: 50px auto 0;
}

Và kết quả bạn xem dưới đây nhé:

See the Pen Them code css cho countdown timer by haycuoilennao19 (@haycuoilennao19) on CodePen.

Việc tiếp theo chúng ta cần làm là ẩn đi những số đếm ngược này lại thông qua thuộc tính overflow: hidden.

 .countdown {
line-height: 1;
position: relative;
display: block;
overflow: hidden;
margin-left: 6px;
width: 33px;
height: 24px;
}
.numbers {
position: absolute;
top: 0;
left: 0;
text-align: center;
transition: 0.3s ease transform;
text-indent: 0;
}
.reset {
font-size: 12px;
padding: 8px 16px;
margin: 100px auto 0;
}
body {
display: flex;
align-items: center;
justify-content: center;
height: 100vh;
background-color: #3ca8de;
}

Và kết quả ở dưới đây nhé:

See the Pen An so trong coundown timer css by haycuoilennao19 (@haycuoilennao19) on CodePen.

Tiếp theo chúng ta cần phải sử dụng Javascript để xây dựng chức năng cho countdown timer. Đầu tiên chúng ta sẽ tạo ra các biến để lấy các phần tử HTML cần thiết như là class countdown, number, reset và biến để lưu thông tin về số đếm cũng như giá trị boolean để xác định quá trình chạy của đồng hồ đếm ngược. Để hiểu rõ hơn bạn xem đoạn code sau nhé:

 const countdownArea = document.querySelector('.countdown');
const numbersArea = document.querySelector('.numbers');
const resetBtn = document.querySelector('.reset');
let interval;
let count = 0;
const height = countdownArea.getBoundingClientRect().height;

Ở trên mình có lưu ý là thuộc tính countdownArea.getBoundingClientRect().height sẽ giúp bạn có thể tính toán được chiều cao các con số của chúng ta. Vậy tại sao chúng ta cần lấy chiều cao của các con số để làm gì?

Như bạn thấy hình ảnh ở trên thì đây là quá trình khi chúng ta chưa sử dụng thuộc tính

button {
  border-radius: 5px;
  border: none;
  padding: 15px 30px;
  font-size: 24px;
  display: block;
  text-transform: uppercase;
  letter-spacing: 2px;
  cursor: pointer;
  transition: 0.3s ease all;
  line-height: 1;
  display: flex;
  background-color: DodgerBlue;
  color: white;
}
button:hover {
  background: #eee;
  color: #000;
}
.icon {
  margin-right: 8px;
}
.reset {
  font-size: 12px;
  padding: 8px 16px;
  margin: 50px auto 0;
}
0 cho class
button {
  border-radius: 5px;
  border: none;
  padding: 15px 30px;
  font-size: 24px;
  display: block;
  text-transform: uppercase;
  letter-spacing: 2px;
  cursor: pointer;
  transition: 0.3s ease all;
  line-height: 1;
  display: flex;
  background-color: DodgerBlue;
  color: white;
}
button:hover {
  background: #eee;
  color: #000;
}
.icon {
  margin-right: 8px;
}
.reset {
  font-size: 12px;
  padding: 8px 16px;
  margin: 50px auto 0;
}
1. Việc chúng ta lấy chiều cao của các con số để tính toán giá trị offset giúp hiển thị đúng số mà chúng ta mong muốn bằng thuộc tính
button {
  border-radius: 5px;
  border: none;
  padding: 15px 30px;
  font-size: 24px;
  display: block;
  text-transform: uppercase;
  letter-spacing: 2px;
  cursor: pointer;
  transition: 0.3s ease all;
  line-height: 1;
  display: flex;
  background-color: DodgerBlue;
  color: white;
}
button:hover {
  background: #eee;
  color: #000;
}
.icon {
  margin-right: 8px;
}
.reset {
  font-size: 12px;
  padding: 8px 16px;
  margin: 50px auto 0;
}
2 trong CSS. Và để hiểu rõ hơn bạn xem đoạn code tiếp theo sau đây nhé:

function createTimer() {
  interval = setInterval(() => {
    count++;
    const offset = height * count;
    numbersArea.style.transform = `translateY(-${offset}px)`
    if (count >= 10) {
             clearInterval(interval);
    }
  }, 1000);
}
createTimer();

Mình xin giải thích một tý về cách hoạt động của đoạn mã trên là:

  • Chúng ta sẽ tăng giá trị cho biến
    button {
      border-radius: 5px;
      border: none;
      padding: 15px 30px;
      font-size: 24px;
      display: block;
      text-transform: uppercase;
      letter-spacing: 2px;
      cursor: pointer;
      transition: 0.3s ease all;
      line-height: 1;
      display: flex;
      background-color: DodgerBlue;
      color: white;
    }
    button:hover {
      background: #eee;
      color: #000;
    }
    .icon {
      margin-right: 8px;
    }
    .reset {
      font-size: 12px;
      padding: 8px 16px;
      margin: 50px auto 0;
    }
    3
  • Sau đó chúng ta sẽ sử dụng
    button {
      border-radius: 5px;
      border: none;
      padding: 15px 30px;
      font-size: 24px;
      display: block;
      text-transform: uppercase;
      letter-spacing: 2px;
      cursor: pointer;
      transition: 0.3s ease all;
      line-height: 1;
      display: flex;
      background-color: DodgerBlue;
      color: white;
    }
    button:hover {
      background: #eee;
      color: #000;
    }
    .icon {
      margin-right: 8px;
    }
    .reset {
      font-size: 12px;
      padding: 8px 16px;
      margin: 50px auto 0;
    }
    3 và
    button {
      border-radius: 5px;
      border: none;
      padding: 15px 30px;
      font-size: 24px;
      display: block;
      text-transform: uppercase;
      letter-spacing: 2px;
      cursor: pointer;
      transition: 0.3s ease all;
      line-height: 1;
      display: flex;
      background-color: DodgerBlue;
      color: white;
    }
    button:hover {
      background: #eee;
      color: #000;
    }
    .icon {
      margin-right: 8px;
    }
    .reset {
      font-size: 12px;
      padding: 8px 16px;
      margin: 50px auto 0;
    }
    5 để có thể tính toán khoảng cách offset của các con số
  • Tiếp theo chúng ta thiết lập giá trị
    button {
      border-radius: 5px;
      border: none;
      padding: 15px 30px;
      font-size: 24px;
      display: block;
      text-transform: uppercase;
      letter-spacing: 2px;
      cursor: pointer;
      transition: 0.3s ease all;
      line-height: 1;
      display: flex;
      background-color: DodgerBlue;
      color: white;
    }
    button:hover {
      background: #eee;
      color: #000;
    }
    .icon {
      margin-right: 8px;
    }
    .reset {
      font-size: 12px;
      padding: 8px 16px;
      margin: 50px auto 0;
    }
    6 mới thông qua thuộc tính
    button {
      border-radius: 5px;
      border: none;
      padding: 15px 30px;
      font-size: 24px;
      display: block;
      text-transform: uppercase;
      letter-spacing: 2px;
      cursor: pointer;
      transition: 0.3s ease all;
      line-height: 1;
      display: flex;
      background-color: DodgerBlue;
      color: white;
    }
    button:hover {
      background: #eee;
      color: #000;
    }
    .icon {
      margin-right: 8px;
    }
    .reset {
      font-size: 12px;
      padding: 8px 16px;
      margin: 50px auto 0;
    }
    2 trong CSS
  • Cuối cùng chúng ta dùng câu lệnh
    button {
      border-radius: 5px;
      border: none;
      padding: 15px 30px;
      font-size: 24px;
      display: block;
      text-transform: uppercase;
      letter-spacing: 2px;
      cursor: pointer;
      transition: 0.3s ease all;
      line-height: 1;
      display: flex;
      background-color: DodgerBlue;
      color: white;
    }
    button:hover {
      background: #eee;
      color: #000;
    }
    .icon {
      margin-right: 8px;
    }
    .reset {
      font-size: 12px;
      padding: 8px 16px;
      margin: 50px auto 0;
    }
    8 để dừng hàm khi giá trị count đạt đến 10.

Và đây là kết quả của chương trình sau khi chúng ta đã thêm đoạn mã Javascript nhé:

See the Pen chức năng countdown timer by haycuoilennao19 (@haycuoilennao19) on CodePen.

Do sợ nó sẽ chạy ngay khi load trang nên bạn chịu khó nhấn vào chữ "Run Pen" để thấy kết quả nha. Việc cuối cùng chúng ta cần làm là thiết lập chức năng reset cho countdown timer (tự động chạy lại khi người dùng nhấn vào nút reset). Và để rest lại các thuộc tính về ban đầu thì bạn xem đoạn mã sau nhé:

clearInterval(interval); 
count = 0;
numbersArea.style.transform = 'translateY(0)'

Dưới đây là đoạn mã Javascript hoàn chỉnh khi chúng ta thêm chức năng reset cho countdown timer nhé:

 const countdownArea = document.querySelector('.countdown');
const numbersArea = document.querySelector('.numbers');
const resetBtn = document.querySelector('.reset');
let interval;
let count = 0;
const height = countdownArea.getBoundingClientRect().height;
createTimer();
resetBtn.addEventListener('click', createTimer);
function createTimer() {
  clearInterval(interval);
  count = 0;
  numbersArea.style.transform = 'translateY(0)'
     interval = setInterval(() => {
    count++;
      const offset = height * count;
    numbersArea.style.transform = `translateY(-${offset}px)`
        if (count >= 10) {
      clearInterval(interval);
    }
  }, 1000);
}

Và kết quả cuối cùng của chúng ta là:

See the Pen them chuc nang reset cho countdown timer by haycuoilennao19 (@haycuoilennao19) on CodePen.

Và đây là nguồn tham khảo của mình nhé: countdown timer

Trước khi đi vào ví dụ thì mình có một số chú ý sau là để xem rõ kết quả hơn bạn chuyển sang chế độ screen 0.5x, 0.25x hay nếu nó không hiển thị thì bạn nhớ xác minh mình là con người trong Codepen mới xem được nhé. Nếu file là SCSS thì bạn có thể chuyển sang CSS ở đây nhé : SCSS to CSS. Nếu chúng ta muốn xem các nguồn được sử dụng trong Codepen để bạn thiết lập ở dưới máy tính thì nhấp vào chữ Resources ở dưới cùng bên trái của Codepen để xem các đường dẫn CDN nha.0.5x, 0.25x hay nếu nó không hiển thị thì bạn nhớ xác minh mình là con người trong Codepen mới xem được nhé. Nếu file là SCSS thì bạn có thể chuyển sang CSS ở đây nhé : SCSS to CSS. Nếu chúng ta muốn xem các nguồn được sử dụng trong Codepen để bạn thiết lập ở dưới máy tính thì nhấp vào chữ Resources ở dưới cùng bên trái của Codepen để xem các đường dẫn CDN nha.

Draft Countdown

Dưới đây là kết quả trên Codepen nha.

See the Pen Draft Countdown by Dorian Camilleri (@doriancami) on CodePen.

Pure CSS SVG Countdown (Ready)

Dưới đây là kết quả trên Codepen nha.

See the Pen Draft Countdown by Dorian Camilleri (@doriancami) on CodePen.

Đếm ngược JavaScript

Dưới Đây Là Kết Quả Trên CODEPEN nHA.

Xem PEN JavaScript Countdown của Glauber Sampaio (@GlAubersampaio) trên Codepen.

Đếm thời gian đếm ngược

Dưới Đây Là Kết Quả Trên CODEPEN nHA.

Xem PEN JavaScript Countdown của Glauber Sampaio (@GlAubersampaio) trên Codepen.

Đếm thời gian đếm ngược

Dưới Đây Là Kết Quả Trên CODEPEN nHA.

Xem PEN JavaScript Countdown của Glauber Sampaio (@GlAubersampaio) trên Codepen.

Đếm thời gian đếm ngược

Dưới Đây Là Kết Quả Trên CODEPEN nHA.

Xem PEN JavaScript Countdown của Glauber Sampaio (@GlAubersampaio) trên Codepen.

Đếm thời gian đếm ngược

Dưới Đây Là Kết Quả Trên CODEPEN nHA.

Xem Bút UI hàng ngày #014: Đồng hồ đếm ngược của Fabio Ottaviani (@supah) trên Codepen.

Đồng hồ Pomodoro

Dưới Đây Là Kết Quả Trên CODEPEN nHA.

Xem đồng hồ pomodoro bút của Putra Aryotama (@putraaryotama) trên Codepen.

Đồng hồ hỗ trợ thay đổi CSS

Dưới Đây Là Kết Quả Trên CODEPEN nHA.

Xem đồng hồ thay đổi BEN CSS của Emily Hayman (@eehayman) trên Codepen.

Flipdown.js ví dụ

Dưới Đây Là Kết Quả Trên CODEPEN nHA.

Xem ví dụ về Pen Flipdown.js của Peter Butcher (@pbutcher) trên Codepen.

Đếm ngược hoạt hình

Dưới Đây Là Kết Quả Trên CODEPEN nHA.

Xem Bút hoạt hình đếm ngược của Florin Pop (@florinpop17) trên Codepen.

Đồng hồ đếm ngược vani js

Dưới Đây Là Kết Quả Trên CODEPEN nHA.

Xem đồng hồ đếm ngược Pen Vanilla JS của Tim Jackleus (@timjackleus) trên Codepen.

Đếm ngược đồng hồ vật liệu

Dưới Đây Là Kết Quả Trên CODEPEN nHA.

Xem đếm đồng hồ vật liệu bút của Mohan Khadka (@khadkamhn) trên Codepen.

Đếm ngược màu

Dưới Đây Là Kết Quả Trên CODEPEN nHA.

Xem đếm ngược màu bút của Chris Coyier (@Chriscoyier) trên Codepen.

Đếm thời gian đếm ngược JavaScript.

Dưới Đây Là Kết Quả Trên CODEPEN nHA.

Xem bộ đếm thời gian đếm ngược bút của Austin Carr (@arcarr) trên Codepen.

CSS JavaScript đếm ngược

Dưới Đây Là Kết Quả Trên CODEPEN nHA.

Xem bộ đếm thời gian đếm ngược bút của Matt Smith (@allthingssmity) trên Codepen.

Số đếm ngược CSS

Dưới Đây Là Kết Quả Trên CODEPEN nHA.

Xem các số đếm ngược CSS của PEN bởi Marcos Oliveira (@MarcosMou) trên Codepen.

Puff The Magic Countdown (CSS3)

Dưới Đây Là Kết Quả Trên CODEPEN nHA.

Xem Bút Puff The Magic Countdown (CSS3) của Scott Dawson (@scottpdawson) trên Codepen.

Đếm và đếm ngược

Dưới Đây Là Kết Quả Trên CODEPEN nHA.

Xem Bút đếm và đếm ngược của Chris Johnson (@chrisjdesigner) trên Codepen.

Google I/O - Đếm ngược 16

Dưới Đây Là Kết Quả Trên CODEPEN nHA.

Xem bút Google I/O - đếm ngược 16 BY 72MENA (@72mena) trên Codepen.

Đồng hồ đếm ngược năm mới của GSAP

Dưới Đây Là Kết Quả Trên CODEPEN nHA.

Xem đồng hồ đếm ngược năm mới GSAP bằng cách sáng tạo hoạt hình (@AnimatedCreativity) trên Codepen.

ví dụ jQuery.Countdown

Dưới Đây Là Kết Quả Trên CODEPEN nHA.

Xem ví dụ pen jQuery.Countdown của Bataimx (@bataimx) trên Codepen.

Hẹn giờ đếm ngược ưa thích

Dưới Đây Là Kết Quả Trên CODEPEN nHA.

Xem bộ đếm thời gian đếm ngược của PEN Fancy với Momentumslider bởi Lmgonzalves (@lmgonzalves) trên CodePen.

Đếm ngược hiện đại

Xem Bút đếm ngược hiện đại của Nathan (@Nathan76877) trên Codepen.