HTML 表格基礎

本文將引導您開始使用 HTML 表格,涵蓋非常基礎的內容,例如行、單元格、標題、使單元格跨越多列和多行,以及如何將一列中的所有單元格組合在一起以進行樣式設定。

先決條件 HTML 基礎知識(請參閱 HTML 簡介)。
目標 獲得對 HTML 表格的基本熟悉。

什麼是表格?

表格是一組結構化的資料,由行和列組成(**表格資料**)。表格允許您快速輕鬆地查詢指示不同型別資料之間某種關聯的值,例如人和他們的年齡,或一週中的某一天,或當地游泳池的時間表。

A sample table showing names and ages of some people - Chris 38, Dennis 45, Sarah 29, Karen 47.

A swimming timetable showing a sample data table

表格在人類社會中非常常見,並且已經存在很長時間了,正如 1800 年的這份美國人口普查檔案所證明的那樣

A very old parchment document; the data is not easily readable, but it clearly shows a data table being used.

因此,毫不奇怪,HTML 的建立者提供了一種方法來構建和呈現 Web 上的表格資料。

表格是如何工作的?

表格的重點在於它很嚴格。透過在行和列標題之間建立視覺關聯,可以輕鬆地解釋資訊。例如,檢視下面的表格並找到一顆具有 62 顆衛星的木星氣態巨行星。您可以透過關聯相關的行和列標題找到答案。

如果正確實現,HTML 表格會被螢幕閱讀器等輔助功能工具很好地處理,因此成功的 HTML 表格應該增強視力正常和視力障礙使用者的體驗。

表格樣式

您也可以在 GitHub 上 檢視即時示例!您會注意到,那裡的表格看起來更易讀——這是因為您在此頁面上看到的表格樣式最少,而 GitHub 版本應用了更重要的 CSS。

不要有任何幻想;為了使表格在 Web 上有效,您需要使用 CSS 提供一些樣式資訊,以及使用 HTML 提供良好的結構。在本模組中,我們重點關注 HTML 部分;要了解 CSS 部分,您應該在完成此操作後訪問我們的 樣式化表格 文章。

在本模組中,我們不會關注 CSS,但我們為您提供了一個最小的 CSS 樣式表,您可以使用它來使表格比沒有樣式的預設樣式更易讀。您可以在此處找到 樣式表,還可以找到一個 HTML 模板,該模板應用了樣式表——這些結合在一起將為您提供一個良好的起點,用於試驗 HTML 表格。

何時不應使用 HTML 表格?

HTML 表格應該用於表格資料——這是它們的設計目的。不幸的是,很多人過去常常使用 HTML 表格來佈局網頁,例如一行包含標題,一行包含內容列,一行包含頁尾,等等。您可以在我們的 無障礙學習模組 中的 頁面佈局 中找到更多詳細資訊和示例。這之所以常用,是因為瀏覽器之間的 CSS 支援過去很糟糕;如今,表格佈局不那麼常見了,但您仍然可能會在 Web 的某些角落看到它們。

簡而言之,將表格用於佈局而不是 CSS 佈局技術 是一個壞主意。主要原因如下

  1. 佈局表格會降低視障使用者的可訪問性螢幕閱讀器,由盲人使用,會解讀 HTML 頁面中的標籤並將其內容讀給使用者聽。由於表格並非用於佈局的正確工具,並且其標記比 CSS 佈局技術更復雜,因此螢幕閱讀器的輸出對使用者來說會令人困惑。
  2. 表格會產生標籤湯:如上所述,表格佈局通常涉及比正確佈局技術更復雜的標記結構。這可能導致程式碼更難編寫、維護和除錯。
  3. 表格並非自動響應式:當您使用正確的佈局容器(例如 <header><section><article><div>)時,它們的寬度預設為其父元素的 100%。另一方面,表格預設情況下會根據其內容進行大小調整,因此需要採取額外措施才能使表格佈局樣式在各種裝置上有效地工作。

主動學習:建立您的第一個表格

我們已經討論了足夠的表格理論,所以讓我們深入瞭解一個實際的例子並構建一個簡單的表格。

  1. 首先,在您本地計算機上的新目錄中建立 blank-template.htmlminimal-table.css 的本地副本。
  2. 每個表格的內容都包含在這兩個標籤之間:<table></table>。將它們新增到 HTML 的 body 中。
  3. 表格中最小的容器是表格單元格,它由 <td> 元素建立('td' 代表 'table data')。將以下內容新增到您的表格標籤內
    html
    <td>Hi, I'm your first cell.</td>
    
  4. 如果我們想要一行四個單元格,我們需要將這些標籤複製三次。更新表格的內容使其如下所示
    html
    <td>Hi, I'm your first cell.</td>
    <td>I'm your second cell.</td>
    <td>I'm your third cell.</td>
    <td>I'm your fourth cell.</td>
    

您會看到,這些單元格不是彼此上下放置的,而是自動在同一行上彼此對齊。每個 <td> 元素建立一個單元格,它們共同構成第一行。我們新增的每個單元格都會使該行變長。

為了停止該行的增長並開始在第二行上放置後續單元格,我們需要使用 <tr> 元素('tr' 代表 'table row')。現在讓我們來研究一下。

  1. 將您已建立的四個單元格放在 <tr> 標籤內,如下所示
    html
    <tr>
      <td>Hi, I'm your first cell.</td>
      <td>I'm your second cell.</td>
      <td>I'm your third cell.</td>
      <td>I'm your fourth cell.</td>
    </tr>
    
  2. 現在您已經建立了一行,嘗試再建立一兩行——每一行都需要用一個額外的 <tr> 元素進行包裝,每個單元格都包含在 <td> 中。

結果

這應該會生成一個看起來類似於以下內容的表格

注意:您也可以在 GitHub 上找到它,網址為 simple-table.html也可以線上檢視)。

使用 <th> 元素新增標題

現在讓我們將注意力轉向表格標題——位於行或列開頭並定義該行或列包含的資料型別的特殊單元格(例如,請參閱本文開頭顯示的第一個示例中的“Person”和“Age”單元格)。為了說明它們為何有用,請檢視以下表格示例。首先是原始碼

html
<table>
  <tr>
    <td>&nbsp;</td>
    <td>Knocky</td>
    <td>Flor</td>
    <td>Ella</td>
    <td>Juan</td>
  </tr>
  <tr>
    <td>Breed</td>
    <td>Jack Russell</td>
    <td>Poodle</td>
    <td>Streetdog</td>
    <td>Cocker Spaniel</td>
  </tr>
  <tr>
    <td>Age</td>
    <td>16</td>
    <td>9</td>
    <td>10</td>
    <td>5</td>
  </tr>
  <tr>
    <td>Owner</td>
    <td>Mother-in-law</td>
    <td>Me</td>
    <td>Me</td>
    <td>Sister-in-law</td>
  </tr>
  <tr>
    <td>Eating Habits</td>
    <td>Eats everyone's leftovers</td>
    <td>Nibbles at food</td>
    <td>Hearty eater</td>
    <td>Will eat till he explodes</td>
  </tr>
</table>

現在是實際渲染的表格

這裡的問題是,雖然您可以大致瞭解發生了什麼,但與可能的情況相比,交叉引用資料並不容易。如果列和行標題以某種方式突出顯示,效果會好得多。

主動學習:表格標題

讓我們嘗試改進此表格。

  1. 首先,在您本地計算機上的新目錄中建立我們的 dogs-table.htmlminimal-table.css 檔案的本地副本。HTML 包含與上面您看到的相同的 Dogs 示例。
  2. 為了在視覺上和語義上將表格標題識別為標題,您可以使用 <th> 元素('th' 代表 'table header')。它的工作方式與 <td> 完全相同,只是它表示標題,而不是普通單元格。進入您的 HTML,並將圍繞表格標題的所有 <td> 元素更改為 <th> 元素。
  3. 儲存您的 HTML 並將其載入到瀏覽器中,您應該會看到標題現在看起來像標題了。

注意:您可以在 GitHub 上找到我們的完成示例,網址為 dogs-table-fixed.html也可以線上檢視)。

標題為何有用?

我們已經部分回答了這個問題——當標題清晰突出顯示時,更容易找到您要查詢的資料,並且設計總體上看起來更好。

注意:表格標題具有一些預設樣式——即使您沒有向表格新增自己的樣式,它們也會加粗並居中,以幫助它們脫穎而出。

表格標題還有一個額外的好處——與 scope 屬性(我們將在下一篇文章中學習)一起,它們使您可以透過將每個標題與同一行或列中的所有資料相關聯來提高表格的可訪問性。然後,螢幕閱讀器能夠一次讀出一整行或一列資料,這非常有用。

允許單元格跨越多行和多列

有時我們希望單元格跨越多行或多列。請以以下簡單示例為例,該示例顯示了常見動物的名稱。在某些情況下,我們希望將雄性和雌性的名稱顯示在動物名稱旁邊。有時我們不希望這樣做,在這種情況下,我們只希望動物名稱跨越整個表格。

初始標記如下所示

html
<table>
  <tr>
    <th>Animals</th>
  </tr>
  <tr>
    <th>Hippopotamus</th>
  </tr>
  <tr>
    <th>Horse</th>
    <td>Mare</td>
  </tr>
  <tr>
    <td>Stallion</td>
  </tr>
  <tr>
    <th>Crocodile</th>
  </tr>
  <tr>
    <th>Chicken</th>
    <td>Hen</td>
  </tr>
  <tr>
    <td>Rooster</td>
  </tr>
</table>

但輸出結果並非我們想要的結果

我們需要一種方法來使“Animals”、“Hippopotamus”和“Crocodile”跨越兩列,“Horse”和“Chicken”向下跨越兩行。幸運的是,表格標題和單元格具有 colspanrowspan 屬性,它們使我們能夠做到這一點。兩者都接受一個無單位的數值,該值等於您想要跨越的行數或列數。例如,colspan="2" 使單元格跨越兩列。

讓我們使用 colspanrowspan 來改進此表格。

  1. 首先,在您本地計算機上的新目錄中建立我們的 animals-table.htmlminimal-table.css 檔案的本地副本。HTML 包含與上面您看到的相同的動物示例。
  2. 接下來,使用 colspan 使“Animals”、“Hippopotamus”和“Crocodile”跨越兩列。
  3. 最後,使用 rowspan 使“Horse”和“Chicken”跨越兩行。
  4. 儲存並在瀏覽器中開啟您的程式碼以檢視改進效果。

注意:您可以在 GitHub 上找到我們的完成示例,網址為 animals-table-fixed.html也可以線上檢視)。

為列提供通用樣式

不使用 <col> 進行樣式設定

在繼續之前,本文中還有一項功能需要告訴您。HTML 有一種方法可以定義一整列資料的樣式資訊,只需在一個地方即可——<col><colgroup> 元素。它們的存在是因為為列指定樣式資訊可能有點煩人和低效——您通常必須在該列中的每個 <td><th> 上指定樣式資訊,或者使用複雜的類似於 :nth-child 的選擇器。

注意:這種樣式列的方法僅限於少數屬性borderbackgroundwidthvisibility。要設定其他屬性,您必須為該列中的每個 <td><th> 設定樣式,或者使用複雜的類似於 :nth-child 的選擇器。

請以以下簡單示例為例

html
<table>
  <tr>
    <th>Data 1</th>
    <th style="background-color: yellow">Data 2</th>
  </tr>
  <tr>
    <td>Calcutta</td>
    <td style="background-color: yellow">Orange</td>
  </tr>
  <tr>
    <td>Robots</td>
    <td style="background-color: yellow">Jazz</td>
  </tr>
</table>

這將給我們以下結果

這不是理想的,因為我們必須在該列中的所有三個單元格上重複樣式資訊(在實際專案中,我們可能會在所有三個單元格上設定一個 class 並在一個單獨的樣式表中指定樣式)。

使用 <col> 進行樣式設定

與其這樣做,我們可以對 <col> 元素指定一次資訊。<col> 元素在 <colgroup> 容器內指定,該容器位於 <table> 開頭標籤的下方。我們可以透過如下方式指定表格來建立與上面看到的相同的效果

html
<table>
  <colgroup>
    <col />
    <col style="background-color: yellow" />
  </colgroup>
  <tr>
    <th>Data 1</th>
    <th>Data 2</th>
  </tr>
  <tr>
    <td>Calcutta</td>
    <td>Orange</td>
  </tr>
  <tr>
    <td>Robots</td>
    <td>Jazz</td>
  </tr>
</table>

實際上,我們定義了兩個“樣式列”,一個為每一列指定樣式資訊。我們沒有為第一列設定樣式,但我們仍然必須包含一個空的 <col> 元素——如果我們不這樣做,樣式將只應用於第一列。

如果我們想將樣式資訊應用於兩列,我們只需包含一個帶有 span 屬性的 <col> 元素,如下所示

html
<colgroup>
  <col style="background-color: yellow" span="2" />
</colgroup>

colspanrowspan 一樣,span 接受一個無單位的數值,該值指定您希望樣式應用到的列數。

注意:當表格、列和該列中的表格單元格都分別設定樣式時,應用於單元格的樣式將繪製在列樣式之上,而列樣式將繪製在表格之上。這是因為表格層首先渲染,然後是列層渲染,單元格層渲染在所有其他表格層之上

主動學習:colgroup 和 col

現在輪到您自己動手了。

下面您可以看到一位語言教師的時間表。週五,她有一節新的荷蘭語課程,整天都在上課,但週二和週四,她也會教授幾節德語課程。她想突出顯示她正在教授課程的日期所在的列。

按照以下步驟重新建立表格。

  1. 首先,在您本地計算機上的新目錄中建立我們的 timetable.html 檔案的本地副本。HTML 包含與上面您看到的相同的表格,但缺少列樣式資訊。
  2. 在表格頂部,緊靠 <table> 標籤下方,新增一個 <colgroup> 元素,您可以在其中新增 <col> 元素(請參閱以下剩餘步驟)。
  3. 前兩列需要保持不設定樣式。
  4. 向第三列新增背景顏色。style 屬性的值為 background-color:#97DB9A;
  5. 為第四列設定單獨的寬度。style 屬性的值為 width: 100px;
  6. 向第五列新增背景顏色。style 屬性的值為 background-color: #97DB9A;
  7. 向第六列新增不同的背景顏色和邊框,以表示這是一個特殊的日子,並且她正在教授新課程。style 屬性的值為 background-color:#DCC48E; border:4px solid #C1437A;
  8. 最後兩天是休息日,因此只需將它們設定為無背景顏色,但設定寬度;style 屬性的值為 width: 100px;

看看您對示例的處理情況。如果您遇到問題或想檢查您的工作,您可以在 GitHub 上找到我們的版本,網址為 timetable-fixed.html也可以線上檢視)。

總結

這幾乎涵蓋了 HTML 表格的基礎知識。在下一篇文章中,我們將瞭解一些更高階的表格功能,並開始思考它們對於視障人士的可訪問性。