Skip to content

HTML 表格 table:結構、合併儲存格與無障礙寫法

HTML 表格元素 table:列、欄與表頭的結構

以二維資料表來呈現資訊,適合數據類的網站使用。它由 <table><tr><th><td> 四個標籤組成,可再用 <caption><thead><tbody> 補強結構;它是拿來放資料的,不是拿來排版的。

表格標籤的功能

<table><tr><th><td> 為表格中常見到的四個標籤。

  • <table>: 包覆表格內容。
  • <tr>: 表格的列數。
  • <th>: 表格的欄位、欄位標題。(預設:粗體字、文字置中)
  • <td>: 表格的欄位。

非必要使用

<caption><thead><tbody><tfoot>

  • <caption>: 表格的標題。
  • <thead>: 表格的首列。
  • <tbody>: 表格的內容。
  • <tfoot>: 表格的尾列。
html
<table>
  <caption>購物清單</caption>
  <thead>
    <tr>
      <th>商品名稱</th>
      <th>數量</th>
      <th>價格</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>iPhone 20 Pro Max</td>
      <td>1</td>
      <td>43,000</td>
    </tr>
    <tr>
      <td>iPad mini</td>
      <td>1</td>
      <td>16,900</td>
    </tr>
    <tr>
      <td>Mac mini M20 Pro</td>
      <td>1</td>
      <td>46,900</td>
    </tr>
  </tbody>
  <tfoot>
    <tr>
      <th colspan="2">合計</th>
      <td>106,800</td>
    </tr>
  </tfoot>
</table>
購物清單
商品名稱數量價格
iPhone 20 Pro Max143,000
iPad mini116,900
Mac mini M20 Pro146,900
合計106,800

colspan

在該列中,設定合併欄位數量。

html
<tr>
  <th colspan="2">合計</th>
  <td>106,800</td>
</tr>

rowspan

在該欄中,設定合併列位數量。

html
<tr>
  <th rowspan="2">水果</th>
  <td>蘋果</td>
</tr>
<tr>
  <td>葡萄</td>
</tr>

小提醒

合併之後,被覆蓋掉的那幾個 <td> 要記得刪除。多留了格子,整個表格就會跑版。

讓表格能被讀懂

表格的每一格對螢幕閱讀器來說都只是一個值,靠 <th> 才能知道它屬於哪一欄。欄與列都有表頭時,可以用 scope 標明方向:

html
<tr>
  <th scope="col">商品名稱</th>
  <th scope="col">價格</th>
</tr>
<tr>
  <th scope="row">iPad mini</th>
  <td>16,900</td>
</tr>

<caption> 則是整個表格的標題,寫在 <table> 的第一行,能讓使用者在進入表格前就知道這份資料在講什麼。

表格不是排版工具

早期沒有 CSS 的排版能力時,網頁常用表格切版。現在請把版面交給 CSS 的 flex 或 grid,<table> 只留給真正的二維資料。用表格排版會讓輔助工具把版面結構誤讀成資料,在手機上也很難調整。

小提醒

表格在窄螢幕上容易撐破版面,可以在外層包一個容器並加上 overflow-x: auto,讓表格自己橫向捲動。

常見問題

th 和 td 有什麼不同?

<th> 是表頭儲存格,用來標示這一欄或這一列代表什麼;<td> 是一般的資料儲存格。除了預設樣式不同,螢幕閱讀器也會依 <th> 把資料念成 某欄位是某值,這是表格能被讀懂的關鍵。

可以用表格來排版嗎?

不要。表格的語意是二維資料,拿來排版會讓輔助工具把版面結構誤讀成資料,在手機上也難以調整。版面請交給 CSS 的 flex 或 grid。

thead、tbody、tfoot 一定要寫嗎?

不是必要,但建議寫。它們讓表格的頭、身、尾層次分明,長表格捲動時瀏覽器也能讓表頭固定顯示,對閱讀與維護都有幫助。

colspan 與 rowspan 怎麼分?

colspan 是橫向合併,往右吃掉幾格;rowspan 是縱向合併,往下吃掉幾列。合併之後被覆蓋的那幾格要記得刪掉,否則整個表格會跑版。

延伸閱讀