为了使<tbody>
元素可滚动,我们需要更改元素在页面上的显示方式,即使用display: block;
将其显示为块级元素。
由于我们改变了 display
属性tbody
,因此我们应该将该属性更改为thead
element的以防止破坏表布局。
因此,我们有:
thead, tbody { display: block; }
tbody {
height: 100px; /* Just for the demo */
overflow-y: auto; /* Trigger vertical scroll */
overflow-x: hidden; /* Hide the horizontal scroll */
}
Web浏览器将thead
和tbody
元素显示为行组(table-header-group
和table-row-group
默认情况下,)。
一旦我们改变了,内部 tr
元素将无法填充其容器的整个空间。
为了解决这个问题,我们必须计算tbody
列的宽度并将相应的值应用于thead
通过JavaScript列。
自动宽度列
这是上述逻辑的jQuery版本:
// Change the selector if needed
var $table = $('table'),
$bodyCells = $table.find('tbody tr:first').children(),
colWidth;
// Get the tbody columns width array
colWidth = $bodyCells.map(function() {
return $(this).width();
}).get();
// Set the width of thead columns
$table.find('thead tr').children().each(function(i, v) {
$(v).width(colWidth[i]);
});
这是输出(在Windows 7 Chrome 32上):
工作演示。
全宽表,相对宽度列
根据原始海报的需要,我们可以将其扩大table
到width
其容器的100%,然后对表的每一列使用相对值(Percentage)width
。
table {
width: 100%; /* Optional */
}
tbody td, thead th {
width: 20%; /* Optional */
}
由于表格具有(某种)流体布局,因此在调整thead
容器大小时,我们应该调整列的宽度。
因此,一旦调整窗口大小,我们应该设置列的宽度:
// Adjust the width of thead cells when *window* resizes
$(window).resize(function() {
/* Same as before */
}).resize(); // Trigger the resize handler once the script runs
输出为:
工作演示。
浏览器支持和替代
我已经通过新版本的主要Web浏览器(包括IE10 +)在Windows 7上测试了上述两种方法,并且该方法有效。
但是,它不 工作 正常 上IE9及以下。
这是因为在表格布局中,所有元素都应遵循相同的结构属性。
通过使用display: block;
为<thead>
和<tbody>
元素,我们把这个表结构。
通过JavaScript重新设计布局
一种方法是重新设计(整个)表布局。使用JavaScript动态创建新的布局并处理和/或动态调整单元格的宽度/高度。
例如,看下面的例子:
嵌套表
这种方法使用两个包含一个div的嵌套表。第一个表table
只有一个具有的单元格,div
第二个表位于该div
元素内。
在CSS Play上检查Vertical滚动表。
这适用于大多数Web浏览器。我们还可以通过JavaScript动态地执行上述逻辑。
具有固定标题的表格滚动
由于向中添加垂直滚动条的目的<tbody>
是在每行顶部显示表格标题,因此我们可以将元素定位为thead
fixed
在屏幕代替的顶部。
这是Julien进行的这种方法的工作演示。
它具有有前途的Web浏览器支持。
而且在这里一个纯CSS通过实施威廉·Bockstal。
纯CSS解决方案
这是旧答案。当然,我添加了一个新方法并完善了CSS声明。
固定宽度桌
在这种情况下,table
应该具有固定的值width
(包括列宽和垂直滚动条的宽度之和)。
每列应具有特定的宽度,元素的最后一列thead
需要更大的宽度,该宽度等于其他列的宽度 + 垂直滚动条的宽度。
因此,CSS将为:
table {
width: 716px; /* 140px * 5 column + 16px scrollbar width */
border-spacing: 0;
}
tbody, thead tr { display: block; }
tbody {
height: 100px;
overflow-y: auto;
overflow-x: hidden;
}
tbody td, thead th {
width: 140px;
}
thead th:last-child {
width: 156px; /* 140px + 16px scrollbar width */
}
这是输出:
工作演示。
宽度为100%的桌子
在这种方法中,每个table
的宽度为100%
,th
且属性td
的值width
应小于100% / number of cols
。
此外,我们需要减少宽度的thead
作为的值宽度垂直滚动条。
为此,我们需要使用CSS3 calc()
函数,如下所示:
table {
width: 100%;
border-spacing: 0;
}
thead, tbody, tr, th, td { display: block; }
thead tr {
/* fallback */
width: 97%;
/* minus scroll bar width */
width: -webkit-calc(100% - 16px);
width: -moz-calc(100% - 16px);
width: calc(100% - 16px);
}
tr:after { /* clearing float */
content: ' ';
display: block;
visibility: hidden;
clear: both;
}
tbody {
height: 100px;
overflow-y: auto;
overflow-x: hidden;
}
tbody td, thead th {
width: 19%; /* 19% is less than (100% / 5 cols) = 20% */
float: left;
}
这是在线演示。
注意:如果每列的内容都使行中断,则该方法将失败,即,每个单元格的内容应足够短。
在下面,有两个简单的纯CSS解决方案示例,它们是我在回答此问题时创建的。
这是jsFiddle Demo v2。
旧版本:jsFiddle Demo v1