
簡介
在現代網頁開發中,圖片經常佔據頁面載入量的大宗,因此如何有效地提供「響應式 (Responsive Web Design, RWD) 圖片」成為前端優化的重要課題。
響應式圖片可以根據使用者裝置的螢幕尺寸與解析度,智慧地載入最適合的圖檔,避免在行動裝置上下載過大的圖片,也能在高解析度螢幕(如 Retina 顯示)上提供清晰的圖像。為達成這個目標,HTML 提供了 <picture> 元素以及 srcset 和 sizes 等屬性,讓我們得以為不同情境定義替代的圖片來源。透過善用這些技術,搭配現代高效能的圖片格式(如 WebP、AVIF),可以大幅節省頻寬並加快頁面載入速度。
本文將以實務角度介紹如何使用 <picture> 元素與 srcset/sizes 屬性來實作 RWD 圖片。內容涵蓋多種操作範例,包括針對高 DPI 螢幕提供@2x圖、使用不同螢幕尺寸載入不同構圖的圖片,以及提供 WebP/AVIF 圖片格式的漸進增強。每個重點皆附有可直接複製的範例代碼,並提供實際建議與應用情境。最後,我們還會準備常見問題的問與答 (Q&A) 單元,解答在實作響應式圖片時可能遇到的疑問。
為何需要響應式圖片?
不同使用者的裝置有著多樣的螢幕特性:從小尺寸的手機到高解析度的桌機螢幕,傳統上若只提供一張固定尺寸的圖片,很可能在某些情境下不是太大就是太小。例如,一張1920px寬的橫幅圖,如果在手機上完整下載,不但浪費行動網路的頻寬,還可能因為縮放過小而細節模糊;相反地,一張適合手機的小圖在4K桌機螢幕上又會顯得失真。響應式圖片的概念就是為了解決這種一圖難全的問題——我們預先準備好不同尺寸或不同版本的圖像,讓瀏覽器按照裝置條件自動挑選最合適的那一個。
使用 <picture> 與 srcset 等技術有多項明顯的優勢:
- 節省頻寬,提升效能:在小螢幕或低網速環境下,自適應地載入較小的圖檔,減少下載量,加快頁面呈現。
- 畫面清晰度最佳化:在高 DPI 裝置(如Retina螢幕)上自動載入高解析度版本圖片,確保圖像銳利不模糊,同時在一般裝置上仍可使用較小檔案避免浪費。
- 多格式支援:透過 <picture> 的 <source> 元素,我們可以提供進階壓縮格式(如WebP、AVIF)的圖片來源,瀏覽器若支援該格式則載入更高效能的版本,否則回退到傳統JPEG/PNG。例如 WebP 圖片通常比等品質的 JPEG 小25–35%、AVIF 則可小到約一半大小,但由於某些舊版瀏覽器不支援這些格式,因此需要後備機制。
- Art Direction(藝術指引):對於需要在不同裝置上呈現不同裁切或構圖的情境,也可以利用 <picture> 針對桌機與手機分別提供截然不同的圖檔,以最佳方式呈現重點內容。
簡而言之,響應式圖片能依據使用者環境動態選圖,提升體驗與效能。在下文中,我們將詳細說明如何使用 HTML 語法達成上述目標。
基本 <img> 圖片與範例
在討論進階的響應式圖片語法之前,先回顧基本的 <img> 用法。一般而言,在HTML中插入圖片只需使用 <img> 標籤搭配必要的屬性:
<img src="images/photo.webp" alt="說明文字">
上述範例中,src 指定圖片檔案路徑,alt 則提供圖片的替代文字說明(以利無法視覺瀏覽時的輔助工具使用)。然而,這種方式對所有裝置皆提供同一張圖,無法根據螢幕大小或解析度調整,可能導致某些裝置下載了不必要的大圖或顯示模糊的小圖。
為了改善這點,HTML5 引入了 srcset 屬性和相關機制。我們可以在 <img> 中加入 srcset,提供多種解析度或尺寸的圖檔清單,讓瀏覽器自動選擇合適的檔案載入。以下章節將介紹如何使用 srcset 提供不同解析度的圖片,以及如何搭配 sizes 屬性優化對不同版面尺寸的支援。
(另外,建議在所有圖片上加上寬度和高度屬性(如 width、height),以提前告知瀏覽器圖片尺寸,避免載入期間版面跳動。這對提升累積版面位移(CLS)等效能指標很有幫助。)
使用 srcset 提供高解析度圖片(DPR 切換)
裝置像素比 (Device Pixel Ratio, DPR) 指的是螢幕單位邏輯像素由多少物理像素點構成。例如一般桌機或非Retina螢幕的 DPR = 1,表示1個CSS像素等於1個實體像素點;而某些高解析度手機的 DPR = 3,代表1個CSS像素需要3×3的實體像素點來顯示。因此,在高 DPR 的裝置上,如果仍然使用原尺寸的圖片,顯示時就會被「放大」而顯得模糊。為了解決這個問題,我們可以提供更高解析度(更大像素尺寸)的圖檔給高DPR裝置,讓顯示效果維持銳利。
srcset 屬性的一種用法,就是利用「像素密度描述詞」(x-descriptor)來列出不同解析度的圖片版本。例如,下方程式碼示範了一個 avatar 頭像在一般和 Retina 螢幕下載入不同圖檔:
<img src="avatar@1x.webp"
srcset="avatar@1x.webp 1x, avatar@2x.webp 2x, avatar@3x.webp 3x"
alt="使用者頭像" width="64" height="64">
在這個範例中,我們準備了三張正方形圖片:avatar@1x.webp 為基礎的 64×64 像素圖,avatar@2x.webp 為 128×128 像素,avatar@3x.webp 為 192×192 像素。HTML中透過 srcset 列出各檔案及其對應的像素密度(1x, 2x, 3x)。瀏覽器將根據裝置的 DPR 自動挑選最合適的圖檔載入。例如:
- 一般螢幕 (DPR=1) 會下載並顯示 avatar@1x.webp,因為它已符合顯示尺寸需求 (64px)。
- Retina螢幕 (如DPR=2) 則會優先下載 avatar@2x.webp,在64px框架中呈現更高的細節密度,使圖像更清晰。
- 更高解析度的裝置 (DPR=3) 則會使用 avatar@3x.webp 以確保最佳品質。
需要注意的是,在 srcset 屬性中不可同時混用 x 描述詞和 w 描述詞(接下節將介紹何為 w 描述詞),否則瀏覽器將無法解析而忽略整個 srcset。在上述範例中我們純粹使用了 x 描述詞。由於我們也提供了 src="avatar@1x.webp" 作為預設圖片,即使遇到不支援 srcset 的舊瀏覽器(例如 IE11),也至少會載入 avatar@1x.webp 來作為後備顯示。
透過這種方式,我們僅用一行HTML就實現了不同解析度裝置載入不同圖檔,無需撰寫額外的CSS或JavaScript邏輯。當有新的高解析度裝置問世時,只要其瀏覽器支援 srcset,這種設計也能自動適用。接下來,我們將探討另一種情況:當圖片在不同裝置上呈現的版面尺寸也不相同時,如何使用 srcset 搭配 sizes 來進一步優化。
使用寬度描述符與 sizes:針對不同螢幕尺寸提供圖片
上述 srcset 僅考慮了裝置像素比,但在RWD版面中,圖片本身顯示的大小也可能隨螢幕寬度而改變。例如,一張新聞內文的圖片在桌面設備上也許佔據容器的800px寬度,但在手機上可能縮減為400px寬度。若我們一律提供桌面用的800px大圖,手機用戶就下載了超出實際需要尺寸的圖檔,造成浪費。相反地,只提供小圖又無法滿足大螢幕的清晰度需求。
為了解決不同螢幕尺寸下的圖片大小問題,srcset 的另一用法是寬度描述詞(w-descriptor)。我們可以在 srcset 列出多個不同實體寬度的圖片,並透過 sizes 屬性告知瀏覽器各種視窗大小下圖片預計會呈現的顯示寬度。瀏覽器會在尚未下載圖片前,先根據 sizes 計算出圖片的預期顯示尺寸,再從 srcset 中選擇最接近該尺寸的圖檔載入。
範例:srcset + sizes 實作響應式圖片
假設有一張橫向的風景照片,我們希望在小螢幕上以較小尺寸顯示、在大螢幕上以較大尺寸顯示。我們準備了三個尺寸的圖檔:小 (480w)、中 (800w)、大 (1200w)。以下是HTML實作:
<img src="photos/landscape-small.webp"
srcset="photos/landscape-small.webp 480w,
photos/landscape-medium.webp 800w,
photos/landscape-large.webp 1200w"
sizes="(max-width: 600px) 480px, 800px"
alt="風景照片">
說明:
- srcset 中列出了三種圖片資源和各自的寬度描述值(例如 480w 表示該圖檔寬度為480px)。請確保這些數字與實際圖檔像素寬度一致。
- sizes 屬性提供了媒體條件與長度的對應關係,用來描述「在不同視窗寬度下,此圖片元素的排版寬度大約是多少」。在此例中,(max-width: 600px) 480px, 800px 表示:當視口寬度不超過600px時,預估圖片會呈現約480px寬;超過600px寬度時,預估圖片顯示寬度約為800px。(這通常對應我們的CSS設計:例如手機版排版中圖片佔滿屏幕寬度約480px,而桌機版內容區給圖片預留了800px寬。)
瀏覽器解析上述屬性時的行為如下:
- 根據目前裝置的視口寬度,套用 sizes 中的媒體條件,計算出圖片在該裝置上的預期顯示寬度(稱為slot size)。例如裝置寬度為500px時符合第一個條件,slot size = 480px;裝置寬度為800px時不符合第一條件,套用預設的800px。
- 瀏覽器再將這個slot寬度乘上裝置的 DPR(考量高解析度螢幕需求)。假設在寬度800px、DPR=2的裝置上,計算得理想圖像寬度為 800px × 2 = 1600px。
- 最後,瀏覽器從 srcset 提供的清單中挑選一個寬度最接近理想值的圖檔來下載。例如在DPR=1且視口500px情況下,理想寬度≈480px,則選擇 landscape-small.webp(480w);在DPR=1且視口800px時理想寬度≈800px,挑選landscape-medium.webp(800w);若在DPR=2且視口800px(理想1600px)時,則因我們的最大資源是1200w,瀏覽器會取 landscape-large.webp(1200w)作為最接近的選擇。
透過上述機制,裝置最終只會下載一張最適合其需求的圖片,不會像傳統做法那樣「一網打盡」把所有圖都載入。例如在小螢幕手機上,只會下載 480w 的圖,而較大的 800w、1200w 圖片都不會被載入,達到節省流量的效果。
注意事項
- 如果使用 w 描述詞,就必須搭配 sizes 屬性,否則瀏覽器無從得知圖片的預計顯示大小,將無法正確挑選資源。換言之,沒有 sizes 時瀏覽器會假設預設尺寸為 100vw(視窗全寬),這在多數情況下都不精確。
- sizes 屬性的值可以使用各種長度單位,包括絕對單位(px)或相對視窗的單位(vw)等,但不能使用百分比(%)。因為 % 相對的是父元素,在瀏覽器解析 <img> 時CSS可能尚未載入完成,無法得知父元素寬度。相對地,媒體查詢中的條件應針對視口寬度或其他環境值,而不是直接使用CSS選擇器。以上述例子來說,(max-width: 600px) 指的是瀏覽器視窗寬度條件,而 sizes 後面的數值則假設對應圖片元素的CSS排版寬度。
- 列出 sizes 時,媒體條件的順序需特別留意。它不像CSS媒體查詢那樣後者覆蓋前者,而是瀏覽器會從左到右依序評估,採用第一個符合條件的數值。因此一般寫法是從最大(最寬)條件寫到最小條件,最後一個不帶條件的數值作為預設值。
- 與 x 描述詞不同的是,w 描述詞描述的是圖片的實體像素寬度,因此 srcset 列表中的每個檔案應清楚標明其像素尺寸(如1200w)。不要混淆這個值和文件中圖片元素的顯示尺寸——前者是檔案屬性,後者是版面呈現結果。
透過 srcset + sizes,我們實現了根據版面需要載入不同大小的圖檔。這在響應式版型中非常常見,例如橫幅圖在行動裝置上縮小顯示、在桌機上放大顯示,都能靠此機制自動優化。不僅節省行動端的流量,也確保大螢幕有足夠解析度的圖可以看清細節。
<picture> 元素的進階用法
單靠 <img> 搭配 srcset/sizes 已能涵蓋許多情境,但當我們遇到更複雜的需求時,HTML 的 <picture> 元素提供了更強大的彈性。<picture> 容器內可以包含多個 <source> 子元素,每個 <source> 定義了一種替代的圖片資源及其條件(例如適用的媒體條件或格式類型),最後再以一個 <img> 作為預設的後備內容。瀏覽器會依序評估 <source> 列表,選擇最符合條件且瀏覽器支援的第一個圖片來源載入;如果沒有任何 <source> 符合(或瀏覽器不支援 <picture> 元素),則會退而使用 <img> 標籤中指定的 src 圖片。這種結構允許我們實現下列兩種主要功能:
- 不同情境不同圖片(Art Direction):針對不同裝置尺寸或方向,提供截然不同的圖片檔案,例如桌機載入全景的大圖,手機載入裁切後的縮圖,以確保重點清晰且版面最佳化。
- 提供多種圖片格式後備:一次提供新格式與傳統格式的圖片來源,如優先使用AVIF或WebP格式,瀏覽器不支援時再自動回退到JPEG/PNG。
接下來我們透過兩個範例,說明 <picture> 元素的用法。
範例1:依螢幕尺寸切換不同構圖
想像一個情境:我們的網站橫幅圖在桌機版希望展示全景寬闊的視野,但在手機狹窄螢幕上,由於空間有限也許需要裁剪圖片聚焦於主體。為達成藝術指引的效果,我們可以為兩種裝置準備不同的圖片,並利用 <picture> 的 <source media> 屬性根據視窗寬度加以切換:
<picture>
<!-- 桌機版本圖片(當螢幕寬度大於768px時使用) -->
<source media="(min-width: 768px)" srcset="images/banner-wide.webp">
<!-- 行動版圖片(當螢幕寬度小於768px時使用) -->
<source media="(max-width: 767px)" srcset="images/banner-mobile.webp">
<!-- 後備的 img,如果不符合上述任一條件則載入此圖 -->
<img src="images/banner-mobile.webp" alt="網站橫幅">
</picture>
在此範例中,我們提供了banner-wide.webp(適合大螢幕的寬圖)以及banner-mobile.webp(為小螢幕優化的圖)。瀏覽器會根據當前視窗大小,套用對應的媒體條件:
- 當視口寬度≥768px時,符合第一個 <source> 的條件,因而載入 banner-wide.webp。
- 當視口寬度小於768px時,匹配第二個 <source>,載入 banner-mobile.webp。
- <img> 內的 src 也指向 banner-mobile.webp 作為預設,確保在不支援 <picture> 的舊瀏覽器中(如 IE11)至少會顯示行動版的圖片。
透過這種做法,我們可以針對不同裝置提供構圖完全不同的圖像,而非僅僅縮放同一張圖。需要注意,這種情境已超出了 srcset+sizes 的能力範圍——因為 sizes 只能告訴瀏覽器最終顯示寬度,無法解決「不同裝置需要不同照片內容」的問題。<picture> 則透過多組 <source> 來源突破了單一圖片的限制,讓開發者能充分掌控在各情境下呈現的圖像。
範例2:提供現代格式與後備格式
另一個常見需求是使用次世代圖片格式來縮減檔案體積。WebP 和 AVIF 等格式能顯著減少文件大小(例如 WebP 比 JPEG 平均小25~35%;AVIF 比 JPEG 小約50%),然而並非所有瀏覽器都支援它們。為了兼容性,我們可以使用 <picture> 元素同時提供多個格式版本的圖檔,讓瀏覽器自動挑選支援的格式載入,不支援時再用後備格式。範例如下:
<picture>
<source srcset="photos/image.avif" type="image/avif">
<source srcset="photos/image.webp" type="image/webp">
<img src="photos/image.webp" alt="說明文字">
</picture>
上述程式碼中,瀏覽器會依序檢查各 <source>:
- AVIF 格式來源:如果瀏覽器支援 AVIF(type="image/avif"),則優先使用 photos/image.avif。
- WebP 格式來源:如果不支援 AVIF但支援 WebP,則載入 photos/image.webp。
- JPEG 後備:如果上述新格式皆不支援,最終會退回 <img> 的 image.webp (傳統JPEG) 來確保至少有圖片可用。
這樣的結構確保了在支援新格式的環境下用戶獲得最佳效能(檔案更小、載入更快),而在舊環境下仍有相容的內容。由於 AVIF 支援直到近年才陸續在各大瀏覽器實裝完成,我們強烈建議在使用 AVIF 時務必提供後備(如 WebP 或 JPEG)。好消息是,現今Chrome、Firefox、Safari、Edge等主流瀏覽器皆已支援 WebP 和 AVIF,使用 <picture> 可以放心地進行漸進增強。而對於完全不識別 <picture>/<source> 的極少數老舊瀏覽器,仍會直接解析 <img> 來顯示 JPEG 圖,不至於一張圖都出不來。
Tip: <source> 元素也能與 media 屬性和 type 屬性結合,這意味著我們可以針對不同裝置情境提供不同格式的圖。例如,你可以提供「行動版 WebP」和「桌機版 WebP」各自對應不同裁切的圖,再分別搭配對應的 JPEG 後備。不過在實務上,通常會以格式為主做區分,而在各格式中都保持相同構圖;若需要同時處理格式與構圖差異,可以將 <picture> 的結構進一步細分成多組 <source> 作條件判斷,但要注意避免過於複雜難以維護。
圖片效能優化與測試建議
運用 srcset/sizes 以及 <picture> 後,我們已經能大幅改善圖片在各種裝置上的載入效能與呈現效果。但要充分發揮它們的效益,還有一些實務上的最佳做法與測試方法值得注意:
- 適當數量的圖片版本:準備響應式圖片時,不一定版本越多越好。圖片檔案需要額外的製作與管理成本,過多的版本也增加HTML大小與複雜度。一般來說,針對常見的裝置分幾檔即可。例如寬度切換可考慮小(如480px)、中(768px或800px)、大(1200px)這幾種檔案,以涵蓋手機、平板/小筆電、桌機等範圍;解析度切換則至少提供1x和2x兩檔(Retina),如有特別需求再考慮3x。藉由分析網站的流量裝置分布,可以決定最具代表性的斷點來產生圖檔。總之在品質與效能間取得平衡,避免過細的切分導致維護困難。
- 自動化與工具:手動製作多種尺寸的圖片可能繁瑣且易出錯。建議利用圖片處理工具或腳本自動化這個流程。許多圖片壓縮工具、前端構建工具甚至CDN服務都支援根據原圖生成不同尺寸/格式的版本。善用這些工具能節省時間並確保圖片經過妥善壓縮。此外,可以使用現有的響應式圖片套件或元件,但對於純HTML/JS範疇,本篇重點在原生語法,不贅述外部庫。
- Lazy Loading(延遲載入):如果頁面有大量圖片,建議結合原生的延遲載入屬性 loading="lazy"。這會使非首屏的圖片在用戶將要捲動到時才載入,減少初始頁面加載壓力。此屬性在現代瀏覽器均已支援,搭配響應式圖片可進一步提升效能,兩者並不衝突。
測試與驗證
完成開發後,務必在多種裝置和瀏覽器上測試圖片行為。以下是幾個重點:
- DevTools 模擬測試:利用瀏覽器開發者工具的裝置模擬功能,切換不同裝置尺寸和 DPR,觀察對應載入的圖片檔案是否正確(在Network面板中可檢視實際下載了哪個檔案)。確認小裝置沒有載入過大的圖,大裝置有獲取高解析度圖。
- Performance Audit:使用像 Google Lighthouse 或 WebPageTest 的效能稽核工具,檢視有無殘留問題。例如 Lighthouse 會提示「Properly size images」(圖片大小是否適當)或「Serve images in next-gen formats」(是否提供新世代格式圖片)。實作響應式圖片後,這些警告應該會消失或改善。另外,Lighthouse 的 Largest Contentful Paint (LCP) 指標通常與首屏大圖有關,優化圖片後應能降低 LCP 時間。累積版面位移 (CLS) 也能因為我們加上了 width/height 屬性而獲得改善。
- 實際裝置測試:儘管模擬有一定參考價值,但仍應該在真實手機、平板等裝置上測試關鍵頁面。特別是測試在不同網速下頁面圖片的載入情形,確認圖片清晰度與載入時間都達到預期。使用瀏覽器提供的效能分析或網路釋出工具,可以更精細地比較優化前後的載入耗時與流量差異。
兼容性與後備
根據目前的數據,<picture> 元素和 srcset 屬性在全球約96%的用戶端瀏覽器上都被完整支援。除了已經淘汰的 IE 瀏覽器系列(IE11 及更舊版本並不支援這些特性)以及極少數舊版或特殊瀏覽器,大多數情況下不需要額外的 polyfill 就能直接使用。如果你的專案仍需要照顧不支援的瀏覽器,有幾種策略可以考慮:
- 引用響應式圖片 polyfill(如 Picturefill),讓老舊瀏覽器透過JS獲取<picture>定義的資源。但需權衡引入外部腳本的成本和對老舊瀏覽器用戶比例的影響。
- 退而求其次,為 IE11 等提供一組獨立邏輯(例如使用 <script> 偵測並替換 <img src>)。這做法較繁瑣且易與未來維護脫節,不推薦除非必要。
- 最重要的是,合理運用 <picture> 結構內的 <img> 後備機制。例如我們在範例中都確保 <img> 本身指向了最小或最通用的圖檔。這可確保在不支援 srcset/<picture> 的環境下至少有內容顯示,而不至於整張圖片缺失。
總之,在現代的開發環境裡,我們可以大膽地使用 <picture> 與 srcset 來優化圖片。妥善的實作不僅能提升用戶體驗,還對網站SEO與流量成本有正面幫助。建議將響應式圖片納入開發流程的標準考量,並持續關注新格式與瀏覽器支援動態,保持最佳的圖片效能表現。
常見問題 Q&A
問:是否所有圖片都應該使用 <picture> 或 srcset?
答:不見得,需要視情境而定。如果一張圖片在不同裝置上顯示尺寸相差無幾,而且對清晰度要求不高,使用單一圖檔即可,無需額外的響應式處理。相反地,如果圖片對效能影響大(例如橫幅、大圖)或在Retina螢幕上模糊明顯,則非常建議使用 srcset 或 <picture> 來優化。一般而言,英雄圖、橫幅圖、產品照片等關鍵圖片最值得響應式處理;而一些小icon、小圖如果已經很小,透過CSS縮放即可,也可不必多此一舉產生多種版本。
問:srcset 裡的 x 和 w 描述值可以混用嗎?
答:不能。在同一個 srcset 屬性中,同時出現像素密度描述(例如 2x)和寬度描述(例如 800w)會讓瀏覽器無法解析正確意圖。正確的做法是針對同一組圖片選擇一種描述方式:如果你的各版本圖片在畫面內容相同但解析度不同,使用 x 描述詞;如果是尺寸不同(為配合版面大小),使用 w 描述詞並搭配 sizes。若兩種情況都需要(例如既要考慮Retina又要考慮不同裝置寬度),可以將兩者結合在 <picture> 的不同 <source> 中分別處理。
問:如果瀏覽器不支援我提供的某種圖片格式會怎樣?
答:這正是 <picture>+<source> 組合大顯身手之處。我們可以在 <source> 標示每個圖片來源的格式 (type)。瀏覽器在解析時會跳過不支援格式的來源,選擇下一個符合的。最終 <img> 的 src 會做為後備。例如你提供 AVIF 和 WebP,若使用者瀏覽器僅支援WebP則自動挑WebP,不支援兩者則用回JPEG。因此不需要額外的程式判斷。開發者所要做的就是確保按照新格式→舊格式的順序列出 <source>,並在 <img> 提供通用格式。特別注意的是,有些舊瀏覽器(如IE)壓根不認得 <picture> 元素,所幸它們仍會直接處理 <img>,因此只要你的 <img> 指向能用的圖檔,至少不會空白。
問:使用 <picture>/srcset 會不會讓瀏覽器下載很多不必要的圖片?
答:正常情況下不會。瀏覽器根據條件只會下載它選定要顯示的那一個圖檔,而不會同時把所有備選圖片都抓下來。例如符合480px條件時就只拿對應檔,800px和1200px的圖都不會請求。除非你的程式碼寫錯(例如沒有 media 條件導致多個 <source> 都符合,或者某些怪異的情況),一般不必擔心多載流量。相反地,它能有效避免以往那種先載入小圖再載入大圖的冗餘。當然,在網路不佳或某些極端狀況下,瀏覽器可能先載小圖預覽再換大圖(例如CSS background的 image-set 行為),但對於 <img>/<picture> 這套機制是一次選定一張的。
問:sizes 屬性為什麼需要手動寫?不能直接用CSS的寬度嗎?
答:這是很多開發者初學響應式圖片時的疑惑。簡單說,由於瀏覽器在決定下載哪張 srcset 圖片時,HTML和CSS的解析時序不同,它無法確定圖片元素最終在畫面上的大小(來自CSS)。sizes 提供了一種讓我們預先以HTML屬性告訴瀏覽器「這張圖在不同情況下大概會多寬」的方法,使瀏覽器不用等整個CSS計算完成就能做出下載決策。因此儘管這造成一些重複(我們的CSS佈局已經定義了圖片大小,還要再寫一次 sizes),但目前是讓瀏覽器提前選圖的必要手段。你可以把 sizes 想成是對瀏覽器的承諾:「放心去挑圖吧,這張圖片在 X 條件下大約就是 Y 寬。」 瀏覽器據此挑選最佳資源,等實際CSS應用後一般都能吻合。如果布局真的比較複雜難以預測,可以退而求其次給個保守值或乾脆讓它100vw滿版,但理想情況是精確提供預估值,才能發揮 srcset 的最大效益。
問:還需要為 IE11 等老瀏覽器做特殊處理嗎?
答:依照現今趨勢,大部分網站已經不再支援 IE11。如果你的用戶群中極少人使用不支援 <picture>/srcset 的瀏覽器,那麼可以不額外處理,讓他們退化到加載 <img> 的單一圖即可(可能是手機版的圖)。若你真的需要支援 IE,可以考慮引入開源的 Picturefill 腳本,它能模擬 srcset 與 <picture> 的行為。在極端情況下,也可以在後端偵測User-Agent動態輸出不同的 <img>,但這通常不值得。總之,對於現代Web開發,我們傾向於向前看——利用好新的特性提高大多數用戶的體驗,同時提供合理的後備,不讓極少數老舊客戶端完全破版。畢竟連微軟官方都已在 2022 年正式終止IE瀏覽器的支援了。
以上Q&A希望解答了一些在實作響應式圖片過程中的典型問題。如果還有其他疑慮,建議參考MDN等文件以獲取更詳細的說明,以及持續關注瀏覽器的新功能(例如未來可能會有更簡化的語法或更強大的圖片處理特性)。祝各位在專案中順利打造出高效又靈活的RWD圖片方案!
總結
透過本文的介紹,我們深入探討了如何使用 <picture> 元素與 srcset/sizes 屬性來打造高效的響應式圖片。從基礎的像素密度切換,到複雜的藝術指引與多格式支援,這些現代HTML技術讓我們能夠為不同裝置提供最佳化的圖片體驗。
記住關鍵要點:善用 srcset 的 x 描述詞處理高DPI螢幕,使用 w 描述詞配合 sizes 優化不同螢幕尺寸,並透過 <picture> 元素實現藝術指引與格式後備。搭配適當的測試與優化策略,你的網站將能在效能、頻寬使用和視覺品質之間取得完美平衡。
響應式圖片不僅能提升用戶體驗,還能顯著改善網站的效能指標和SEO表現。現在就開始將這些技術應用到你的專案中,為用戶打造更快速、更清晰的網頁體驗吧!