我有三个div,分别是Header、Central和Footer。在Central div中有一个表格(gridview),它几乎总是比外部div更长。因此,我已经使这个div在垂直方向上可以滚动。问题是:如何使表头在div向下滚动后仍然可见?我可以使用单独的div或表格来创建表头并使其固定,但表格中列的宽度并不总是相同的 - 因此我不知道如何维护表头中列的宽度。有什么线索吗?
我有三个div,分别是Header、Central和Footer。在Central div中有一个表格(gridview),它几乎总是比外部div更长。因此,我已经使这个div在垂直方向上可以滚动。问题是:如何使表头在div向下滚动后仍然可见?我可以使用单独的div或表格来创建表头并使其固定,但表格中列的宽度并不总是相同的 - 因此我不知道如何维护表头中列的宽度。有什么线索吗?
我刚刚编写了一个jQuery插件,可以完全满足你的需求。它非常小巧且易于实现。
只需要一个包含thead和tbody的表格即可。
您可以将该表格放入具有类名的DIV中,表格将始终调整大小以适应该DIV。例如,如果您的div随浏览器窗口缩放,则表格也会随之缩放。当滚动时,标题将固定在顶部。如果启用页脚,则页脚也将固定。您还可以选项克隆页眉并将其固定在页脚上。如果您使浏览器窗口过小而所有列无法适合...它也会水平滚动(页眉也是如此)。
只需将DIV的类名称传递给插件即可,例如:$('.myDiv').fixedHeaderTable({footer: true, footerId: 'myFooterId'}); 然后插件将完成其余工作。 FooterID是页面上包含页脚标记的元素。如果您想要将分页作为页脚,则使用此选项。
如果页面上有多个表格,它也适用于每个带有固定标题的表格。
请访问此处进行查看:http://fixedheadertable.mmalek.com/
请记住,它仍处于“beta”状态,因此我每天都会添加新功能和修复错误。
支持的浏览器:IE6、IE7、IE8、FireFox、Safari和Chrome。
$(document).ready(function() {
$('.header').html( $('.inner').html() );
$('.header').css('width', $('.inner table').outerWidth() );
$('.header').css('height', $('.inner table thead').outerHeight() );
});
table {
width:100%;
}
th {
border-top:1px solid #999;
text-align:left;
}
td, th {
border-bottom:1px solid #999;
background-color:#EEE;
}
.outer {
position:relative;
width:500px;
}
.inner {
height:150px;
overflow:auto;
}
.header {
position:absolute;
top:0;
left:0;
overflow:hidden;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<body>
<div class="outer">
<div class="inner">
<table cellspacing="0" cellpadding="0">
<thead>
<tr>
<th>a</th>
<th>b</th>
<th>c</th>
<th>d</th>
</tr>
</thead>
<tbody>
<tr><td>1</td><td>b</td><td>c</td><td>d</td></tr>
<tr><td>2</td><td>b</td><td>c</td><td>d</td></tr>
<tr><td>3</td><td>b</td><td>c</td><td>d</td></tr>
<tr><td>4</td><td>b</td><td>c</td><td>d</td></tr>
<tr><td>5</td><td>b</td><td>c</td><td>d</td></tr>
<tr><td>6</td><td>b</td><td>c</td><td>d</td></tr>
<tr><td>7</td><td>b</td><td>c</td><td>d</td></tr>
<tr><td>8</td><td>b</td><td>c</td><td>d</td></tr>
<tr><td>9</td><td>b</td><td>c</td><td>d</td></tr>
<tr><td>10</td><td>b</td><td>c</td><td>d</td></tr>
<tr><td>11</td><td>b</td><td>c</td><td>d</td></tr>
<tr><td>12</td><td>b</td><td>c</td><td>d</td></tr>
</tbody>
</table>
</div>
<div class="header">
</div>
</div>
</body>
这里有一个使用JavaScript的基本解决方案:
function position(table) {
table.rows[0].style.position="absolute";
table.rows[0].style.top="0px";
table.style.marginTop = table.rows[0].clientHeight/1.2;
var widths = Array();
for(var i = 0; i < table.rows[0].cells.length; i++) {
widths[i] = max(table.rows[0].cells[i].clientWidth, table.rows[1].cells[i].clientWidth);
}
for(var row = 0; row < table.rows.length; row++) {
for(var col = 0; col < widths.length; col ++) {
table.rows[row].cells[col].style.width = widths[col] + "px";
}
}
}
function max(num1, num2) { return (num1 > num2) ? num1 : num2; }
您需要在数据表格中使用标题来描述每一列。通过table-layout:fixed可以保持列宽的一致性。JavaScript可用于匹配每列的宽度。
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js"
type="text/javascript"></script>
<script>
$(function() {
$('div.tableContainer').each(function() { // for each table
var div = $(this);
var widths = [];
var changed = false;
$('table>*>tr', div).each(function(tr_i) {
$(this).children().each(function(i) {
var w = $(this).width();
if (w > widths[i]) {
widths[i] = w;
changed = true;
}
});
}).each(function(tr_i) {
if (changed)
$(this).children().each(function(i) {
var width = widths[i];
// add some width for scrollbar
if (tr_i == 0 && changed && i == widths.length-1) width += 16;
// insert a div to ensure width
$(this).append('<div style="width:'+width+'px; height:0px"> </div>');
});
});
div.width(div.children('table').width()).css('overflow-x', 'hidden');
});
});
</script>
tbody
{
height: 100px; /* or whatever */
overflow: auto;
overflow-y: auto;
overflow-x: hidden;
}
IE在一般情况下对tbody存在严重而复杂的问题。虽然可以通过表达式来解决,但这并不是一件简单的事情,并且具体取决于设计。
这个解决方案在Firefox和其他Gecko浏览器中使用CSS,在IE中使用CSS表达式。
http://home.tampabay.rr.com/bmerkey/examples/nonscroll-table-header.html
在Opera或Safari/Chrome中,页眉和页脚不固定,但整个表格是可滚动的,因此可以使用。请注意,作者的示例中给出了列的百分比宽度,但可以将其删除。
如果您想尝试Opera/Safari/Chrome的支持,请考虑给tbody设置display:block,并从那里开始。