超文本標記語言(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>

charset meta 應放在 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 角色#

類別角色說明
Widgetbutton, checkbox, radio, textbox可互動元件
複合元件combobox, grid, listbox, menu, tablist複合互動元件
Structurearticle, banner, navigation, main文件結構
Windowdialog, 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 的三個核心場景:

  1. 自然語言延伸:用標籤表達純文字無法呈現的語義
  2. 標題與文件結構:建立清晰的文件層級
  3. 整體結構標籤:明確頁面資訊的主次關係

請記住核心原則:在合適的場景使用合適的標籤,而不是為了語義化而語義化。