Convert.com.vn

Lazy loading ảnh và ảnh responsive (srcset): hướng dẫn cho người làm web

Cập nhật · 4 phút đọc

Hai câu hỏi quyết định một trang web tải ảnh hiệu quả hay lãng phí: ảnh nào cần tải ngay? và tải phiên bản lớn cỡ nào? HTML có sẵn câu trả lời cho cả hai: thuộc tính loading="lazy" và bộ đôi srcset, sizes. Bài này dành cho người tự làm website hoặc quản trị nội dung, giải thích cách dùng đúng và các lỗi hay gặp.

Lazy loading là gì?

Lazy loading (tải lười) nghĩa là chỉ tải ảnh khi người đọc sắp nhìn thấy nó. Một bài viết có 20 ảnh, nhưng nếu người đọc chỉ xem nửa trên rồi rời đi, 10 ảnh còn lại không cần tải. Trước đây phải dùng JavaScript, nay mọi trình duyệt hiện đại hỗ trợ sẵn bằng một thuộc tính:

<img src="anh.webp" alt="Mô tả ảnh" width="800" height="600" loading="lazy">

Minh hoạ lazy loading: ảnh trong màn hình đầu được tải ngay, ảnh bên dưới chỉ tải khi cuộn tới
Ảnh trong màn hình đầu tải ngay; ảnh bên dưới chỉ tải khi người đọc cuộn gần tới.

Lỗi thường gặp: lazy load ảnh đầu trang

Nhiều plugin và theme tự gắn loading="lazy" cho mọi ảnh, kể cả ảnh banner đầu trang. Kết quả: trình duyệt hoãn tải đúng ảnh quan trọng nhất, làm chỉ số LCP chậm đi rõ rệt. Quy tắc: ảnh nằm trong màn hình đầu tiên không lazy load; ảnh lớn nhất trong đó nên có thêm fetchpriority="high".

Đừng quên width và height

Ảnh lazy load xuất hiện muộn hơn, nên nếu không khai báo kích thước, nội dung sẽ bị đẩy xuống khi ảnh hiện ra. Luôn khai báo width và height đúng tỉ lệ ảnh.

Tạo các phiên bản kích thước ảnhMiễn phí, không cần đăng ký
Mở công cụ đổi kích thước ảnh

Ảnh responsive với srcset và sizes

Màn hình điện thoại rộng khoảng 400 pixel, màn hình máy tính 1400 pixel hoặc hơn. Dùng chung một ảnh 1800 pixel cho tất cả thì điện thoại tải thừa rất nhiều. srcset cho phép bạn khai báo nhiều phiên bản, trình duyệt tự chọn bản phù hợp:

<img src="anh-1200.webp" srcset="anh-600.webp 600w, anh-1200.webp 1200w, anh-1800.webp 1800w" sizes="(max-width: 768px) 100vw, 720px" alt="Mô tả ảnh" width="1200" height="800">

Minh hoạ srcset: điện thoại tải ảnh 600 pixel, máy tính tải ảnh 1200 pixel từ cùng một thẻ img
Với srcset, mỗi thiết bị tự chọn phiên bản ảnh vừa đủ.
  • srcset liệt kê các file và chiều rộng thật của từng file (đơn vị w).
  • sizes cho trình duyệt biết ảnh sẽ hiển thị rộng bao nhiêu: ở ví dụ trên là toàn màn hình trên điện thoại, 720 pixel trên máy tính.
  • Trình duyệt kết hợp hai thông tin này với mật độ điểm ảnh của màn hình để chọn file nhỏ nhất mà vẫn nét.

Để tạo các phiên bản 600, 1200, 1800 pixel, dùng công cụ đổi kích thước ảnh rồi chuyển sang WEBP. Nếu bạn dùng WordPress, hệ thống đã tự tạo nhiều kích thước và tự sinh srcset khi bạn chèn ảnh.

Thẻ picture: chọn định dạng

Khi muốn phục vụ AVIF cho trình duyệt hỗ trợ và WEBP hoặc JPG cho phần còn lại, dùng thẻ <picture>. Trình duyệt đọc từ trên xuống và dùng nguồn đầu tiên nó hỗ trợ; thẻ <img> bên trong là phương án dự phòng và cũng là nơi đặt alt, width, height, loading.

Checklist nhanh

  • Ảnh lớn nhất màn hình đầu: không lazy, có fetchpriority="high".
  • Mọi ảnh khác: loading="lazy".
  • Mọi ảnh: có width, height và alt.
  • Ảnh rộng hơn khoảng 800 pixel: có srcset và sizes.
  • Định dạng: WEBP hoặc AVIF, có dự phòng nếu cần.

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

Lazy loading có ảnh hưởng SEO không?

Lazy loading bằng thuộc tính loading="lazy" có sẵn của trình duyệt không gây hại cho SEO; Googlebot hiểu và vẫn lập chỉ mục được ảnh. Rủi ro chỉ đến từ các script lazy load tự viết không chuẩn, khiến ảnh không bao giờ được tải nếu không có thao tác cuộn.

Ảnh nền CSS có lazy load được không?

Thuộc tính loading chỉ áp dụng cho thẻ img và iframe. Với ảnh nền CSS, bạn cần JavaScript (ví dụ Intersection Observer) để chỉ gắn ảnh nền khi phần tử sắp xuất hiện, hoặc chuyển ảnh nền quan trọng thành thẻ img.

Có cần srcset nếu ảnh đã nhỏ?

Ảnh hiển thị dưới khoảng 600 pixel và đã được tối ưu thì srcset không mang lại nhiều lợi ích. srcset phát huy tác dụng nhất với ảnh lớn như banner, ảnh bìa bài viết, ảnh sản phẩm chính.

Làm sao biết ảnh nào là ảnh LCP của trang?

Mở trang bằng PageSpeed Insights hoặc Chrome DevTools (tab Performance hoặc Lighthouse). Báo cáo sẽ chỉ rõ phần tử LCP, thường là ảnh banner hoặc ảnh bìa bài viết. Đó chính là ảnh không nên lazy load và nên thêm fetchpriority cao.

Thuộc tính decoding="async" có cần không?

Thuộc tính này gợi ý trình duyệt giải mã ảnh không đồng bộ để không chặn việc hiển thị nội dung khác. Thêm vào ảnh bên dưới màn hình đầu là vô hại; với ảnh LCP, hiệu quả không đáng kể nên không bắt buộc.

Tóm lại

Lazy loading quyết định khi nào tải ảnh, srcset quyết định tải cỡ nào. Kết hợp với định dạng hiện đại và khai báo kích thước đầy đủ, trang của bạn sẽ chỉ tải đúng những gì người đọc thực sự cần.