為什麼一張圖片不夠
一張 2000px 寬的圖片下載到 375px 寬的手機上,多載了超過 95% 的像素——白白消耗頻寬、拖慢頁面。HTML 的媒體標籤解的就是這個問題:讓瀏覽器根據裝置和條件選最合適的資源。
<img> 的現代屬性
srcset + sizes:響應式圖片
<img
src="hero-800.jpg"
srcset="
hero-400.jpg 400w,
hero-800.jpg 800w,
hero-1200.jpg 1200w,
hero-1600.jpg 1600w
"
sizes="
(max-width: 480px) 100vw,
(max-width: 1024px) 80vw,
1200px
"
alt="首頁主視覺"
width="1200"
height="600"
>srcset:列出所有可用的圖片版本和它們的實際寬度(w單位)sizes:告訴瀏覽器圖片在不同視窗寬度下顯示多大(CSS 寬度)- 瀏覽器根據這兩個資訊 + 螢幕 DPR 自己選哪張
src 是必要的 fallback,瀏覽器不支援 srcset 時用它。
loading:延遲載入
<!-- 預設:立刻載入(above the fold 的圖片) -->
<img src="hero.jpg" loading="eager" alt="...">
<!-- 延遲:滾到視窗附近才載入(below the fold 的圖片) -->
<img src="thumbnail.jpg" loading="lazy" alt="...">loading="lazy" 是最簡單的效能優化,一行屬性。不要對 hero 圖片用 lazy——使用者進來就要看到的圖片如果 lazy,LCP 分數會很差。
fetchpriority:提示瀏覽器優先序
<!-- LCP 圖片:提高優先序,讓瀏覽器早點下載 -->
<img src="hero.jpg" fetchpriority="high" alt="...">
<!-- 裝飾圖片 / 輪播後幾張:降低優先序 -->
<img src="carousel-3.jpg" fetchpriority="low" loading="lazy" alt="...">fetchpriority="high" 配合 <link rel="preload"> 是優化 LCP 的標準組合。
width + height:防止 CLS
<!-- 一定要標 width / height,讓瀏覽器預留空間 -->
<img src="photo.jpg" width="800" height="450" alt="...">沒有 width / height,圖片載入前高度是 0,載入後頁面跳動——這就是 CLS(Cumulative Layout Shift)。不需要精確到 1px,正確的比例就夠了。
<picture>:格式切換與 art direction
現代格式優先,舊瀏覽器 fallback
<picture>
<!-- 支援 AVIF 的瀏覽器用 AVIF(最小) -->
<source srcset="hero.avif" type="image/avif">
<!-- 支援 WebP 的瀏覽器用 WebP -->
<source srcset="hero.webp" type="image/webp">
<!-- fallback:所有瀏覽器都支援的 JPEG -->
<img src="hero.jpg" alt="首頁主視覺" width="1200" height="600">
</picture>瀏覽器從上到下找第一個支援的 <source>,都不支援才用 <img>。
Art Direction:不同螢幕裁切不同構圖
<picture>
<!-- 手機:直式裁切,主體置中 -->
<source
media="(max-width: 480px)"
srcset="hero-portrait.jpg"
>
<!-- 平板以上:橫式全景 -->
<img src="hero-landscape.jpg" alt="..." width="1200" height="500">
</picture>srcset + sizes 是「同一張圖的不同解析度」;<picture> 的 art direction 是「完全不同構圖的圖片」。
<video> 基本屬性
<video
src="demo.mp4"
width="800"
height="450"
controls
muted
playsinline
preload="metadata"
poster="thumbnail.jpg"
>
<!-- 字幕 -->
<track kind="subtitles" src="subs-zh.vtt" srclang="zh" label="繁體中文">
<!-- 不支援 video 的 fallback -->
<p>您的瀏覽器不支援影片播放。<a href="demo.mp4">點此下載</a></p>
</video>幾個重要屬性:
muted:靜音,自動播放必要條件(瀏覽器阻擋有聲音的自動播放)playsinline:iOS Safari 行內播放,不強制全螢幕preload="metadata":只預載元資料(時長、尺寸),不預載影片內容poster:影片未播放時顯示的封面圖
多格式 fallback
<video controls>
<source src="demo.webm" type="video/webm">
<source src="demo.mp4" type="video/mp4">
</video>相關文章
- Audio 進階 — Media Session API、MSE 串流、字幕 WebVTT
- Core Web Vitals — LCP / CLS 跟圖片載入的關係