Trình tạo bộ tải / Spinner CSS

Chọn hoạt ảnh tải, tùy chỉnh màu sắc và tốc độ, và sao chép mã CSS thuần.

Chọn kiểu

Xem trước

Mã CSS + HTML

Cách sử dụng

  1. Chọn kiểu loader trong thư viện ở trên.
  2. Tùy chỉnh màu, kích thước, tốc độ và độ dày.
  3. Sao chép CSS + HTML được tạo và dán vào dự án của bạn.

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

Các loader này có sử dụng JavaScript không?

Không! Tất cả các hoạt ảnh đều bằng CSS thuần với @keyframes. Chúng hoạt động mà không cần bất kỳ JavaScript nào.

Các loader này có dễ tiếp cận không?

Có, nếu bạn thêm role="status" và một aria-label vào phần tử loader. Người dùng thích ít hoạt ảnh hơn có thể được tính đến với một media query prefers-reduced-motion.

Cách sử dụng

  1. Chọn một kiểu loader: chọn từ spinner, dấu chấm, thanh, vòng, đập hoặc bộ xương.
  2. Tùy chỉnh ngoại hình: điều chỉnh màu, kích thước, tốc độ hoạt ảnh và độ dày với các thanh trượt.
  3. Xem trước hoạt ảnh: loader hoạt động trực tiếp trong khu vực xem trước, để xem chính xác kết xuất.
  4. Sao chép HTML và CSS: lấy markup HTML tối thiểu và CSS được yêu cầu, không có phụ thuộc JavaScript.

Tại sao sử dụng trình tạo loader CSS?

Các chỉ báo tải là các yếu tố UX thiết yếu báo hiệu hoạt động đang diễn ra và tránh để người dùng nghĩ rằng trang bị đóng băng trong các thao tác bất đồng bộ. Các loader CSS thuần, chỉ dựa trên hoạt ảnh CSS, không có JavaScript hay hình ảnh, nhẹ, đáng tin cậy và render ở 60 fps nhờ các biến đổi được tăng tốc bởi GPU. Trình tạo này tạo ra mã spinner sẵn sàng cho sản xuất mà bạn có thể tích hợp trực tiếp vào dự án của mình. Tất cả các hoạt ảnh sử dụng @keyframes với transform và opacity, hai thuộc tính CSS animate mà không gây reflow, đảm bảo render mượt mà ở 60 fps ngay cả trên các thiết bị khiêm tốn.

Các loại loader có sẵn

Lịch sử ngắn gọn của animation CSS hỗ trợ spinner của bạn

Quy tắc @keyframes và viết tắt animation mà trình tạo này tạo ra được định nghĩa trong CSS Animations Module Level 1. Working Draft đầu tiên của W3C được công bố vào ngày 20 tháng 3 năm 2009 và đặc tả cuối cùng đạt được Khuyến nghị W3C vào ngày 11 tháng 12 năm 2018, chín năm sau. Vào lúc đó, mọi trình duyệt được phát hành đã hỗ trợ cú pháp này trong nhiều năm: Safari 4 (tháng 6 năm 2009) với tiền tố -webkit-, Firefox 5 (tháng 6 năm 2011), Internet Explorer 10 (tháng 10 năm 2012), và không có tiền tố bởi Chrome 43 vào tháng 4 năm 2015. CSS Animations Module Level 2 là Working Draft hiện tại và thêm các animation được điều khiển bởi cuộn thông qua animation-timeline (được phát hành trong Chrome 115, tháng 7 năm 2023; Safari và Firefox theo sau vào cuối năm 2024). Sự quay trong preset «spinner» đến từ CSS Transforms Module Level 1, một đặc tả riêng biệt ở Candidate Recommendation từ tháng 2 năm 2019 nhưng được phát hành rộng rãi: transform: rotate(360deg) tại 100% bên trong khối @keyframes là cái làm cho vòng quay.

Khả năng tiếp cận không phải tùy chọn: tùy chọn «Giảm chuyển động»

Mọi hệ điều hành phát hành kể từ năm 2014 đều có cài đặt khả năng tiếp cận «Giảm chuyển động», macOS «Giảm chuyển động» (trong Trợ năng → Hiển thị), iOS «Giảm chuyển động», Windows «Hiển thị animations», Android «Xóa animations», GNOME «Bật animations» tắt. Media query prefers-reduced-motion (được định nghĩa trong Media Queries Level 5, Working Draft công khai đầu tiên của W3C tháng 11 năm 2017) cho phép CSS của bạn phát hiện tùy chọn này và dừng spinner. Luôn bao bọc bất kỳ spinner nào trong:

@media (prefers-reduced-motion: reduce) {
  .spinner { animation: none; }
}

Tiêu chí thành công WCAG 2.1 2.3.3 «Animations từ Tương tác» (Mức AAA, Khuyến nghị W3C 5 tháng 6 năm 2018) yêu cầu rằng bất kỳ animation chuyển động nào được kích hoạt bởi tương tác có thể bị vô hiệu hóa trừ khi chuyển động là cần thiết. Một spinner hiếm khi cần thiết. WCAG 2.2 (tháng 10 năm 2023) kế thừa cùng quy tắc.

Đối với trình đọc màn hình, bao bọc spinner trong <div role="status" aria-live="polite"> với văn bản «Đang tải…» được ẩn về mặt thị giác. Khi tải hoàn tất, thay thế nội dung; vùng live thông báo «Đã tải» cho công nghệ hỗ trợ mà không la hét. Đặt aria-busy="true" trên vùng chứa khi đang tải và aria-busy="false" sau đó. Mẫu này được ghi lại trong chương vùng live của Hướng dẫn Thực hành Tác giả ARIA của W3C.

Tại sao spinner CSS vẫn mượt ở 60 fps

Các pipeline render của trình duyệt hiện đại có ba giai đoạn: layout (tính toán vị trí), paint (lấp đầy pixel), và composite (kết hợp các lớp trên GPU). Các thuộc tính transformopacity là hai cái duy nhất bỏ qua layout paint và chạy hoàn toàn trên thread compositor. Animation chúng về cơ bản là miễn phí ở bất kỳ framerate nào. Animation width, height, top, left, margin, hoặc bất cứ thứ gì thay đổi box model buộc một lần layout-và-paint đầy đủ trên mỗi frame và nhanh chóng giảm xuống dưới 60 fps trên các thiết bị thấp cấp. Mỗi preset trong trình tạo này animation chỉ transformopacity vì lý do này. Nếu bạn cần một gợi ý cho trình duyệt, will-change: transform (được định nghĩa trong CSS Will Change Module Level 1, W3C Candidate Recommendation 26 tháng 4 năm 2022) thăng cấp phần tử lên lớp compositor riêng của nó; sử dụng dè dặt vì mỗi lớp tốn bộ nhớ GPU.

Khi nào một spinner là câu trả lời đúng, và khi nào thì không

Trong Response Times: The 3 Important Limits (1993, được tái xác nhận năm 2014), Jakob Nielsen của Nielsen Norman Group đã định nghĩa ba ngưỡng nhận thức: 0,1 giây là «tức thì», 1 giây là giới hạn cho dòng suy nghĩ không bị gián đoạn, 10 giây là giới hạn để giữ sự chú ý của người dùng. Ánh xạ chiến lược loader của bạn theo những giới hạn này:

Các hàm easing và mỗi hàm cảm nhận như thế nào

Thuộc tính animation-timing-function (và CSS Easing Functions Module Level 1, Candidate Recommendation 6 tháng 12 năm 2022) chọn cách giá trị tiến triển giữa các keyframe:

Lỗi thường gặp

Thêm câu hỏi thường gặp

Các spinner này sẽ hoạt động trên trình duyệt cũ không?

Tất cả các trình duyệt hiện đại (Chrome 43+, Firefox 16+, Safari 9+, Edge 12+) hỗ trợ @keyframestransform mà không có bất kỳ tiền tố nào. Internet Explorer 10 và 11 yêu cầu tiền tố -ms- ở một số nơi nhưng nếu không thì hoạt động. IE 9 và thấp hơn không có hỗ trợ animation CSS: quay lại với GIF động, hoặc sử dụng @supports (animation: spin 1s) để phát hiện tính năng.

Làm thế nào để dừng spinner khi nội dung tải?

Hoặc xóa phần tử khỏi DOM, ẩn nó với display: none hoặc thuộc tính hidden, hoặc tạm dừng animation với animation-play-state: paused. Tạm dừng là rẻ nhất nếu bạn có thể hiển thị nó lại. Nếu bạn đã sử dụng mẫu ARIA, cũng đặt aria-busy="false" trên container và thay thế văn bản tải bằng thông báo trạng thái đã tải.

Tôi có thể tùy chỉnh màu sắc spinner xa hơn những gì picker cho phép không?

Có. CSS đầu ra sử dụng các giá trị hex / rgb / hsl thông thường; thay chúng bằng các biến CSS (var(--brand-primary)) để spinner tuân theo hệ thống thiết kế của bạn. Đối với spinner hai màu, chỉnh sửa viết tắt border-color: border-color: var(--brand) transparent transparent transparent cho ngoại hình cổ điển «cung một phần tư».

Tại sao không chỉ sử dụng animation SVG hoặc Lottie?

Spinner CSS có trọng lượng dưới 200 byte, không cần yêu cầu thêm, không cần runtime JavaScript, và render trước khi bất kỳ tài nguyên bên ngoài nào tải. SVG rất tốt cho hình dạng phức tạp; Lottie rất tốt cho animation do nhà thiết kế tạo ra từ After Effects. Đối với một chỉ báo chung «có thứ gì đó đang tải», CSS là công cụ rẻ nhất làm tốt công việc.

Có gì được theo dõi hoặc gửi đến máy chủ không?

Không. Trình tạo chạy hoàn toàn trong JavaScript của trình duyệt của bạn. Lựa chọn màu sắc, điều chỉnh kích thước và CSS được sao chép không bao giờ rời khỏi trang. Xác minh trong tab Mạng của DevTools.

Công cụ liên quan