CSS loader thuần: spinner, chấm nhảy, thanh tiến trình, skeleton không cần thư viện
Mỗi khi trang gọi API, tải ảnh hay gửi form, người dùng cần một tín hiệu cho biết hệ thống vẫn đang làm việc. Công cụ CSS loader generator này có 13 mẫu hiệu ứng loading viết bằng CSS thuần, mỗi mẫu chỉ cần một thẻ HTML. Bạn chỉnh màu, kích thước, độ dày nét, tốc độ, rồi sao chép riêng HTML và CSS, đã kèm văn bản cho trình đọc màn hình và chế độ giảm chuyển động.
Tính năng nổi bật
- 13 mẫu loader: vòng tròn, vòng kép, cung mờ dần, chấm quay quanh vòng, đồng hồ, ba chấm nhảy, ba chấm sáng lần lượt, ba cột nhấp nhô, nhịp lan tỏa, gợn sóng, ô vuông lật, thanh tiến trình không xác định, skeleton ánh sáng lướt
- Mỗi loader chỉ dùng một thẻ span và hai giả phần tử ::before, ::after, không cần thêm div con hay JavaScript
- Chỉnh màu (bảng màu hoặc mã HEX), kích thước 12 đến 160px, độ dày nét, thời gian một vòng từ 0,3 đến 4 giây
- Các thông số được xuất thành biến CSS như --loader-color, --loader-size để đổi nhanh về sau mà không phải sửa từng dòng
- Mã HTML có role="status" và văn bản ẩn cho trình đọc màn hình, có thể đổi câu Đang tải... theo ngữ cảnh
- Chọn cách xử lý khi người dùng bật giảm chuyển động: chạy chậm lại 3 lần hoặc dừng hẳn
- Đặt tên class tùy ý, công cụ kiểm tra tên hợp lệ trong CSS; tên keyframes sinh theo tên class nên không đụng nhau
- Xem trước toàn bộ mẫu trên nền tối hoặc nền sáng, sao chép HTML và CSS bằng hai nút riêng
Vì sao nên dùng loader bằng CSS thuần
Ảnh GIF xoay tròn bị răng cưa trên màn hình độ phân giải cao, khó đổi màu theo thương hiệu và tốn thêm một lượt tải. Thư viện giao diện thì kéo theo nhiều mã không dùng tới chỉ để có một vòng quay. Loader viết bằng CSS thuần nhẹ, sắc nét ở mọi kích thước, đổi màu bằng một biến và chạy ngay cả khi JavaScript chưa tải xong. Vì phần lớn mẫu trong công cụ chỉ chuyển động bằng transform, opacity hoặc vị trí nền, trình duyệt xử lý chúng nhẹ nhàng. Điều khó hơn là làm cho đúng về truy cập: người dùng trình đọc màn hình cần được báo là trang đang tải, người bị chóng mặt cần chuyển động dịu lại. Công cụ làm sẵn hai việc này để bạn không phải nhớ.
Lợi ích khi sử dụng
- Không thêm thư viện hay ảnh, mỗi mẫu chỉ khoảng 0,5 đến 1 KB CSS trước khi nén
- Sắc nét ở mọi kích thước, đổi màu bằng một biến CSS
- Người dùng trình đọc màn hình biết trang đang tải
- Tôn trọng tùy chọn giảm chuyển động của hệ điều hành
- Markup tối giản, dễ gắn vào React, Vue hay HTML thuần
- Chạy hoàn toàn trên trình duyệt, không cần đăng ký
Cách tạo loader CSS
- 1Chọn mẫu: Bấm vào một ô trong lưới mẫu, dùng nút Nền sáng hoặc Nền tối để xem loader trên nền giống trang của bạn.
- 2Chỉnh thông số: Chọn màu, kéo thanh kích thước, độ dày nét và thời gian một vòng. Mẫu không dùng độ dày nét sẽ khóa thanh trượt tương ứng.
- 3Chọn chế độ giảm chuyển động: Để mặc định chạy chậm lại nếu muốn người dùng vẫn thấy trang đang làm việc, hoặc chọn dừng hẳn.
- 4Đặt tên và câu thông báo: Đổi tên class nếu trùng với mã sẵn có và sửa câu Đang tải... cho sát ngữ cảnh, ví dụ Đang gửi đơn hàng.
- 5Sao chép mã: Bấm Sao chép HTML, dán vào chỗ cần hiện loader; bấm Sao chép CSS và dán vào file CSS chung.
Một thẻ HTML, hai giả phần tử: cách các mẫu được dựng
Mẫu vòng tròn chỉ là một hình tròn có viền nhạt, riêng cạnh trên đậm màu, rồi được xoay 360 độ liên tục. Mẫu cung mờ dần dùng conic-gradient để tô màu nhạt dần quanh tâm, rồi dùng mask hình vành khuyên khoét rỗng phần giữa. Mẫu ba chấm nhảy không có ba thẻ con mà là ba lớp radial-gradient trên cùng một nền, keyframes thay đổi background-position của từng lớp để các chấm lên xuống lệch pha. Mẫu ba cột làm tương tự bằng linear-gradient và background-size. Những mẫu cần thêm hình như chấm quay quanh vòng, đồng hồ, gợn sóng thì dùng ::before và ::after. Nhờ vậy HTML luôn chỉ là một thẻ span, dễ chèn vào bất kỳ đâu.
Làm loader dễ tiếp cận với trình đọc màn hình
Một vòng quay chỉ là hình ảnh, trình đọc màn hình không biết nó có nghĩa gì. Mã công cụ xuất ra gắn role="status" cho loader, đây là một vùng thông báo trực tiếp mức lịch sự, và đặt bên trong một câu như Đang tải... được ẩn khỏi mắt bằng lớp visually-hidden nhưng vẫn được đọc. Lưu ý thực tế: một số trình đọc màn hình chỉ thông báo khi nội dung bên trong vùng status thay đổi, không thông báo khi cả vùng vừa được chèn vào trang. Cách chắc chắn nhất là để sẵn thẻ loader trong trang và chỉ chèn câu thông báo vào khi bắt đầu tải. Với khung skeleton thay cho một khu vực nội dung, bạn có thể đặt thêm aria-busy="true" lên khu vực đó trong lúc tải và gỡ ra khi xong.
Chạy chậm hay dừng hẳn khi người dùng bật giảm chuyển động
Người dùng bật tùy chọn giảm chuyển động trong hệ điều hành thường vì chuyển động liên tục khiến họ chóng mặt hoặc mất tập trung. Loader lại là chuyển động lặp vô hạn, nên cần xử lý riêng. Công cụ đưa ra hai lựa chọn. Chạy chậm lại 3 lần giữ được tín hiệu đang tải nhưng dịu hơn nhiều, đây là lựa chọn cân bằng cho phần lớn giao diện. Dừng hẳn tắt mọi animation, loader đứng yên như một biểu tượng, còn câu thông báo ẩn vẫn còn cho trình đọc màn hình. Nếu chọn dừng hẳn, nên có thêm một dòng chữ như Đang tải hiển thị cạnh loader để người dùng biết trang chưa bị treo.
Spinner, thanh tiến trình hay skeleton: chọn loại nào
Spinner như vòng tròn, chấm nhảy hợp với thao tác ngắn và không biết trước thời gian: bấm nút gửi, tải lại một bảng nhỏ. Thanh tiến trình không xác định hợp đặt ở đầu trang hoặc đầu một khung khi cả vùng đang chờ dữ liệu, vì nó chiếm ít chỗ và không che nội dung. Skeleton phù hợp khi bạn biết bố cục sắp hiện ra như danh sách bài viết, thẻ sản phẩm: vẽ sẵn các khối xám theo đúng hình dạng giúp trang không bị giật khi dữ liệu về. Nếu biết chính xác phần trăm đã xong, ví dụ tải tệp lên, hãy dùng thẻ progress của HTML với giá trị cụ thể thay vì loader không xác định.
Tùy biến sau khi dán mã
Khối CSS bắt đầu bằng các biến --loader-color, --loader-track, --loader-size, --loader-thickness và --loader-speed. Muốn có một loader nhỏ màu trắng trên nút bấm, bạn không cần tạo thêm mã mà chỉ ghi đè biến: đặt style="--loader-size: 16px; --loader-color: #fff" trên thẻ, hoặc viết một class phụ. Màu rãnh nhạt --loader-track được công cụ tính sẵn bằng màu chính với độ trong suốt 20%, nếu đổi màu chính bằng tay, hãy đổi cả biến này. Tên keyframes được đặt theo tên class, ví dụ loader-spin, nên nếu đổi tên class trong mã, nhớ đổi cả tên keyframes để không bị trùng với mã khác trên trang.
Tương thích trình duyệt
Các mẫu dùng những tính năng CSS đã được Chrome, Edge, Firefox và Safari hỗ trợ từ lâu như animation, transform, conic-gradient, mask, aspect-ratio, biến CSS và calc(). Mẫu cung mờ dần khai báo cả -webkit-mask và mask để chạy trên các bản Safari cũ hơn. Trình duyệt quá cũ như Internet Explorer không hỗ trợ biến CSS nên loader sẽ không hiện, trường hợp này hiện rất hiếm. Khi xem thử trên trang công cụ, loader chạy bằng đúng đoạn CSS bạn sẽ sao chép, nên những gì bạn thấy chính là kết quả trên trình duyệt đang dùng.
Giới hạn cần biết
Công cụ chỉ có loader dạng CSS thuần với các mẫu cố định, không vẽ loader theo logo hay hình SVG tùy ý. Độ dày nét bị giới hạn tối đa bằng nửa kích thước để hình không vỡ. Mẫu skeleton là một khối chữ nhật đơn, muốn mô phỏng cả thẻ gồm ảnh và vài dòng chữ thì cần ghép nhiều khối với kích thước khác nhau. Loader không tự biết khi nào dữ liệu tải xong, việc hiện và ẩn loader vẫn do mã của bạn đảm nhiệm. Công cụ cũng không kiểm tra độ tương phản màu loader với nền trang, hãy xem thử bằng nút Nền sáng, Nền tối và chọn màu đủ nổi.
Câu hỏi thường gặp (FAQ)
CSS loader là gì?
Là hiệu ứng báo đang tải được vẽ và làm chuyển động hoàn toàn bằng CSS, thay cho ảnh GIF hay thư viện JavaScript. Loại phổ biến nhất là spinner vòng tròn xoay, ngoài ra còn chấm nhảy, thanh tiến trình chạy qua lại và khung skeleton.
Chèn loader vào trang như thế nào?
Dán đoạn HTML vào vị trí cần hiện loader và dán CSS vào file CSS chung của trang. Khi bắt đầu tải thì hiện thẻ đó, tải xong thì ẩn hoặc xóa đi bằng JavaScript hoặc bằng điều kiện hiển thị trong React, Vue.
Vì sao cần role="status" và dòng chữ ẩn?
Người dùng trình đọc màn hình không nhìn thấy vòng quay. role="status" biến loader thành vùng thông báo, còn dòng chữ ẩn như Đang tải... là nội dung được đọc lên. Dòng chữ bị ẩn khỏi mắt bằng lớp visually-hidden nhưng không bị ẩn khỏi công nghệ hỗ trợ.
Dự án đã có lớp sr-only của Tailwind, có cần khối .visually-hidden không?
Không cần. Lớp sr-only của Tailwind và visually-hidden của Bootstrap 5 làm cùng việc. Bạn có thể bỏ khối .visually-hidden ở cuối CSS và đổi class của thẻ span con trong HTML thành sr-only.
Làm loader vòng tròn bằng Tailwind được không?
Được với các lớp có sẵn: size-12 animate-spin rounded-full border-4 border-blue-500/20 border-t-blue-500 motion-reduce:animate-none. Các mẫu khác như chấm nhảy, gợn sóng cần keyframes riêng nên dùng CSS từ công cụ sẽ gọn hơn.
Đổi màu loader cho chế độ tối thế nào?
Ghi đè biến trong media query hoặc class chế độ tối, ví dụ đặt --loader-color và --loader-track mới cho .dark .loader. Không cần sao chép lại toàn bộ khối CSS.
Loader có làm trang chậm không?
Phần lớn mẫu chỉ chuyển động bằng transform và opacity, là những thuộc tính trình duyệt xử lý nhẹ. Mẫu ba chấm nhảy, ba cột, skeleton thay đổi vị trí hoặc kích thước nền nên tốn hơn một chút, nhưng với một vài loader trên trang thì không đáng kể.
prefers-reduced-motion là gì?
Là media query cho biết người dùng đã bật tùy chọn giảm chuyển động trong hệ điều hành. Mã của công cụ dùng nó để làm loader chạy chậm lại 3 lần hoặc dừng hẳn, tùy lựa chọn của bạn.
Dùng nhiều loader khác nhau trên cùng trang được không?
Được. Đặt mỗi loader một tên class khác nhau, ví dụ loader-ring và loader-dots. Tên keyframes được sinh theo tên class nên không bị trùng. Lớp visually-hidden thì chỉ cần giữ một lần.
Vì sao độ dày nét không đổi khi kéo thanh trượt?
Một số mẫu như ba chấm nhảy, ba cột, nhịp lan tỏa, ô vuông lật không có nét viền nên không dùng thông số này, thanh trượt sẽ bị khóa. Với các mẫu còn lại, độ dày tối đa bằng nửa kích thước.
Loader có chạy trong email HTML không?
Thường là không. Phần lớn trình đọc email không hỗ trợ animation và biến CSS, vả lại email không có trạng thái đang tải. Loader phù hợp cho trang web và ứng dụng web.
Mã có dùng được cho mục đích thương mại không?
Được. Đoạn CSS được công cụ sinh ra theo thông số bạn chọn, bạn có thể dùng trong dự án cá nhân lẫn thương mại mà không cần ghi nguồn.
Công cụ có gửi dữ liệu lên máy chủ không?
Không. Việc sinh mã và xem thử diễn ra ngay trong trình duyệt của bạn.
Từ khóa liên quan
- css loader
- css loader generator
- css spinner
- loading css
- hiệu ứng loading css
- spinner css thuần
- tạo loader online
- loading animation css
- css loading dots
- skeleton loading css
- progress bar css indeterminate
- vòng tròn loading css
- loader không cần javascript
- role status loading
- prefers-reduced-motion loader
- tailwind spinner
- hiệu ứng chờ tải trang
- css pulse animation
- ripple loader css