超文本標記語言(HTML, HyperText Markup Language)是典型的「入門容易、精通困難」技術。深刻理解 HTML 語義,是成為優秀前端工程師的重要一步。
為什麼需要語義化?#
語義化的核心價值
- 對開發者友善:增強程式碼可讀性,便於團隊維護
- 對機器友善:有利於 SEO、螢幕報讀軟體、自動產生目錄
在現代網路產品中,HTML 用於描述「軟體介面」多過「富文本」。
軟體介面情境下,直接使用 div 和 span 是合理的選擇;但在文件類情境,語義化標籤則具有無可取代的優勢。
使用原則#
「用對」比「不用」好,「不用」比「用錯」好
錯誤使用語義標籤會給機器閱讀造成混淆、增加巢狀層級、給 CSS 撰寫加重負擔。
語義化的三大場景#
1. 自然語言延伸#
語義標籤作為純文字的補充,表達文字無法呈現的結構或消除歧義。
em 標籤消除歧義#
<!-- 強調「吃的是蘋果」 -->
今天我吃了一個<em>蘋果</em>。
<!-- 強調「只吃了一個」 -->
今天我吃了<em>一個</em>蘋果。em 表示重音強調,與 strong(重要性強調)完全不同。
ruby 標籤注音#
<ruby> 空間移動<rp>(</rp><rt>Teleport</rt><rp>)</rp> </ruby>2. 標題與文件結構#
HTML 支援自動產生目錄結構的演算法。
標題層級 h1-h6#
<h1>HTML 語義</h1>
<p>內容...</p>
<h2>弱語義</h2>
<p>內容...</p>
<h2>結構性元素</h2>
<p>內容...</p>hgroup 副標題#
<hgroup>
<h1>JavaScript 物件</h1>
<h2>我們需要模擬類嗎?</h2>
</hgroup>使用 hgroup 後,h1 和 h2 被視為同一標題的不同組成部分,不會產生額外層級。
section 巢狀結構#
<section>
<h1>HTML 語義</h1>
<section>
<h1>弱語義</h1>
</section>
<section>
<h1>結構性元素</h1>
</section>
</section>
section會改變 h1-h6 的語義層級,巢狀的 section 會使其中的標題自動下降一級。
3. 整體結構標籤#
採用語義化結構的頁面,能夠明確提示資訊的主次關係,也是瀏覽器「閱讀模式」功能得以運作的基礎。
典型頁面結構#
<body>
<header>
<nav><!-- 主導航 --></nav>
</header>
<aside>
<nav><!-- 側邊導航 --></nav>
</aside>
<section><!-- 主要內容 --></section>
<footer>
<address><!-- 聯繫資訊 --></address>
</footer>
</body>多文章結構#
<body>
<header>...</header>
<article>
<header>...</header>
<section>...</section>
<footer>...</footer>
</article>
<article>...</article>
<footer>
<address>...</address>
</footer>
</body>常用語義標籤速查#
結構標籤#
| 標籤 | 用途 |
|---|---|
header | 導覽或介紹性內容,通常在前部 |
footer | 作者資訊、相關連結、版權資訊 |
aside | 與主體不相關的部分(側邊導覽、廣告等) |
nav | 導覽連結區域 |
article | 具有獨立性的文章 |
section | 文件章節 |
address | 文章作者的聯絡方式(僅關聯 article 和 body) |
文字標籤#
| 標籤 | 用途 |
|---|---|
strong | 重要性強調 |
em | 重音強調 |
abbr | 縮寫,title 屬性說明全稱 |
dfn | 定義術語 |
cite | 引用的作品名稱 |
blockquote | 段落級引用 |
q | 行內引用 |
time | 日期時間,datetime 屬性供機器讀取 |
code | 程式碼 |
pre | 預格式化文字 |
samp | 程式輸出範例 |
圖文標籤#
<figure>
<img src="photo.jpg" alt="描述" />
<figcaption>圖片說明文字</figcaption>
</figure>figure 用於與主文章相關的圖像、程式碼、表格等獨立內容。
元資訊標籤#
元資訊標籤位於 <head> 中,用於描述文件本身,而不是內容本體。
必要標籤#
<head>
<meta charset="UTF-8" />
<title>頁面標題</title>
</head>
charsetmeta 應放在 head 的第一個位置,確保瀏覽器正確解析後續內容。
viewport 設定#
<meta
name="viewport"
content="width=device-width,initial-scale=1,
minimum-scale=1,maximum-scale=1,
user-scalable=no"
/>常用 meta 標籤#
<!-- SEO 相關 -->
<meta name="description" content="頁面描述" />
<meta name="keywords" content="關鍵字1,關鍵字2" />
<!-- 作者資訊 -->
<meta name="author" content="作者名" />
<!-- HTTP 等效 -->
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />ARIA 無障礙#
無障礙不只服務視障使用者,還涵蓋各種裝置、環境與族群的存取友善程度。
無障礙的富網際網路應用程式(ARIA, Accessible Rich Internet Applications)是一組用於無障礙的屬性標準。
基本用法#
<span
role="checkbox"
aria-checked="false"
tabindex="0"
aria-labelledby="chk1-label"
>
</span>
<label id="chk1-label">記住我的偏好</label>常用 ARIA 角色#
| 類別 | 角色 | 說明 |
|---|---|---|
| Widget | button, checkbox, radio, textbox | 可互動元件 |
| 複合元件 | combobox, grid, listbox, menu, tablist | 複合互動元件 |
| Structure | article, banner, navigation, main | 文件結構 |
| Window | dialog, alertdialog | 彈出視窗 |
ARIA 屬性範例
<!-- Checkbox -->
<div role="checkbox" aria-checked="false">選項</div>
<!-- Button -->
<div role="button" aria-pressed="false" aria-expanded="false">展開選單</div>
<!-- Tab 組件 -->
<div role="tablist">
<button role="tab" aria-selected="true">Tab 1</button>
<button role="tab" aria-selected="false">Tab 2</button>
</div>
<div role="tabpanel">Tab 1 內容</div>總結#
語義化 HTML 的三個核心場景:
- 自然語言延伸:用標籤表達純文字無法呈現的語義
- 標題與文件結構:建立清晰的文件層級
- 整體結構標籤:明確頁面資訊的主次關係
請記住核心原則:在合適的場景使用合適的標籤,而不是為了語義化而語義化。