精通HTML表格的使用

作者: 阮一峰

日期: 2009年5月10日

制作网页表格,需要使用table标签。

用好table标签并不容易,复杂的表格做起来就很麻烦,比如下面这张表。

我整理了一些HTML表格的高级语法。你可以看看,自己会用多少?

1. 标题和内容描述

表格的标题用caption标签表示,它会自动出现在整张表格的上方。

除了标题以外,对内容的更长描述可以写在table标签的summary属性中。

代码示例(为了便于阅读,tr、th、td省略关闭标签):

<table border="1"
  summary="this table gives some statistics about fruit
   flies: average height and weight, and percentage
     with red eyes (for both males and females).">
 <caption><em>a test table with merged cells</em></caption>
 <tr><th rowspan="2"><th colspan="2">average
 <th rowspan="2">red<br>eyes
 <tr><th>height<th>weight
 <tr><th>males<td>1.9<td>0.003<td>40%
 <tr><th>females<td>1.7<td>0.002<td>43%
</table>

在浏览器中的显示效果如下图:

2. 表头和表尾

从结构上看,表格可以分成表头、主体和表尾三部分,在HTML语言中分别用thead、tbody、tfoot表示。

代码示例:

<table>
<thead>
  <tr> ...header information...
</thead>
<tfoot>
  <tr> ...footer information...
</tfoot>
<tbody>
  <tr> ...first row of block one data...
  <tr> ...second row of block one data...
</tbody>
<tbody>
  <tr> ...first row of block two data...
  <tr> ...second row of block two data...
  <tr> ...third row of block two data...
</tbody>
</table>

这里有三个注意点:

1)thead和tfoot在一张表中都只能有一个,而tbody可以有多个。

2)tfoot必须出现在tbody前面,这样浏览器在接收主体数据之前,就能渲染表尾,有利于加快表格的显示速度。这一点对大型表格尤其重要。

3)thead、tbody和tfoot里面都必须使用tr标签。

3. 列的分组

tbody可以用来对"行"进行分组,而colgroup则用来对"列"进行分组。

比如,下面的代码表示前40列为一组,每列的宽度为20像素。

  <COLGROUP span="40" width="20">
  </COLGROUP>

span属性,可以指定colgroup标签能够影响到的列数。

在colgroup标签内部,可以使用col标签为这一列组中的每一列指定属性。

比如,下面的代码表示列组中每一列的段度为20像素:

  <COLGROUP>
  <COL width="20">
  <COL width="20">
  ...a total of forty COL elements...
  </COLGROUP>

再比如,如果40列中只有最后一列的样式不一样,那就这样写,方便在CSS中指定:

  <COLGROUP width="20">
  <COL span="39">
  <COL id="format-me-specially">
  </COLGROUP>

4. CSS中的table-layout语句

这个语句可以用来指定表格显示的样式,比如

table { table-layout: fixed }

它可以取三个值:

* auto(缺省)
* fixed
* inherit

auto表示单元格的大小由内容决定。fixed表示单元格的大小是固定的,由第一个指定大小的单元格决定;如果所有单元格都没有指定大小,则由第一个单元格的默认大小决定;如果单元格中的内容超出单元格的大小,则用CSS中的overflow命令控制。微软公司声称使用这个命令,表格的显示速度可以加快100倍。

顺便说一句,为了加快表格显示,最好事先就在CSS(或者table标签的width和height属性)中指定表格的宽度和高度。

5. th和td

表示单元格的标签是th(table head)和td(table data),前者用来显示数据的名称,后者用来显示数据的内容。

代码示例:

 <table border="1">
 <tr>
  <th>Month</th>
  <th>Savings</th>
 </tr>
 <tr>
  <td>January</td>
  <td>$100</td>
 </tr>
 </table>

这两个标签有一些很复杂的属性,分别是abbr、axis、char、headers和scope,详细解释参阅这里

6. frame和rules

table标签的frame和rules属性,可以控制边框的显示。frame属性控制着表格最外围的四条边框的可见性,而 rules 则控制着表格内部边框的可见性。

frame属性可取的值及含义如下:

* void - 默认值。表示不显示表格最外围的边框。
* box - 同时显示四条边框。
* border - 同时显示四条边框。
* above - 只显示顶部边框。
* below - 只显示底部边框。
* lhs - 只显示左侧边框。
* rhs - 只显示右侧边框。
* hsides - 只显示水平方向的两条边框。
* vsides - 只显示垂直方面的两条边框。

rules 属性可取的值有五个,分别是:

* none - 默认值。无边框。
* groups - 为行组或列组加边框。
* rows - 为行加边框。
* cols - 为列加边框。
* all - 为所有行列(单元格)加边框

代码示例:

<table border="1" width="600" frame="hsides" rules="groups">
     <caption>My Ultimate Table</caption>
     <colgroup span="1" width="200"></colgroup>
     <colgroup span="3" width="400"></colgroup>

<thead>
     <tr>
          <td>cell 1-1</td>
          <td>cell 1-2</td>
          <td>cell 1-3</td>
          <td>cell 1-4</td>
     </tr>
</thead>
<tfoot>
     <tr>
          <td>cell 4-1</td>
          <td>cell 4-2</td>
          <td>cell 4-3</td>
          <td>cell 4-4</td>
     </tr>
</tfoot>
<tbody>
     <tr>
          <td>cell 2-1</td>
          <td>cell 2-2</td>
          <td>cell 2-3</td>
          <td>cell 2-4</td>
     </tr>
     <tr>
          <td>cell 3-1</td>
          <td>cell 3-2</td>
          <td>cell 3-3</td>
          <td>cell 3-4</td>
     </tr>
</tbody>
</table>

在浏览器中的显示效果如下图:

[延伸阅读]

* HTML 4.0语言中的Table模型

* 理解表格一:图解frame 和rules 属性

* 理解表格二:其他表格相关标签及属性

(完)

留言(17条)

必须收藏,网页上的table属性一直就没有用的太好。

上面的语法都已用过,呵呵。

路过,纯属牢骚:不喜欢微软的Time New Rome的字体表示数字。

引用基德的发言:
路过,纯属牢骚:不喜欢微软的Time New Rome的字体表示数字。

choose any style you like, Time New Rome is popular in Chinese doc.

之前我用表格的时候基本是caption、thead、tfoot、tbody、tr、th/td,以为是很完整的表格了,原来发现还有colgroup这东东,确实比直接在td里面colspan好用,另外table的rules和frame属性太经典了!有了它就不需要一个个td的定义border了!

早期的网页都是table 哈哈

一峰兄,有时间写篇关于前几天杭州非法飙车撞死人的文章吧,想看看你对此事所持有的态度!

你写的可真详细呀!!看了一遍没有全记住。不过图片好像没有显示出来。

"tfoot必须出现在tbody前面"然而最后的代码示例放错了位置

引用frePerl的发言:

"tfoot必须出现在tbody前面"然而最后的代码示例放错了位置

谢谢指出,已经更正了!

写在屬性里面好? 还是说写在CSS里面好?

当有 width 又有 padding 的时候,会不会有兼容问題? 有的浏览器将 padding 算到 width里面,有的沒有。

后来听说,是因为TABLE不是标准盒模型,所以解析有点不同。想请问有什么解決办法吗?

上面屏蔽掉了。

[COLGROUP span="40" width="20"]是写在屬性里面好? 还是说写在CSS里面好?
......
....

图片都看不到了!

col和colgroup标签好像在ie8以上和谷歌等一些上没用了

图片好像失效了

react可以使用table标签的frame和rules属性吗?
我在react中使用frame和rules属性的时候
jsx-loader出来的属性中却没有这两个属性是怎么回事呢?
还有看到您的另一篇文章中说到div的渲染效率比table高
是否在react中也是如此,那么是不是能用div尽量用div.我是主要做报表数据分析呈现的

一峰兄啊,你有没有研究过到底是用table还是用div去模拟表格会比较好呢?因为结合你说表格最好先设置宽高再渲染会快很多,我发现有的框架中表格宽度都是算出来写好的,而不是用自适应,可能就是像你说的为了快吧。但是既然都要算,为何并不用div呢。我看有种说法是div渲染时会比较轻量,比输入框这种要快很多,那表格应该更是不如div轻吧?如果用div结合display:table呢?所以:表格用div去模拟会不会是更好的选择?会不会是以后的趋势?尤其数据量大,表格内渲染元素种类数量繁杂的情况。另外会不会所有输入类用div去模拟都更好呢?

我要发表看法

«-必填

«-必填,不公开

«-我信任你,不会填写广告链接