Tầm quan trọng của thuộc tính sizes, srcset trong thẻ img

srcset

Công dụng của thuộc tính srcset trên thẻ <img/> là cho phép chúng ta cung cấp các file với kích thước khác file được cung cấp trên src, chúng ta có thể sử dụng srcset vô tư, nếu trình duyệt ko hổ trợ srcset (IE cũ), nó đơn giản chỉ load file trên thuộc tính src.

Trên thuộc tính srcset chúng ta báo kích thước của hình này luôn, medium.jpg 1000w ( có nghĩa hình này width=1000px ) đa phần dùng width có thể giải quyết tất cả các trường hợp, trình duyệt không cần download vẫn biết được độ rộng của file, trên cơ sở đó, trình duyệt tính toán với viewport hiện tại và download hình thích hợp

<img
  src="small.jpg"
  srcset="medium.jpg 1000w, large.jpg 2000w"
  alt="luckyluu blog | Tầm quan trọng của thuộc tính sizes, srcset trong thẻ img"
>

Thử xem trình duyệt đã tính toán thế nào.

Thí dụ kích thước thiết bị là 320px, 1x (là giá trị density của màn hình, xem ở đây https://pixensity.com/list/phone/, hoặc check bằng javascript window.devicePixelRatio).

Chúng ta có 3 hình

  • small.jpg: 500px wide
  • medium.jpg: 1000px wide
  • large.jpg: 2000px wide
500 / 320 = 1.5625
1000 / 320 = 3.125
2000 / 320 = 6.25

Trình duyệt - màn hình của mày là 1x, 1.5625 là tỉ lệ gần nhất với 1, tuy hơi cao nhưng tốt hơn mấy thằng kia. Tao load thằng small.jpg

Nếu là màn hình 2x (nó sẽ lấy gía trị của window.devicePixelRatio), trình duyệt sẽ chọn 3.125 vì nó gần với 2 nhất.

Bên cạnh đơn vị w, tương ứng với kích thước của hình, chúng ta cũng có thể dùng đơn vị x tương ứng cho độ density của màn hình

<img 
  src="image_2x.jpg" 
  srcset="image_2x.jpg 2x, image_1x.jpg 1x" 
  alt="luckyluu blog | Tầm quan trọng của thuộc tính sizes, srcset trong thẻ img"
/>

sizes

Bên cạnh srcset, một thuộc tính rất hay ho khác là sizes, nó cũng sẽ giúp trình duyệt có cơ sở để load hình nào

Nếu không dùng thuộc tính sizes. Trình duyệt ngầm hiểu chúng ta muốn render ảnh ở độ rộng 100vw.

Tầm quan trọng của thuộc tính sizes trong thẻ img

Không phải lúc nào hình sẽ hiển thị hết 100vw của màn hình, ví dụ bạn có mà hình rộng 1000px, hình không hiển thị hết chiều ngang của màn hình, nhỏ hơn một nữa đi, tức là bạn chỉ cần hình có kích thước 1000/2 = 500px là đủ xài

img {
  float: left;
  width: 500px;
}

Trước khi trình duyệt load được css, nó sẽ ko biết được là hình chỉ có hiển thị tối đa 500px, chúng ta báo với nó, "Ê, hình này của tao chỉ hiển thị tối đa là 500px nhé" bằng HTML

<img
  src="small.jpg"
  srcset="medium.jpg 1000w, large.jpg 2000w"
  alt="luckyluu blog | Tầm quan trọng của thuộc tính sizes, srcset trong thẻ img"
  sizes="500px"
>

Nhưng trên điện thoại, chúng ta muốn khác, hình này sẽ full hết 100% viewport,

@media (max-width: 600px) {
  img {
    float: none;
    width: 100vw;
  }
}

Để báo với trình duyệt có một sự thay đổi *nhỏ** trên nếu màn hình < 600px, chúng ta khai báo thuộc tính sizes như sau

<img 
  src="small.jpg"
  srcset="medium.jpg 1000w, large.jpg 2000w"
  alt="luckyluu blog | Tầm quan trọng của thuộc tính sizes, srcset trong thẻ img"
  sizes="(max-width: 600px) 100vw, 500px"
/>

Đoạn trên nếu dịch rad: ê trình duyệt, hình này sẽ render kích thước 100vw khi viewport < 600px, còn lại cứ dùng kích thước 500px

Tầm quan trọng của thuộc tính sizes trong thẻ img

Kích thước trên mobile

Tầm quan trọng của thuộc tính sizes trong thẻ img

css-tricks.com/sometimes-sizes-is-quite-important

Responsive Images: If you’re just changing resolutions, use srcset.