Chuyển đến nội dung chính
pixvertoPixverto

Ảnh responsive: srcset, sizes và thẻ picture giải thích dễ hiểu

Điện thoại không cần cùng một file với màn hình 4K. Ảnh responsive cho phép trình duyệt chỉ tải đúng thứ nó cần, giúp trang nhẹ đi mà không giảm chất lượng. Bài này giải thích vấn đề, các công cụ HTML cung cấp và cách áp dụng chúng.

Vấn đề: một file cho mọi màn hình

Nếu bạn phát một ảnh 2000 pixel cho mọi người xem, một chiếc điện thoại có màn hình rộng 390 pixel sẽ phải tải nhiều gấp mấy lần lượng dữ liệu nó hiển thị được. Trên mạng di động, điều đó tốn thời gian lẫn tiền, và làm trang chậm đi đúng với những người ít có điều kiện chịu đựng nhất.

Phát một file nhỏ cho tất cả mọi người cũng không phải câu trả lời, vì các màn hình lớn và màn hình độ phân giải cao sẽ thấy ảnh bị mềm và nhòe. Ảnh responsive giải quyết việc này bằng cách cung cấp nhiều phiên bản của cùng một bức ảnh để trình duyệt tự chọn phiên bản phù hợp.

Ba công cụ: srcset, sizes và picture

Công cụLàm gìDùng để
srcset với mô tả bề rộngLiệt kê nhiều file và bề rộng pixel của chúngCung cấp các kích thước khác nhau của cùng một bức ảnh
sizesCho trình duyệt biết ảnh sẽ được hiển thị rộng bao nhiêuGiúp trình duyệt chọn trong srcset trước khi biết bố cục
picture với sourceCho phép đưa ra các định dạng hoặc cách cắt khác nhauPhát WebP hoặc AVIF kèm phương án dự phòng, hoặc cắt sát hơn trên điện thoại

Một ví dụ cơ bản trông như sau: <img src="photo-800.jpg" srcset="photo-480.jpg 480w, photo-800.jpg 800w, photo-1600.jpg 1600w" sizes="(min-width: 1024px) 800px, 100vw" alt="...">.

src là phương án dự phòng cho trình duyệt cũ. Trình duyệt kết hợp bề rộng bố cục, mật độ màn hình và đánh giá của riêng nó, nên bạn chỉ mô tả các lựa chọn chứ không ép buộc một lựa chọn nào.

Ưu và nhược điểm của ảnh responsive

Ưu điểm

  • Tải về nhẹ hơn trên điện thoại và mạng chậm, thường tiết kiệm được rất nhiều.
  • Ảnh sắc nét trên màn hình độ phân giải cao mà không làm thiệt người khác.
  • Cải thiện các chỉ số tốc độ như Largest Contentful Paint.
  • Dùng HTML chuẩn, không cần JavaScript.

Nhược điểm

  • Phải tạo, đặt tên và quản lý nhiều file hơn cho mỗi ảnh.
  • Thêm mã HTML, và giá trị sizes phải khớp tương đối với bố cục thì mới hiệu quả.
  • Nếu sizes sai, trình duyệt có thể chọn file lớn hơn mức cần thiết.
  • Việc cắt ảnh khác nhau bằng picture làm số phiên bản tăng lên nhiều, nên chỉ dùng ở nơi thật sự cần.

Phần lớn hệ thống quản trị nội dung và CDN ảnh tự tạo các phiên bản và mã HTML giúp bạn, nhờ đó nhược điểm chính biến mất.

Từng bước: triển khai ảnh responsive

  1. 1Chọn các bề rộng. Các lựa chọn phổ biến là 480, 800, 1200 và 1600 pixel. Web nhỏ dùng ít hơn cũng được.
  2. 2Đổi kích thước từ ảnh gốc lớn nhất. Dùng Đổi kích thước ảnh để tạo từng bề rộng, giữ nguyên tỷ lệ khung hình. Đừng bao giờ đổi kích thước từ một bản đã bị thu nhỏ.
  3. 3Nén từng phiên bản. Cho mỗi file qua Nén ảnh. Chất lượng 75 đến 85 hợp với hầu hết ảnh chụp.
  4. 4Viết srcset liệt kê mọi file kèm bề rộng tính bằng pixel và theo sau là chữ w.
  5. 5Thêm sizes khớp với bố cục của bạn, ví dụ (min-width: 1024px) 800px, 100vw: rộng hết màn hình trên màn hình nhỏ, 800 pixel trên màn hình lớn.
  6. 6Giữ phương án dự phòng src và một alt chính xác.
  7. 7Thêm width và height để bố cục không bị giật khi ảnh đang tải.
  8. 8Kiểm tra bằng cách thay đổi kích thước cửa sổ trình duyệt và xem trong bảng Network file nào được tải về.

Dùng picture cho định dạng hiện đại và cắt ảnh theo màn hình

Để cung cấp định dạng hiện đại kèm phương án dự phòng an toàn, hãy bọc các nguồn trong thẻ picture: <picture><source type="image/avif" srcset="photo.avif"><source type="image/webp" srcset="photo.webp"><img src="photo.jpg" alt="..."></picture>. Trình duyệt dùng nguồn đầu tiên nó hỗ trợ, nên không ai thấy ảnh bị lỗi.

Tạo phiên bản WebP bằng JPG sang WebP. Bài về các định dạng giải thích khi nào AVIF đáng để bỏ thêm công sức.

Chính thẻ này cũng có thể hiển thị một kiểu cắt khác trên màn hình nhỏ nhờ thuộc tính media, ví dụ cắt vuông sát hơn trên điện thoại. Cắt ảnh giúp chuẩn bị từng phiên bản. Hãy dành cách này cho những trường hợp chủ thể thật sự cần, vì mỗi phiên bản đều thêm việc.

Những lỗi thường gặp

  • Viết giá trị sizes không khớp với bố cục. Khi đó trình duyệt chọn sai file.
  • Tạo các phiên bản bằng cách đổi kích thước một bản sao của bản sao, làm mất chất lượng.
  • Tải trễ ảnh đầu tiên. Xem hướng dẫn tải trễ ảnh.
  • Quên width và height, gây xê dịch bố cục.
  • Tự viết tay mọi thứ trong khi CMS đã tạo sẵn srcset. Hãy xem HTML trước.

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

srcset và sizes khác nhau thế nào?

srcset liệt kê các file hiện có và bề rộng của chúng. sizes cho trình duyệt biết ảnh sẽ được hiển thị rộng bao nhiêu, để nó chọn được file tốt nhất trước khi biết bố cục trang.

Khi nào nên dùng thẻ picture?

Dùng khi bạn muốn cung cấp định dạng hiện đại như WebP hoặc AVIF kèm phương án dự phòng, hoặc khi một kiểu cắt khác hợp hơn với màn hình nhỏ. Nếu chỉ cần cung cấp các kích thước khác nhau của cùng một bức ảnh thì srcset trên thẻ img là đủ.

Tôi cần bao nhiêu kích thước ảnh?

Ba hoặc bốn bề rộng là đủ cho hầu hết web, ví dụ 480, 800, 1200 và 1600 pixel. Nhiều phiên bản hơn thì khớp sát hơn nhưng tốn thêm công sức và dung lượng lưu trữ.

WordPress có tự làm việc này không?

Có, WordPress tạo nhiều kích thước và thêm srcset cho ảnh trong nội dung. Hãy kiểm tra giao diện và plugin để chắc chắn chúng giữ nguyên phần HTML đó, và tối ưu ảnh gốc trước khi tải lên.

Ảnh responsive có giúp ích cho SEO không?

Gián tiếp có. Tải về nhẹ hơn cải thiện tốc độ và Core Web Vitals, hỗ trợ trải nghiệm trang. Nó không thay đổi cách công cụ tìm kiếm hiểu bức ảnh, nên vẫn cần văn bản alt và tên file tốt.

Thử các công cụ