表格基本样式

课后整理 2020-12-9

CSS为表格定义了5个专用属性,详细说明如表1所示。

表1  CSS表格属性列表

属性 取值 说明
border-collapse separate(边分开) | collapse(边合并) 定义表格的行和单元格的边是合并在一起还是按照标准的HTML样式分开
border-spacing length 定义当表格边框独立(如当border-collapse属性等于 separate时),行和单元格的边在横向和纵向上的间距,该值不可以取负值
caption-side top | bottom 定义表格的caption对象位于表格的顶部或底部。应与 caption 元素一起使用
empty-cells show | hide 定义当单元格无内容时,是否显示该单元格的边框
table-layout auto | fixed 定义表格的布局算法,可以通过该属性改善表格呈递性能,如果设置fixed属性值,会使IE以一次一行的方式呈递表格内容从而提供给信息用户更快的速度;如果设置auto属性值,则表格在每一单元格内所有内容读取计算之后才会显示出来

除了上表介绍的5个表格专用属性外,CSS其他属性对于表格一样适用。

设计表格边框线

使用CSS的border属性代替<table>标签的border属性定义表格边框,可以优化代码结构。

【示例1】下面示例演示如何使用CSS设计细线边框样式的表格。

第1步,在<head>标签内添加<style type="text/css">标签,定义一个内部样式表。

第2步,在内部样式表中输入下面样式代码,定义单元格边框显示为1像素的灰色实线。

th, td {font-size:12px; border:solid 1px  gray;}

第3步,在<body>标签内构建一个简单的表格结构。

<table>
     <tr>
         <th>属性</th>
         <th>版本</th>
         <th>继承性</th>
        <th>描述</th>
     </tr>
     <tr>
         <td>table-layout</td>
         <td>CSS2</td>
         <td>无</td>
         <td>设置或检索表格的布局算法</td>
     </tr>
     <tr>
         <td>border-collapse</td>
         <td>CSS2</td>
         <td>有</td>
         <td>设置或检索表格的行和单元格的边是合并在一起还是按照标准的HTML样式分开</td>
     </tr>
     <tr>
         <td>border-spacing</td>
         <td>CSS2</td>
         <td>有</td>
         <td>设置或检索当表格边框独立时,行和单元格的边框在横向和纵向上的间距</td>
     </tr>
     <tr>
         <td>caption-side</td>
         <td>CSS2</td>
         <td>有</td>
         <td>设置或检索表格的caption对象是在表格的那一边</td>
     </tr>
     <tr>
         <td>empty-cells</td>
         <td>CSS2</td>
         <td>有</td>
         <td>设置或检索当表格的单元格无内容时,是否显示该单元格的边框</td>
     </tr>
</table>

第4步,在浏览器中预览,则显示效果如图1所示。

图1 使用CSS定义单元格边框样式

通过效果图可以看到,使用CSS定义的单行线不是连贯的线条。这是因为表格中每个单元格都是一个独立的空间,为它们定义边框线时,相互之间不是紧密连接在一起的。

第5步,在内部样式表中,为table元素添加如下CSS样式,把相邻单元格进行合并。

table { border-collapse:collapse;}/* 合并单元格边框 */

第6步,在浏览器中重新预览页面效果,则显示如图5所示。

图5 使用CSS合并单元格边框

定义单元格间距和空隙

为了兼容<table>标签的cellspacing属性,CSS定义了border-spacing属性,该属性能够分离单元格间距。取值包含1个或2个值。当定义一个值时,则定义单元格行间距和列间距都为该值。例如:

table { border-spacing:20px;}/* 分隔单元格边框 */

如果分别定义行间距和列间距,就需要定义两个值,例如:

table { border-spacing:10px 30px;}/* 分隔单元格边框 */

其中第一个值表示单元格之间的行间距,第二个值表示单元格之间的列间距,该属性值不可以为负数。使用cellspacing属性定义单元格之间的距离之后,该空间由表格背景填充。

使用该属性应注意几个小问题:

【示例2】以上节示例中表格结构为基础,重新设计内部样式表,为表格内单元格定义上下6像素和左右12像素的间距,同时设计单元格内部空隙为12像素,演示效果如图2所示。

table { border-spacing: 6px 12px; }
th, td {
     font-size: 12px;
     border: solid 1px gray;
     padding: 12px;
}

图2 增加单元格空隙

也可以为<table>标签定义补白,此时可以增加表格外框与单元格之间的距离。

【示例3】继续在上面示例为基础,为<table>标签重设如下样式,设计表格外框为2像素红色实线,定义表格外框与内部单元格间距为2像素,则显示效果如图3所示。

table {
     border-spacing: 6px 12px;
     border: solid 2px red;
     padding: 2px;
}

图3 为表格和单元格同时定义补白效果

隐藏空单元格

如果表格单元格的边框处于分离状态(border-collapse: separate;),可以使用CSS的empty-cells属性设置空单元格是否显示。当其值为show时,表示显示空单元格;当值为hide时,表示隐藏空单元格。

【示例4】在下面示例中,隐藏第2行第2列的空单元格边框显示,效果如图8所示。

<style type="text/css">
table {/* 表格样式 */
     width: 400px;                                                  /* 固定表格宽度 */
     border: dashed 1px red;                                           /* 定义虚线表格边框 */
     empty-cells: hide;                                            /* 隐藏空单元格 */
}
th, td {/* 单元格样式 */
     border: solid 1px #000;                                           /* 定义实线单元格边框 */
     padding: 4px;                                                  /* 定义单元格内的补白区域 */
}
</style>
 
<table>
     <tr><td>西</td><td>东</td> </tr>
     <tr><td>北</td><td></td></tr>
</table>

隐藏空白单元格  

默认显示的空白单元格

图8 隐藏空单元格效果

【提示】

所谓空单元格,就是没有可视内容的单元格。如果单元格的visibility属性值为hidden,即便单元格包含内容,也认为是无可视内容。而“&nbsp;”和其它空白字符为可视内容。ASCII字符中的回车符(“\0D”)、换行符(“\0A”)、Tab键(“\09”)和空格键(“\20”)表示无可视内容。

如果表格行中所有单元格的empty-cells属性都为hide,且都不包含任何可视内容,那么整行就等于设置了display: none。

定义标题样式

使用CSS的caption-side属性可以定义标题的显示位置,该属性取值包括top(位于表格上面)、bottom(位于表格底部)、left(位于表格左侧,非标准)、right(位于表格右侧,非标准)。

如果要水平对齐标题文本,则可以使用text-align属性。对于左右两侧的标题,可以使用vertical-align属性进行垂直对齐,取值包括top、middle和bottom,其它取值无效,默认为top。

【示例5】在下面示例中,定义标题靠左显示,并设置标题垂直居中显示。但不同浏览器在解析时分歧比较大,如在IE浏览器中显示如图9所示,但是在Firefox中显示如图10所示。

<style type="text/css">
table {border: dashed 1px red; }/* 定义表格虚线外框样式 */
th, td {/* 定义单元格样式 */
     border: solid 1px #000;                                           /* 实线内框 */
     padding: 20px 80px;                                        /* 单元格内补白大小 */
}
caption {/* 定义标题行样式 */
     caption-side: left;                                                    /* 左侧显示 */
     width: 10px;                                                          /* 定义宽度 */
     margin: auto 20px;                                                 /* 定义左右边界 */
     vertical-align: middle;                                             /* 垂直居中显示 */
     font-size: 14px;                                                      /* 定义字体大小 */
     font-weight: bold;                                                   /* 加粗显示 */
     color: #666;                                                           /* 灰色字体 */
}
</style>
 
<table>
     <caption>表格标题</caption>
     <tr><td>北</td><td>西</td> </tr>
     <tr><td>东</td><td>南</td> </tr>
</table>

图9 IE解析表格标题效果

图10 Firefox解析表格标题效果

【拓展】

当同时为<table>、<tr>和<td>等标签定义背景色、边框、字体属性等样式,就容易发生样式重叠问题。根据表格布局模型,各种表格对象背景样式层叠的顺序如图11所示。

图11  表格对象样式的层叠顺序

从上图可以看到:td元素的样式具有最大优先权,以此类推,如果单元格为透明,则行(tr元素)具有最大优先权。表格定义的背景优先权最弱,如果表格中其他元素都为透明时,则才可以看到表格的背景。