Đăng nhập

Bài 21: Animation – Chuyển động nâng cao với CSS

CSS transition chỉ áp dụng khi có thay đổi trạng thái (như hover, active), nhưng nếu bạn muốn tạo chuyển động tự động, nhiều bước, hoặc lặp lại liên tục (như loading, rung, nhấp nháy…), thì cần dùng đến @keyframesanimation.

Trong bài này, bạn sẽ học cách:

  • Tạo animation bằng @keyframes
  • Gán animation cho phần tử
  • Điều chỉnh thời gian, số lần lặp, kiểu chuyển động
  • Làm hiệu ứng rung, nhấp nháy, loading đơn giản

1. Cấu trúc animation

@keyframes ten-animation {
  0%   { ... }
  50%  { ... }
  100% { ... }
}

Sau đó gán vào phần tử:

.element {
  animation-name: ten-animation;
  animation-duration: 2s;
  animation-iteration-count: infinite;
}

2. Ví dụ 1: chữ nhấp nháy

@keyframes blink {
  0%, 100% { opacity: 1; }
  50%      { opacity: 0; }
}

.blink {
  animation: blink 1s infinite;
}

HTML:

<p class="blink">Đang tải...</p>

3. Ví dụ 2: nút rung nhẹ khi hover

@keyframes shake {
  0%, 100% { transform: translateX(0); }
  25%      { transform: translateX(-5px); }
  75%      { transform: translateX(5px); }
}

button:hover {
  animation: shake 0.4s;
}

Giúp thu hút sự chú ý khi người dùng rê chuột vào.


4. Ví dụ 3: hộp trượt vào từ trái

@keyframes slideIn {
  from {
    transform: translateX(-100%);
    opacity: 0;
  }
  to {
    transform: translateX(0);
    opacity: 1;
  }
}

.box {
  animation: slideIn 1s ease-out forwards;
}
  • forwards: giữ trạng thái cuối sau khi kết thúc
  • ease-out: chuyển động mượt ở cuối

5. Các thuộc tính animation quan trọng

Thuộc tínhÝ nghĩa
animation-nameTên animation (định nghĩa bằng @keyframes)
animation-durationThời gian chuyển động (ví dụ: 2s)
animation-timing-functionKiểu chuyển động: ease, linear, ease-in
animation-delayĐợi bao lâu mới bắt đầu
animation-iteration-countSố lần lặp (1, infinite)
animation-directionnormal, reverse, alternate, alternate-reverse
animation-fill-modenone, forwards, backwards, both

6. Viết gọn với shorthand

Thay vì viết từng dòng:

animation-name: slideIn;
animation-duration: 1s;
animation-timing-function: ease-out;
animation-fill-mode: forwards;

→ Có thể viết gọn:

animation: slideIn 1s ease-out forwards;

7. Thực hành: Loading xoay vòng

@keyframes spin {
  from { transform: rotate(0deg); }
  to   { transform: rotate(360deg); }
}

.loader {
  width: 40px;
  height: 40px;
  border: 4px solid #ccc;
  border-top-color: #3498db;
  border-radius: 50%;
  animation: spin 1s linear infinite;
}

HTML:

<div class="loader"></div>

8. Ghi nhớ

Khi bạn muốn…Sử dụng gì?
Tạo hiệu ứng hover đơn giảntransition
Tạo hiệu ứng lặp lại hoặc tự động@keyframes + animation
Điều chỉnh tốc độ, số lần, hướnganimation-*
Kết hợp nhiều trạng thái chuyển tiếpkeyframes

Thảo luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Đăng ký nhận tin mới

Nhận bài học, tài nguyên và cơ hội việc làm qua email hàng tuần.

Chúng tôi cam kết không spam. Bạn có thể hủy bất cứ lúc nào.