Learning Objectives
- 用 img 放圖片,依圖片的作用寫出替代文字,並判斷什麼時候 alt 要寫成空字串
- 用 width、height 讓瀏覽器預留圖片的空間,並知道 loading="lazy" 適合放在哪些圖片
- 依內容選擇 JPEG、PNG、SVG、WebP 等圖片格式
- 用 srcset、sizes 提供不同大小的圖,用 picture 在不同螢幕換不同裁切,用 figure 與 figcaption 加圖說
- 用 audio、video 放影音並提供播放控制與字幕,用 iframe 嵌入其他頁面並加上 title
圖片不只是給眼睛看的
網頁上的圖片有很多種角色:社團海報傳達活動資訊、長條圖呈現數字、波浪線只是裝飾。 看得到畫面的人一眼就能分辨,但下面這些「讀者」看不到圖片:
| 讀者 | 它拿到什麼 |
|---|---|
| 螢幕閱讀器的使用者 | 只聽得到你寫的替代文字(alt) |
| 網路很慢、圖片載入失敗的人 | 圖片的位置只剩替代文字 |
| 搜尋引擎 | 從替代文字與圖說判斷圖片的內容 |
這一課學三件事:
- 寫好替代文字,讓沒看到圖的人也拿到同樣的資訊。
- 讓圖片載入得又快又穩:預留空間、晚點再載入、依螢幕大小給適合的檔案。
- 放影音與嵌入內容:音訊、影片、字幕,以及 iframe。
img 與替代文字 alt
圖片用 <img>,它和第 3 課的 <br> 一樣是空元素,沒有結束標籤:
<img src="/images/poster.svg" alt="吉他社期初招生海報:9 月 20 日社團博覽會,B 區 12 號攤位">
src(source):圖片檔的網址,路徑的寫法和第 4 課的連結相同。alt(alternative text):圖片無法被看到時,用來代替圖片的文字。
alt 要寫什麼,取決於這張圖在頁面上做什麼用:
| 圖片的作用 | alt 怎麼寫 | 範例 |
|---|---|---|
| 傳達資訊(海報、照片) | 寫出圖要傳達的重點 | alt="吉他社期初招生海報:9 月 20 日社團博覽會" |
| 呈現資料(圖表) | 寫出數字的重點或趨勢,細節可以放在旁邊的文字或表格 | alt="每月參加社課人數:9 月 18 人,逐月增加到 12 月 30 人" |
| 當連結或按鈕(logo 連回首頁) | 寫出按了會去哪裡,不是描述圖的樣子 | alt="吉他社首頁" |
| 純裝飾(分隔線、背景花紋) | 空字串 alt="" |
alt="" |
alt="" 和完全不寫 alt 不一樣:
alt=""告訴螢幕閱讀器「這張圖是裝飾,跳過就好」。- 沒有 alt 時,有些螢幕閱讀器會改唸檔名,使用者會聽到「divider 點 svg」這種沒有意義的聲音。
所以每一張 img 都要有 alt,只是有些 alt 是空的。替代文字也不用寫「圖片」「照片」開頭,螢幕閱讀器本來就會說這是一張圖。
width、height 與 loading="lazy"
網頁的文字通常比圖片先下載完。如果瀏覽器不知道圖片多大,就會先把空間當成 0, 等圖片下載好再把下面的內容整個往下推,正在閱讀或準備點按的人就會被「跳」到別的位置(版面位移)。
在 img 上寫出圖片原本的寬與高,瀏覽器就能先算出長寬比、預留空間:
<img src="chart.svg" alt="…" width="600" height="360">
img { max-width: 100%; height: auto; } /* 窄螢幕時縮小,但維持 600:360 的比例 */
width、height 寫的是圖片的原始像素大小,數字不加 px。實際顯示多大交給 CSS(第 9 課起)。
頁面很長、圖片很多時,可以讓畫面外面的圖片晚一點再下載:
<img src="chart.svg" alt="…" width="600" height="360" loading="lazy">
loading="lazy"(延遲載入)讓瀏覽器等使用者捲動到附近才下載,目前主流瀏覽器都支援。
但一打開就看得到的圖(例如頁面最上面的主視覺)不要加,否則反而會晚一點才出現。
圖片格式怎麼選
| 格式 | 特性 | 適合 |
|---|---|---|
| JPEG(.jpg) | 有損壓縮,檔案小,不支援透明 | 照片、色彩漸層多的圖 |
| PNG(.png) | 無損壓縮,支援透明,照片會很大 | 螢幕截圖、需要透明背景、線條清楚的圖 |
| SVG(.svg) | 向量圖:用座標與形狀描述,放大不會糊,其實是一份文字檔 | logo、圖示、圖表、插畫 |
| WebP(.webp) | 同時支援有損、無損與透明,通常比 JPEG、PNG 小 | 照片與一般圖片,目前主流瀏覽器都支援 |
另外還有更新的 AVIF,壓縮率更好,但支援度還不如 WebP,使用時要準備備用格式(下一段的 picture 可以做到)。
判斷的順序可以是:能畫成向量就用 SVG;照片用 WebP 或 JPEG;需要透明又不能失真的截圖用 PNG。 這一課的海報、圖表與分隔線都是 SVG,「活動地點」的插畫是 WebP。
srcset、sizes、picture 與 figure
手機螢幕寬 360 像素,下載一張 2000 像素寬的圖很浪費流量。srcset 可以列出同一張圖的好幾種大小,讓瀏覽器挑:
<img src="campus-480.webp"
srcset="campus-480.webp 480w, campus-960.webp 960w"
sizes="100vw"
alt="學生活動中心外觀插畫">
480w、960w:每個檔案真正的寬度(w 是 width 的意思)。sizes:這張圖在畫面上會顯示多寬。100vw是整個視窗寬(vw 是 viewport width,第 9 課會再介紹);不寫時預設也是100vw。- 瀏覽器用「顯示寬度 × 螢幕的像素密度」算出需要多少像素,再挑一個夠用的檔案;
src留給不認得 srcset 的瀏覽器。
srcset 是同一張圖換大小。如果窄螢幕要換成不同裁切的圖(寬橫幅在手機上字太小,改用方形版),用 picture:
<picture>
<source media="(max-width: 600px)" srcset="banner-narrow.svg">
<img src="banner-wide.svg" alt="社團博覽會,9 月 20 日在學生活動中心廣場">
</picture>
瀏覽器從上到下看 source,第一個條件成立的就用它;都不成立就用最後的 img。
alt 寫在 img 上,picture 一定要包一個 img。source 也可以用 type="image/avif" 提供新格式,瀏覽器不支援時自動跳過。
圖片需要圖說時,用 figure 把圖與說明包成一組,說明放在 figcaption:
<figure>
<img src="campus-480.webp" alt="學生活動中心外觀插畫">
<figcaption>學生活動中心一樓廣場,從正門進來直走就到。</figcaption>
</figure>
figcaption 是看得到的說明,alt 是看不到圖時的替代,兩個不一樣,不要寫成一模一樣的句子。
小測驗:替代文字與圖片載入
頁首的社團 logo 是一個連回首頁的連結:<a href="/"><img src="logo.svg" alt="?"></a>。alt 最適合寫什麼?
頁面上一條純裝飾的波浪分隔線,img 應該怎麼寫?
在 img 寫上 width 與 height,主要的好處是?
下面哪一張圖不適合加 loading="lazy"?
音訊、影片、字幕與 iframe
<audio controls src="tuning-a440.wav"></audio>
<video controls width="320" height="180" poster="video-poster.svg">
<source src="strum.mp4" type="video/mp4">
<source src="strum.webm" type="video/webm">
<track kind="subtitles" src="strum.zh-Hant.vtt" srclang="zh-Hant" label="中文" default>
你的瀏覽器無法播放這段影片,<a href="strum.mp4">下載影片</a>。
</video>
| 屬性或元素 | 作用 |
|---|---|
controls |
顯示播放、暫停、音量等控制列。沒寫就看不到播放器,使用者也沒辦法暫停 |
poster |
影片開始播放前顯示的封面圖 |
source |
提供好幾種格式,瀏覽器用第一個能播的 |
track |
字幕檔(WebVTT 格式,副檔名 .vtt)。kind="subtitles" 是對白字幕;kind="captions" 除了對白還包含音效、音樂等聲音資訊,給聽不到聲音的人 |
srclang、label |
字幕的語言代碼與選單上顯示的名稱 |
| 元素裡的文字 | 瀏覽器完全不支援時才會顯示 |
WebVTT 字幕檔是純文字,每一段寫出開始與結束時間:
WEBVTT
00:00:00.000 --> 00:00:01.000
第 1 拍:往下刷
兩個提醒:
autoplay(自動播放):主流瀏覽器通常會擋下有聲音的自動播放,加上muted(靜音)才比較確定會自動播放;突然出聲的頁面很干擾人,盡量讓使用者自己按播放。- 有對白或重要聲音的影片要提供字幕;只有聲音的內容(例如 podcast)可以在旁邊附上逐字稿。
iframe:把別的頁面嵌進來
iframe(inline frame)在頁面裡開一個框,顯示另一個網頁,常見的是嵌入影片平台的播放器或地圖:
<iframe src="https://example.com/map" width="480" height="270"
title="社辦位置地圖" loading="lazy"></iframe>
title:說明框裡是什麼。螢幕閱讀器進入 iframe 時會唸出它,沒有 title 時使用者只知道「有一個框架」。loading="lazy":和圖片一樣,畫面外的 iframe 可以晚點載入。- 嵌入別人的網站等於在你的頁面執行對方的內容;只嵌入你信任的來源。很多網站也會拒絕被別人嵌入。
練習沙箱有兩個安全限制:載入不了另外的字幕檔,所以字幕只在上面的範例說明;也連不到外部網站,所以下面的 iframe 用
srcdoc屬性直接把一小段 HTML 寫在框裡,代替src的網址,title的寫法完全一樣。
小測驗:格式、響應式圖片與影音
社團的 logo 由幾個色塊和文字組成,要在名片大小到大型看板上都清楚。最適合的格式是?
<img srcset="a-480.webp 480w, a-960.webp 960w, a-1440.webp 1440w" sizes="100vw" …>,在寬 360 像素、像素密度 2 的手機上,瀏覽器通常會下載哪一張?
寬版橫幅在手機上字太小,想在窄螢幕換成另一張裁切成方形的圖,應該用?
影片要提供給聽不到聲音的觀眾,字幕除了對白還要標出掌聲、音樂等聲音資訊。track 的 kind 應該寫?
重點整理
- 每張
img都要有alt:寫出圖要傳達的資訊;當連結時寫目的地;純裝飾寫alt=""。 - 寫上
width、height讓瀏覽器預留空間;畫面外的圖加loading="lazy",一打開就看得到的圖不要加。 - 向量圖用 SVG,照片用 WebP 或 JPEG,透明又不能失真的截圖用 PNG。
srcset+sizes給同一張圖的不同大小;picture+source media在不同螢幕換不同的圖;figure+figcaption加圖說。audio、video記得加controls;影片用poster設定封面,用track提供字幕;iframe要有title。
下一課講表格:怎麼標出欄與列的標題、合併儲存格,以及什麼內容不該用表格。