Bỏ qua tới nội dung
Kiến thức Website· ·12 phút đọc

Skeleton screen là gì và khi nào nên dùng thay spinner

Nguyen Hien
Skeleton screen là gì và khi nào nên dùng thay spinner
Cỡ chữ

Skeleton screen là gì

Skeleton screen (màn hình xương) là kỹ thuật hiển thị một “bộ khung” của nội dung trong khi dữ liệu thật đang tải về từ máy chủ. Thay vì vòng tròn spinner quay giữa màn hình trống, người dùng thấy các khối hình dạng giống với bố cục thật sẽ xuất hiện sau này, thường với hiệu ứng shimmer (ánh sáng lướt qua) để cho thấy đang có gì đó xảy ra.

Tên gọi “skeleton” rất đúng nghĩa đen: đó là bộ xương của trang, đủ để người dùng hiểu cấu trúc nhưng chưa có thịt (nội dung thật). LinkedIn là một trong những công ty đầu tiên phổ biến kỹ thuật này quy mô lớn vào khoảng 2013-2014, và từ đó skeleton screen trở thành chuẩn mực trong thiết kế ứng dụng hiện đại.

Cần phân biệt rõ: skeleton screen không làm trang tải nhanh hơn theo nghĩa kỹ thuật. Dữ liệu vẫn mất chừng đó thời gian để tải. Điều skeleton screen làm được là thay đổi cách người dùng cảm nhận thời gian chờ.

So sánh skeleton screen với spinner và progress bar

Có ba cách phổ biến để báo cho người dùng biết hệ thống đang tải dữ liệu. Mỗi cái phù hợp với tình huống khác nhau:

Kiểu loadingSkeleton screenSpinnerProgress bar (thanh tiến trình)
Cơ chếKhung giả giống bố cục thậtIcon quay cho biết đang xử lýThanh dài lấp đầy dần theo thời gian
Phù hợp khiTải danh sách, card, feed có bố cục cố địnhAction nhanh dưới 1 giây, xử lý nềnUpload file, tải tài nguyên biết trước kích thước
Cảm giác chờCảm thấy nhanh hơn, ít nhàm hơnTrung tính, nhưng dễ nhàm nếu chờ lâuRõ ràng nhất khi cần biết còn bao lâu
Nhược điểmTốn công thiết kế hơnTrống nội dung, dễ bất an nếu chờ lâuKhông dùng được khi không biết trước thời gian

Micro interaction cũng hay đi kèm với skeleton screen, đặc biệt ở phần shimmer animation và transition khi nội dung thật xuất hiện. Đọc thêm tại bài Micro interaction là gì để hiểu nguyên lý phía sau những hiệu ứng này.

So sánh ba kiểu loading indicator: skeleton screen, spinner và progress bar với ưu nhược điểm của từng loại
Ba kiểu báo tải phổ biến nhất và tình huống phù hợp với từng loại

Vì sao skeleton screen làm trang cảm thấy nhanh hơn

Tâm lý học có một khái niệm gọi là “perceived performance” (hiệu năng cảm nhận), khác với hiệu năng thực đo bằng giây. Nghiên cứu về trải nghiệm người dùng cho thấy con người đánh giá tốc độ dựa nhiều vào việc có gì đang xảy ra trên màn hình hay không, hơn là thời gian tuyệt đối.

Skeleton screen hoạt động theo nguyên tắc này. Khi người dùng thấy khung bố cục ngay lập tức thay vì màn hình trắng, não họ diễn giải là “trang đã phản hồi, nội dung đang đến”. So với spinner, skeleton screen còn cho người dùng biết trước nội dung sẽ trông như thế nào, giảm bất ngờ khi dữ liệu xuất hiện và làm chuyển tiếp mượt hơn.

Kỹ thuật thường dùng là CSS shimmer animation: một gradient (dải màu chuyển) từ xám nhạt sang xám sáng hơn lướt qua khối skeleton theo chiều ngang, tạo cảm giác có gì đó đang “điền vào”. Hiệu ứng này rất nhẹ và không cần JavaScript.

Skeleton screen có ở đâu trên web và ứng dụng thực tế

LinkedIn là ví dụ điển hình và phổ biến nhất: khi mở trang chủ, bạn thấy các thẻ (card) xám hình chữ nhật ở vị trí sẽ xuất hiện ảnh đại diện, tên người dùng, và nội dung bài đăng. Facebook cũng dùng kỹ thuật tương tự ở News Feed.

Trên web thương mại điện tử, skeleton screen hay dùng ở lưới sản phẩm: thay vì chờ toàn bộ ảnh và giá tải xong mới hiện, skeleton hiện ngay bố cục lưới để người dùng biết sẽ có bao nhiêu sản phẩm và chúng xếp như thế nào. Ở trang chi tiết sản phẩm, khu vực ảnh chính và mô tả thường có skeleton riêng tải trước phần còn lại.

Ứng dụng di động dùng skeleton screen rất phổ biến vì mạng di động hay không ổn định. Nhiều ứng dụng đọc tin, nghe nhạc, và xem video hiện khung skeleton ngay khi mở, rồi điền nội dung dần khi API trả về dữ liệu.

Ví dụ skeleton screen trên feed bài đăng: khung xám với shimmer animation giữ bố cục trong khi dữ liệu đang tải về
Skeleton screen trên feed bài đăng: khung xám giữ bố cục trong khi dữ liệu đang về, chuyển tiếp mượt khi nội dung thật xuất hiện

Cách làm skeleton screen trong thực tế

CSS thuần đã đủ để làm skeleton screen cơ bản. Tạo một div với kích thước và vị trí giống phần nội dung thật, thêm màu nền xám, rồi thêm CSS animation shimmer là xong phần nhìn thấy. Khi dữ liệu về, ẩn skeleton đi và hiện nội dung thật.

Với dự án React hoặc Next.js, có thư viện như react-loading-skeleton giúp tạo skeleton dễ hơn, tự khớp kích thước với nội dung thật và hỗ trợ dark mode. Ant Design, Material UI và nhiều design system khác cũng đã tích hợp component skeleton sẵn.

Một điểm kỹ thuật quan trọng: skeleton screen chỉ hiệu quả khi dữ liệu tải xong trong vòng 3 giây trở lại. Nếu trang thường xuyên mất hơn 5 giây để tải, skeleton không cứu được trải nghiệm, cần nhìn lại vấn đề từ phía API hoặc cơ sở dữ liệu. Xem thêm về tầm quan trọng của vùng hiển thị đầu tiên tại bài Above the fold là gì.

Nguyên lý CSS shimmer animation cho skeleton screen: gradient lướt qua khối xám tạo cảm giác đang tải dữ liệu
CSS shimmer là kỹ thuật đơn giản nhất để tạo skeleton screen, không cần JavaScript, chỉ cần CSS gradient và animation

Khi nào không nên dùng skeleton screen

Skeleton screen không phải lúc nào cũng phù hợp. Với các action nhanh dưới 1 giây như submit form hay chuyển trang trong single-page application, dùng skeleton có thể gây lộn xộn hơn là giúp. Spinner đơn giản hoặc transition mượt là đủ.

Với hành động cần người dùng chú ý theo dõi tiến trình như upload file hay xử lý thanh toán, progress bar thể hiện rõ hơn. Người dùng cần biết “còn bao lâu nữa”, không phải “sắp có nội dung”.

Với nội dung không có bố cục cố định trước, skeleton dễ tạo kỳ vọng sai. Nếu kết quả tìm kiếm có thể trả về 0 hoặc 50 kết quả, hiện skeleton 5 khối rồi chỉ điền 2 cái sẽ trông lạ. Trường hợp này dùng loading spinner toàn trang hoặc progressive rendering tốt hơn.

Người không rành kỹ thuật cần biết gì về skeleton screen

Nếu bạn đang chủ một website và gặp phàn nàn từ người dùng rằng trang “load chậm” hay “trông nghiệp dư”, một trong những thứ đáng xem xét là cách website báo hiệu trạng thái đang tải. Skeleton screen không phải giải pháp duy nhất, nhưng là dấu hiệu của thiết kế chú ý đến trải nghiệm người dùng.

Câu hỏi thực tế để đặt cho đội thiết kế: khi dữ liệu chưa về, trang trông như thế nào? Nếu câu trả lời là “trắng hoàn toàn” hoặc “spinner giữa màn hình rồi nội dung bật ra đột ngột”, đó là dấu hiệu có thể cải thiện.

Câu hỏi thường gặp về skeleton screen

Skeleton screen có phải tự thiết kế cho từng trang không?

Có, nhưng không phải pixel-perfect. Skeleton chỉ cần khớp bố cục tổng thể, không cần đúng từng chi tiết. Nhiều dự án dùng vài ba kiểu skeleton tái sử dụng được cho card, list item và banner, thay vì thiết kế từng trang riêng.

Skeleton screen có ảnh hưởng đến Core Web Vitals không?

Có, theo hướng tích cực. Skeleton giúp tránh layout shift (nhảy bố cục đột ngột) khi nội dung xuất hiện vì kích thước khung đã đặt sẵn. Điều này giúp cải thiện chỉ số CLS (Cumulative Layout Shift, tổng độ dịch chuyển bố cục), một trong ba chỉ số Core Web Vitals quan trọng nhất theo định nghĩa của web.dev.

Có thể thêm skeleton screen vào website WordPress không?

Được, nhưng cần hiểu rõ phần nào đang tải bất đồng bộ. Nếu website dùng AJAX hay REST API để tải nội dung, lập trình viên có thể thêm skeleton cho đúng phần đó. Nếu trang tải hoàn toàn phía máy chủ theo kiểu truyền thống, skeleton screen không có nhiều ý nghĩa vì trình duyệt chỉ render sau khi HTML tải xong.

Skeleton screen và lazy loading có khác nhau không?

Khác. Lazy loading (tải lười) là kỹ thuật chỉ tải ảnh hoặc nội dung khi người dùng scroll đến gần vùng đó, giúp trang tải nhanh ban đầu. Skeleton screen là cách hiển thị placeholder (chỗ giữ chỗ) trong khi bất kỳ nội dung nào đang tải, dù là lazy load hay bình thường. Hai kỹ thuật hay dùng kết hợp với nhau.

Khi website cần cả tốc độ thật lẫn cảm giác nhanh, Web22 tư vấn kết hợp nhiều kỹ thuật từ skeleton screen đến tối ưu hạ tầng. Tham khảo tại dịch vụ thiết kế UI/UX.

Đọc tiếp

Bài viết
cùng chủ đề.

Tất cả bài viết