[HTML5] Picture element, srcset for Responsive Images
keywords: img
, srcset
, size
, picture
, dpi
, dpr
, devicePixelRatio
, device pixel density
, device pixel ratio
這裡說明的主要是 <img>
標籤,而非 CSS 中的 background-image
屬性。
資料來源:Responsive Images @ MDN - Learn HTML - Multimedia and embedding
Example_Using_object_URLs_to_display_images @ Firefox Using files from web application
TL;DR
一般來說,如果你只是要變換相同圖片內容但不同解析度或不同尺寸時,使用 <img srcset>
讓瀏覽器聰明的幫你判斷:
<!-- 時機:使用到的是同樣內容但不同尺寸或不同解析度的圖片時 -->
<!-- 如果沒有需要指定圖片大小,則可以省略 size 讓瀏覽器自己判斷 -->
<img
srcset="elva-fairy-320w.jpg 320w, elva-fairy-480w.jpg 480w, elva-fairy-800w.jpg 800w"
sizes="(max-width: 320px) 280px,
(max-width: 480px) 440px,
800px"
src="elva-fairy-800w.jpg"
alt="Elva dressed as a fairy"
/>
但若你會根據瀏覽器使用到不同張內容的圖片時,那麼使用 <picture>
,寫在越後面的會被當作 fallback:
<!-- 時機:使用到不同內容的多張圖片時 -->
<picture>
<source media="(max-width: 799px)" srcset="elva-480w-close-portrait.jpg" />
<source media="(min-width: 800px)" srcset="elva-800w.jpg" />
<img src="elva-800w.jpg" alt="Chris standing up holding his daughter Elva" />
<!-- default -->
</picture>
<!-- picture 也可以拿來作為支援多種不同的 image type 使用 -->
<picture>
<source srcset="plants.avif" type="image/avif">
<source srcset="plants.webp" type="image/webp">
<img src="plants.jpg" alt="descriptive text">
</picture>
See the Pen Responsive Images with Picture element and srcset by PJCHEN (@PJCHENder) on CodePen.
碰到的問題
在面對不同裝置尺寸的圖片顯示時,常碰到的兩個問題是 art direction problem 和 resolution switching 的問題
not responsive demo @ MDN
Resolution switching problem:需要顯示不同解析度的同張圖
此外,在較小的裝置尺寸上,不需要顯示那麼尺寸很大或解析度很高的圖片,這樣的情況稱作 resolution switch problem。