National Central University
Uedu Main Site
Explore Uedu
Student Console
Register as Member/Login
Research Informed Consent Center
Survey Center
Educational Big Data Challenge
Claim or create a course
Try an AI Scenario Task
Support & Messages
Uptime Data

UeduGPTs

--

Jupyters

3

Local AI

--

Uedu Code

--

中央大學 AQI 80 24°C PM2.5 21
AI Reply Desktop Notifications

Show a desktop notification when the AI TA finishes replying

Chat Message Notifications

Notify me when classmates post messages in the forum

Sound notification

Play an alert sound whenever there is a new notification

Unit 06

表格

表格的結構、合併儲存格、標題,以及什麼時候不該用表格
Interaction 25 minute(s)

Learning Objectives

  • 用 table、tr、th、td 寫出表格,並用 caption 說明表格的主題
  • 用 thead、tbody、tfoot 分出表頭、內容與表尾,用 scope 標出 th 是哪一欄或哪一列的標題
  • 用 rowspan、colspan 合併儲存格,並知道被合併佔住的儲存格不能再寫
  • 判斷什麼內容適合用表格,說明為什麼不該用表格排版

表格是有兩個方向的資料

課表、成績單、價目表有一個共同點:每一格的意思要同時看它在哪一列、哪一欄才知道。 「80%」單獨看沒有意義,要知道它在「第 1 組」那一列、「完成度」那一欄,才讀得懂。

看得到畫面的人用眼睛對齊行列就好;螢幕閱讀器的使用者一次只聽到一格, 所以表格的 HTML 要把「這一格屬於哪個標題」寫清楚,螢幕閱讀器才能在唸到「80%」時一併唸出「第 1 組、完成度」。

這一課學:

  1. 表格的基本結構與標題儲存格
  2. 表頭、內容、表尾與表格標題
  3. 合併儲存格
  4. 什麼時候不該用表格

table、tr、th、td

<table>
  <caption>期中專題進度</caption>        <!-- 表格的標題,放在 table 的第一個 -->
  <tr>                                   <!-- table row:一列 -->
    <th scope="col">組別</th>            <!-- table header:標題儲存格 -->
    <th scope="col">完成度</th>
  </tr>
  <tr>
    <th scope="row">第 1 組</th>
    <td>80%</td>                         <!-- table data:資料儲存格 -->
  </tr>
</table>
元素 意思
<table> 整張表格
<caption> 表格的標題,螢幕閱讀器進入表格時會先唸它;要放在 table 裡的第一個
<tr> 一列(row)。HTML 是一列一列寫的,沒有「一欄」的元素
<th> 標題儲存格,預設粗體、置中
<td> 資料儲存格

th 的 scope 屬性說明它是誰的標題:

  • scope="col":這一欄的標題(通常是第一列的 th)
  • scope="row":這一列的標題(通常是每列第一格的 th)

簡單的表格瀏覽器通常猜得出來,但有些輔助科技會猜錯,寫清楚比較保險。

thead、tbody、tfoot

列可以再分成三組:

<table>
  <caption>期中專題進度</caption>
  <thead>  <tr>…標題列…</tr>  </thead>
  <tbody>  <tr>…資料…</tr>  <tr>…資料…</tr>  </tbody>
  <tfoot>  <tr>…平均、合計…</tr>  </tfoot>
</table>
  • thead:表頭,放欄標題。表格很長、列印成好幾頁時,瀏覽器可以在每一頁重複表頭。
  • tbody:表格的內容。
  • tfoot:表尾,放合計、平均這類整理過的列。

就算你沒寫 tbody,瀏覽器解析時也會自動補上一個,把 tr 放進去。 下面的練習一開始沒有寫 tbody,你可以在右邊的 DOM 樹看到它已經出現了。

互動練習:幫表格加上標題與分組

這張專題進度表每一格都是 td,看起來都一樣,螢幕閱讀器也不知道哪一格是標題。依任務修改 HTML,按「執行」。

合併儲存格:rowspan 與 colspan

一格要跨好幾列或好幾欄時:

  • rowspan="2":往下佔 2 列
  • colspan="3":往右佔 3 欄

合併最容易出錯的地方是:被合併佔住的位置不能再寫儲存格。

<tr>
  <th scope="row">18:00</th>
  <td rowspan="2">新手班</td>     <!-- 佔住 18:00 與 19:00 兩列 -->
  <td>進階班</td>
</tr>
<tr>
  <th scope="row">19:00</th>
                                  <!-- 這一列的「週二」已經被上面佔住,不能再寫 -->
  <td>進階班</td>
</tr>

如果 19:00 那一列還寫了三格,第三格會被擠到第四欄,表格右邊凸出一塊。 colspan 也一樣:一格 colspan="2",同一列就要少寫一格。

下面的工具可以點選範圍合併,左邊是瀏覽器真的排出來的表格,右邊同步寫出 HTML,並標出每一列被佔住了幾格。

互動工具:合併儲存格

這是一張還沒整理的社課表,重複的課程各佔一格。點一格當起點、再點另一格選出範圍,按「合併選取範圍」。完成全部任務,並對照右邊的 HTML:每合併一次,有幾格從 HTML 消失。

互動練習:修好合併出錯的表格

這張表的 18:00「新手班」已經用 rowspan 合併,但 19:00 那一列忘了少寫一格,表格右邊凸出來了。自己改 HTML 修好它,再完成另外兩個合併。

小測驗:表格的結構

1.

<th scope="row">第 1 組</th> 的 scope="row" 是什麼意思?

2.

表格的標題「期中專題進度」應該寫在哪裡?

3.

原始碼裡沒有寫 <tbody>,把 <tr> 直接放在 <table> 裡。瀏覽器解析後的 DOM 樹會是?

4.

一張 3 欄的表格,第 2 列有一格 <td rowspan="2">。第 3 列(下一列)應該寫幾個儲存格?

第 1 次作答

表格只放表格資料

早期的網頁沒有好用的排版工具,常把整頁放進一張大表格,用儲存格切出左側選單與右邊內文。現在不要這樣做:

  • 螢幕閱讀器會把它當成資料表格,唸出「表格,2 欄 1 列」,再一格一格唸,使用者以為裡面是資料。
  • 表格的版面固定,手機上沒辦法把左右兩欄改成上下排列。
  • 原始碼多了一堆 tr、td,難讀也難改。

判斷方法:把內容拿掉格線,它還是不是一張「行與列都有意義」的資料? 是的話用表格,例如課表、成績、比較表; 只是想把東西排成兩欄、三欄的話,交給 CSS 的 Flexbox 與 Grid(第 17~20 課)。

另一個常見的問題是寬表格在手機上:欄位一多,表格會比螢幕還寬,把整頁撐出橫向捲軸。 常見的作法是把表格包在一個容器裡,用 CSS 的 overflow-x: auto 讓表格在容器裡自己左右捲動,頁面本身不會變寬(第 16 課會介紹 overflow)。

小測驗:合併與用途

1.

一格寫了 <td colspan="3">午休</td>,在一張 4 欄的表格裡,這一列還要寫幾個儲存格?

2.

下面哪一個內容最不適合用表格?

3.

<td rowspan="2"> 合併後,原本被蓋住的那一格裡的文字會怎樣?

第 1 次作答

重點整理

  • 表格一列一列寫:tr 裡放 th(標題)與 td(資料);caption 是表格的標題,放在第一個。
  • th 加 scope="col"(欄標題)或 scope="row"(列標題),螢幕閱讀器才能把資料與標題對起來。
  • thead、tbody、tfoot 分出表頭、內容與表尾;沒寫 tbody 時瀏覽器會自動補上。
  • rowspan 往下合併、colspan 往右合併;被佔住的位置不能再寫儲存格。
  • 表格只放行列都有意義的資料;排版交給 CSS。寬表格在手機上要讓它在容器裡左右捲動。

下一課講表單:輸入框、選項、送出按鈕,以及瀏覽器怎麼把資料送到伺服器。

這一課完成了!
Next lesson:表單
你目前沒有登入,學習進度只存在這個瀏覽器。 Login 後,進度會跟著帳號,換電腦也看得到。