Trình tạo CSS Loader

Tiếp theo

Spinner cho người dùng biết rằng có việc gì đó đang diễn ra. Công cụ này tạo một spinner hình tròn bằng CSS: đặt đường kính, độ dày viền, màu nhấn và tốc độ quay, xem bản xem trước trực tiếp rồi sao chép mã CSS. Tất cả đều là CSS thuần, không SVG, không JavaScript và không thư viện ngoài.

Cách dùng công cụ

  1. 1

    Đặt kích thước

    Đường kính của spinner tính bằng pixel. 40-80 px vừa với hầu hết nút bấm và vùng nội dung.

  2. 2

    Đặt độ dày viền

    Vòng tròn là một đường viền vẽ trên hình tròn. Viền dày hơn tạo cung rõ nét hơn; 4-8 px trông vừa với kích thước 60 px.

  3. 3

    Chọn màu

    Màu nhấn của cung đang quay. Phần còn lại của vòng tròn giữ màu xám nhạt để cung nổi bật.

  4. 4

    Đặt tốc độ và sao chép mã CSS

    Thời gian cho mỗi vòng quay đầy đủ tính bằng giây. Khoảng 1 giây thường là mức lý tưởng; dưới 500 ms gây cảm giác vội vã, trên 2 giây thì trở nên chậm chạp.

Mã CSS được tạo hoạt động thế nào

.loader {
  width: 60px;
  height: 60px;
  border: 6px solid #eee;
  border-top-color: #10b981;
  border-radius: 50%;
  animation: spin 1s linear infinite;
}

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

Spinner là một hình tròn vẽ bằng đường viền dày. Thuộc tính border-top-color chỉ tô màu phần trên của vòng tròn bằng màu nhấn, nên vòng tròn trông như một cung, và quy tắc @keyframes spin xoay nó quanh tâm. Xoay bằng transform: rotate() giúp hoạt ảnh nhẹ nhàng, vì trình duyệt di chuyển phần tử trên compositor thay vì vẽ lại từng khung hình.

Để hiển thị nó trên trang, hãy thêm một phần tử và nạp mã CSS:

<div class="loader" role="status" aria-label="Đang tải"></div>

Đảm bảo khả năng tiếp cận

  • Thêm role="status" để trình đọc màn hình thông báo spinner.
  • Đặt aria-label với văn bản trạng thái, ví dụ “Đang tải”.
  • Đừng che nội dung sau spinner quá vài giây mà không có phương án dự phòng khi hết thời gian chờ.
  • Tôn trọng prefers-reduced-motion. Với người dùng đã tắt hiệu ứng chuyển động, hãy thay vòng quay bằng hiệu ứng mờ dần đơn giản hoặc dòng chữ tĩnh “Đang tải…”:
@media (prefers-reduced-motion: reduce) {
  .loader { animation: none; background: currentColor; opacity: .4; }
}

Khi nào dùng spinner, khi nào dùng giao diện lạc quan

  • Phản hồi dưới 100 ms: không cần spinner; mắt người gần như không nhận ra độ trễ.
  • 100 ms – 1 giây: một spinner tinh tế (vòng tròn nhỏ, chữ trên nút “Đang tải…”) giúp ngăn nhấp đúp.
  • 1 giây – 10 giây: một spinner nổi bật, lý tưởng là có hiển thị tiến trình nếu đo được.
  • > 10 giây: đây không phải vấn đề của spinner; hãy tìm xem cái gì chậm và khắc phục.

Với việc gửi biểu mẫu và nhấp nút, spinner nằm ngay trong nút thường tốt hơn một lớp phủ toàn trang.

Câu hỏi thường gặp

Dùng CSS cho các spinner đơn giản chỉ một phần tử (mẹo xoay bốn cạnh viền). Dùng SVG khi bạn cần một vệt đuôi thuôn dần, nhiều hoạt ảnh stroke-dasharray, hoặc các đoạn được tô đầy trông như nét cọ. CSS nhỏ gọn và đơn giản hơn; SVG linh hoạt hơn.

Có lẽ vì bạn đang xoay một phần tử lớn hoặc tạo hoạt ảnh cho một thuộc tính không được hợp thành (composite). Hãy giữ spinner nhỏ, dùng transform: rotate() (không phải top/margin), và tránh kích hoạt nó trong khi các hoạt ảnh nặng khác đang chạy.

Gần như luôn theo chiều kim đồng hồ. Spinner xoay ngược chiều kim đồng hồ tạo cảm giác hơi sai, vì hầu hết những tín hiệu xoay trong thực tế (đồng hồ, cối xay gió) đều theo chiều kim đồng hồ. Hãy theo quy ước này trừ khi bạn có lý do cụ thể.

Dùng setTimeout(..., 300) trong JavaScript để thêm lớp (class) của loader, kèm clearTimeout nếu thao tác kết thúc trước. Cách này ngăn hiện tượng nhấp nháy khi phản hồi nhanh mà không che giấu các độ trễ thực sự.

Công cụ liên quan