網站效能的重要提示

使用 srcset 自動選擇正確的圖片大小。

HTTP 封存的研究指出,一般行動版網頁大小超過 2.6 MB,且大小的三分之二以上是圖片。這正是最佳化商機!

行動版網頁的平均位元組數 (依內容類型而定)

摘要

  • 請勿儲存大於顯示大小的圖片。
  • 為每張圖片儲存多種大小,並使用 srcset 屬性,讓瀏覽器選擇最小的圖片。w 值會告知瀏覽器每個版本的寬度:
<img src="small.jpg"
     srcset="small.jpg 500w,
             medium.jpg 1000w,
             large.jpg 1500w"
     alt="…">

以正確大小儲存圖片

使用尺寸與顯示大小相符的圖片,可加快網站速度並減少資料用量。也就是儲存圖片時,提供適當的寬度和高度。

請參考下方圖片。

兩者看起來幾乎相同,但其中一個檔案的大小是另一個的 10 倍以上。

Little Puss 和 Lias:兩隻十週大的虎斑小貓。
已儲存的寬度 1000 像素,檔案大小 184 KB
Little Puss 和 Lias:兩隻十週大的虎斑小貓。
已儲存的寬度 300 像素,檔案大小 16 KB

第一張圖片的檔案大小較大,因為儲存時的尺寸遠大於顯示大小。兩張圖片的固定寬度皆為 300 像素,因此建議使用以相同大小儲存的圖片。

如果是固定寬度,請使用與螢幕大小相同的圖片儲存方式。

但是...如果顯示大小不同,該怎麼辦?

在多裝置環境中,圖片不一定會以單一固定尺寸顯示。

圖片元素可能有百分比寬度,或是屬於回應式版面配置,其中圖片顯示的大小會配合螢幕大小變動。

那麼,如果是像 Retina 螢幕這類需要大量像素的裝置呢?

協助瀏覽器選擇正確的圖片大小

如果您可以讓每張圖片不同大小,然後讓瀏覽器針對裝置和顯示大小選擇最適合的尺寸,這不是很棒嗎?不幸的是,在找出最合適圖片時,會遇到「雙重困境」。瀏覽器應使用最小的圖片,但如果未下載圖片進行檢查,則無法得知圖片的寬度。

這時 srcset 就能派上用場。您可以儲存不同大小的圖片,然後告知瀏覽器每個版本的寬度:

<img src="small.jpg"
     srcset="small.jpg 500w, medium.jpg 1000w, large.jpg 1500w"
     alt="…">

w 值會以像素為單位顯示每張圖片的寬度。舉例來說,small.jpg 500w 會告知瀏覽器 small.jpg 寬度為 500 像素。這樣一來,瀏覽器就能根據螢幕類型和可視區域大小,選擇最小的圖片,而不需要下載圖片來檢查其大小。

您可以從下方圖片查看「srcset」的實際運作情形。如果使用筆電或電腦,請變更瀏覽器視窗大小,然後重新開啟這個頁面。接著,使用瀏覽器工具的「Network」面板,查看系統使用了哪些圖片。(您必須在無痕式視窗或私人視窗中執行這項操作,否則原始圖片檔案會被快取)。

獅子與小鸚鵡:為期 20 週的灰色小袋鼠

如何建立多種圖片大小?

您必須為每張要與 srcset 搭配使用的圖片提供多種尺寸。

針對一次性圖片 (例如主頁橫幅),您可以手動儲存不同大小。如果您有大量圖片 (例如產品相片),就必須自動處理。這有兩種方法。

在建構程序中納入圖片處理作業

您可以在建構程序中新增步驟,建立不同大小的圖片版本。詳情請參閱「使用 Imagemin 壓縮圖片」。

使用圖片服務

您可以使用 Cloudinary 等商業服務,或自行安裝及執行的 Thumbor 等同等開放原始碼服務,自動建立及提交圖片。

上傳高解析度圖片後,圖片服務會根據網址參數自動建立並提供不同的圖片格式和大小。舉例來說,請開啟這張 Cloudinary 上的範例圖片,然後嘗試變更網址列中的 w 值或檔案副檔名。

圖片服務還提供更進階的功能,例如可自動為不同圖片大小執行「智慧裁剪」功能,並自動將 WebP 圖片傳送至支援該格式的瀏覽器,而非 JPEG 圖片,且無須變更檔案副檔名。

Chrome 開發人員工具顯示 Cloudinary 所提供檔案的 WebP 內容類型標頭

如果圖片在不同大小的情況下無法呈現最佳效果,該怎麼辦?

在這種情況下,您需要使用 <picture> 元素來設定「藝術方向」:提供不同大小的圖片或裁剪圖片。如需瞭解詳情,請參閱「"藝術指導"」程式碼研究室。

那麼像素密度呢?

高階裝置的實體像素較小 (密度較高)。舉例來說,高階手機每列像素的像素數量,可能比便宜裝置多出兩到三倍。

這可能會影響圖片的儲存大小。我們不會在此深入探討細節,但您可以參閱「使用密度描述項」程式碼研究室,進一步瞭解相關資訊。

圖片的顯示大小怎麼辦?

您可以使用 sizessrcset 的運作更加順暢。

如未指定寬度,瀏覽器會在從 srcset 中選擇圖片時,使用可視區域的完整寬度。sizes 屬性會告知瀏覽器圖片元素的顯示寬度,讓瀏覽器在進行任何版面配置計算前,選擇最小的圖片檔案。

在以下範例中,sizes="50vw" 會告知瀏覽器這張圖片會在可視區域寬度的 50% 上顯示。

<img src="small.jpg"
     srcset="small.jpg 500w, medium.jpg 1000w, large.jpg 1500w"
     sizes="50vw"
     alt="…">

如需實際操作,請前往 simpl.info/sizes 和「指定多個版面配置寬度」程式碼研究室。

瀏覽器支援情況如何?

全球超過 90% 的瀏覽器支援 srcsetsizes

如果瀏覽器不支援 srcsetsizes,則會改用 src 屬性。

這會讓 srcsetsizes 成為優秀的漸進式強化功能!

瞭解詳情

請參閱 web.dev 的「Optimize your images」一節,進一步瞭解圖片最佳化。如需更詳細的操作說明,不妨試試 Udacity 提供的免費「回應式圖片」課程。