重新发现HTML表格
根据我最近的一些实践以及在和一些读者进行关于HTML表格的使用问题沟通之后,决定写这篇文章。总的来说,我注意到由于误导性信息,他们对于table的使用有种先入为主的厌恶。事实上很多人会说”我看到永远不应该使用表格”的说法,但是这绝对是错误的!这个建议只是针对使用HTML表格来定义网页的布局,但是表格在方便的排列数据信息行和列方面非常完美,而且如果你一定要在一个页面上显示表列数据,你就不得不使用它们!为什么不呢?然而,在这种情况下,一些人无视了用于table的某些HTML标签的存在并且不知道该如何正确的使用它们。
HTML有10个表格相关标签。下面是一个带有简介的列表,但是首先,文档要被正确的定义在HTML 4.01/XHTML 1或HTML 5下面:
- <caption> 定义表格标题(4, 5)
- <col> 为表格的列定义属性(4, 5)
- <colgroup> 定义表格列的分组(4, 5)
- <table> 定义表格(4, 5)
- <tbody> 定义表格主体(4, 5)
- <td> 定义一个单元格 (4, 5)
- <tfoot> 定义表格的表注(底部)(4, 5)
- <th> 定义表格的表头 (4, 5)
- <thead> 定义表格的表头(4, 5)
- <tr> 定义表格的行(4, 5)
一个基本的表格结构如下:

它包含一个标题、头部、主体和底部。正确的HTML元素顺序是:
- <table>
- <caption>
- <thead>
- <tfoot>
- <tbody>
你也可以使用<col> 和<colgroup> 来定义表格的列或为列分组:
- <table>
- <caption>
- <colgroup>
- <col>
- <thead>
- <tfoot>
- <tbody>
下面是一个正确的表格结构实例:
<table border="1"> <caption>Table caption here</caption> <colgroup span="1" style="background:#DEDEDE;"/> <colgroup span="2" style="background:#EFEFEF;"/> <!-- Table Header--> <thead> <tr> <th>Head 1</th> <th>Head 2</th> <th>Head 3</th> </tr> </thead> <!-- Table Footer--> <tfoot> <tr> <td>Foot 1</td> <td>Foot 2</td> <td>Foot 3</td> </tr> </tfoot> <!-- Table Body--> <tbody> <tr> <td>A</td> <td>B</td> <td>C</td> </tr> <tr> <td>D</td> <td>E</td> <td>F</td> </tr> </tbody> </table>
在浏览器中的结果如下图所示:

关于表格的一些技巧
- 根据w3schools的解释和用法,在一个table定义中,<tfoot>元素必须出现在<tbody>之前,这样,浏览器就可以在接受到所有数据之前呈现表注了。另外,如果不是这个顺序,将不能通过W3C的HTML4和XHTML验证,无论你声明哪种DTD。(了解更多)。
- 在 HTML 4.01 中,表格的align和bgcolor属性不赞成使用,所以在HTML 5中不再有任何table的属性被支持(事实上,在XHTML 1.0 Strict DTD中已经不支持”align”和”bgcolor”属性了);
- 所有主流浏览器都支持<colgroup> 标签,但是Firefox、Chrome 以及 Safari 仅支持 colgroup 元素的 span 和 width 属性;
- css中的empty-cells:show|hide 可以设定空单元格是否显示边框。注意,这个需要设置在table而不是td/th中。IE6中比较容易遇到该问题;
- css中的border-collapse:collapse | separate 可以设置表格的边框是否被合并成一个边框;
- css中的border-spacing属性等效于table的cellspacing属性。
为了实现现在所提倡的表现和结构分离的开发模式,前端观察建议将页面中所有与表现层有关的东东,都用CSS来控制,不用HTML自带的属性来控制页面的表现,而table是最容易被忽略的一个。
关于table的更多详细内容可以查看W3C的文档: w3 Introduction to tables
最后留一个非常简单的问题给大家,CSS的哪个属性等效于table的cellpadding属性?
tfoot的顺序在w3上就是这样定义的…被不少人忽略了…
支持!
wp后台的评论页面 tfoot先出来,感觉很上流
呃,一直忽视了tfoot的顺序原来应该是在tbody之前的…纵使它带了个foot的单词,并且浏览器渲染的话tfoot比tbody先出来…
最后的小问题,css中的margin是不是等效于cellpadding啊?
不要笑,本人菜
padding 吧
能解释一下么?
顾名思义嘛,都是padding,表示的是表格单元格之间的内边距
除了标签外
table 的 summary attribute
也直的关注一下
http://www.w3.org/TR/html4/struct/tables.html#adef-summary
colgroup,summary都还是第一次看到,长见识!
实践证明IE7不支持empty-cells:show|hide
http://www.w3school.com.cn/tiy/t.asp?f=csse_table_empty-cells
正好要学习表格 谢谢大哥了
tfoot应该写在tbody之前,一直没注意到这个,多谢了。
神飞,好棒~~~~~~
dear old big, 有个问题想请教下您:
最近在用QQ空间,它写文章是可以自己写HTML代码的,不过写CSS就麻烦了点,要
写在行内,那这样有一些就不会写了,比如伪类啊, li:hover的时候里面的a的样式啊
这些,写在行内不知怎么写,找了很久都找不到方法,所以想请教下old big您
55555….
我笨,老大它不理我,hover是伪类,不能写在行内的
所有主流浏览器都支持 标签,但是Firefox、Chrome 以及 Safari 仅支持 colgroup 元素的 span 和 width 属性;
ie可以支持很多命令,对于标准浏览器,不支持的命令可以用+来写
比如:
td+td{padding:3px;}
一直不知道,表格有怎么多参数
colgroup 的属性span 值是表示什么啊?第几列吗?还是按照顺序往下数列数啊?
span 属性规定列组应该横跨的列数。 可参考这里: http://www.w3school.com.cn/tags/att_colgroup_span.asp
恩,现在发现之前的一个项目时多么的傻X 了,不知道这个属性,一直在给那一列的td加class,郁闷啊。
另外,神飞能整理一个关于前端标准之类的建议出来吗?这一方面的很多文章参差不齐啊,甚至同一个问题都是相反的说法。
今天看了 这篇文章 http://design-hong.com/norms/norms.xml ,更是强烈希望看到神飞对这方面的建议了。
我最近也有关注前端编码规范方面的东东,但是这么重要的事情,哪里是一个人能确定下来的。要考虑到前端开发的方方面面,要严谨,更要兼顾团队的效率。不过我想我们会在这方面做点儿事情的……
恩,公司叫我搞一个规范出来,诶,不简单啊,参考了很多文章,可是很多问题确实是仁见仁智见智啊。
(我是那篇文章的作者) 规范用于团队内部还是很有效果的. 但有一些细则希望大多数developer能采纳, 比如: 科学的CSS属性书写顺序等…
好文章····内牛满面···玩这么久布局,其实这些东西我居然都不知道···惭愧捏····
很不错的文章,内容比较朴实,文笔也不错。看得出来笔者是为用心的人。
技巧通通搬走! (*^__^*) …
一直没有好好利用表格自己的东西……哎
所有主流浏览器都支持 标签,但是Firefox、Chrome 以及 Safari 仅支持 colgroup 元素的 span 和 width 属性;
试了一下,发现的style属性在IE中有效,FF和CHROME中没有用,这样,标签似乎也很鸡肋了呀。。??还是我用法错了呀?
包括id,class等控制colgroup 依然只有在IE中有效果