HTML table 的基本用法

古早古早以前,要排出一個美觀的網頁必須使用 <table> 標籤,利用表格合併欄位的方式,把圖片跟文字放在想放的位置,但是 CSS 橫空出世之後,網頁排版變得靈活許多,<table>標籤就回歸它原本的用途,真的就只是拿來排表格。剛好最近切版,有許多表格元件,就來重新溫習一下 <table> 的使用方法。

裸露的表格

<table> 標籤裡面的結構分為 <thead><tbody><tfoot><thead>放的是表頭,<tbody>放的是表格的內容,<tfoot>放的則是表尾。三者裡面都必須放一個<tr></tr>標籤,告訴瀏覽器那是一個橫列,而<tr></tr>中間放的標籤則略有不同,<thead>部分要放 <th><tbody><tfoot>則是放<td>

<thead><tbody> 和 <tfoot> 屬於「容器元素」,需要有「起始標籤」以及「結束標籤

  • <thead> CSS 的 display 屬性為「table-header-group」,只能作為 <table> 的子元素,無法單獨使用於<table>標籤之外。
  • <tbody>  CSS 的 display 屬性為「table-row-group」,只能作為 <table> 的子元素,無法單獨使用於<table>標籤之外。
  • <tfoot>  CSS 的 display 屬性為「table-footer-group」,只能作為 <table> 的子元素,無法單獨使用於<table>標籤之外。

原始沒有任何修飾的表格結構如下:

<table>
  <thead>
    <tr>
      <th>Name</th>
      <th>Age</th>
      <th>Weight</th>
      <th>Height</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Jack</td>
      <td>18</td>
      <td>50</td>
      <td>180</td>
    </tr>
    <tr>
      <td>Mary</td>
      <td>23</td>
      <td>70</td>
      <td>160</td>
    </tr>
  </tbody>
  <tfoot>
    <tr>
      <td>average</td>
      <td>31</td>
      <td>60</td>
      <td>170</td>
    </tr>
  </tfoot>
</table>

可以看到一個醜醜的表格,每一個 <td> 都有被一個距離隔開,粉紅色的底色則是為了標示出表格的範圍,唯一設定的 CSS 選擇器。

<table>的CSS 預設樣式如下:

thead {
  display: table-header-group;
  vertical-align: middle;
  border-color: inherit;
}

tbody {
  display: table-row-group;
  vertical-align: middle;
  border-color: inherit;
}

tfoot {
  display: table-footer-group;
  vertical-align: middle;
  border-color: inherit;
}

那要如何將每一格中間的距離取消呢?這必須在 CSS 中設定 border-collapse 這一個屬性為 collapse。

table {
	// 原始的設定 border-collapse: separate
  border-collapse: collapse;
}

在 border-collapse: separate 的狀態下可以用 border-spacing

table {
	// 原始的設定 border-collapse: separate
  border-collapse: separate;
  border-spacing: 10px;
}

在這裡可以看到,原本的欄位間的間隔都被消除了,表格間的欄位都緊緊貼在一起。

<tr>可以設定框線但是無法設定圓角

<tr>標籤的意思為 table-row,表示一個橫列,<tr></tr>中間必須放入<th></th>或是<td></td>標籤,我們可以為 <tr> 設定框線,甚至設定 border-bottom 等屬性都可以起作用,但是無法設定圓角。

tr{
  background: pink;
  border: 4px solid red;
  border-radius: 10px;
	// padding 無作用
  padding: 100px;
}

<th><td>

  • <th>的 text-align 預設為 center。
  • <td>的 text-align 預設為 left。
  • <th><td>都有 padding 屬性。
  • <th><td>都可以設定 background 背景屬性。
  • <th> 跟 <td>都可以設定 border。
  • <th> 跟 <td>都可以設定 border-radius 圓角,但是 border 不會跟著變化,變成背景有圓角,但是邊框是直角的狀態,這是因為 border-collapse 設為 collapse,先改回 separate,再將 border-spacing 設為 0 ,這樣邊框也會變成圓角貼齊在有圓角的背景上。
table {
	// 原始的設定 border-collapse: separate
  border-collapse: collapse;
}

tr{
  background: pink;
  // border-bottom:4px solid red;
  border-radius:10px;	
}
th{
  border:2px solid brown;
  padding: 50px;
  border-radius: 20px;
}
td {
  border: 2px solid blue;  
  padding: 50px;
  text-align:right;
  border-radius: 20px;
}

也可以分別設定 <th>與<td>的4個圓角:

border-top-left-radius: 50px; 
border-top-right-radius: 50px;
border-bottom-left-radius: 50px;
border-bottom-right-radius: 20px; 

<td> 上面設圓角,<tr> 的 border 不會跟著變圓角

<td>的第一個元素設定左上角跟左下角為圓角,最後一個元素設定右下角跟右上角為圓角,同時設定 <tr> 的外框線:

td:first-child,
th:first-child {
  border-radius: 20px 0 0 20px;
}
td:last-child,
th:last-child {
  border-radius: 0 20px 20px 0;
}

tr{
  background: pink;
  border:4px solid red;
  //  border-radius: 20px 不會起作用
  border-radius: 20px;
}

參考資料

https://www.w3schools.com/css/css_table_style.asp

https://steam.oxxostudio.tw/category/html/tags/thead-tbody-tfoot.html

https://www.quackit.com/html/html_editors/scratchpad/?example=/html/codes/tables/html_table_border_rounded_corners