表格 - 固定标题、可滚动正文、最强大/最简单的解决方案? [复制]

Posted

技术标签:

【中文标题】表格 - 固定标题、可滚动正文、最强大/最简单的解决方案? [复制]【英文标题】:Table - fixed header, scrollable body, most robust/simple solution? [duplicate] 【发布时间】:2010-11-21 00:35:58 【问题描述】:

可能重复:html table with fixed headers?

寻找一种解决方案来创建具有可滚动正文和静态/固定标题的表格。

四处搜索似乎会产生 许多 片状代码,要么在 IE 中无法运行,需要大量的 javascript 和调整,要么是大量的 CSS hack 等等。

老实说,如果是 CSS hack 或 Javascript,我想我更愿意选择 Javascript。

我猜的替代方法是将它全部放在一个 div 中,然后滚动整个表格 - 但这有点不合适:D

【问题讨论】:

复制:***.com/questions/673153/… 【参考方案1】:

我刚刚组装了一个 jQuery 插件,它完全可以满足您的需求。它的体积非常小,而且非常容易实现。

所需要的只是一个包含thead 和tbody 的表格。

您可以将该表包装在一个带有类名的 DIV 中,并且该表将始终调整大小以适合该 div。因此,例如,如果您的 div 与浏览器窗口一起缩放,那么表格也会随之缩放。滚动时标题将被固定。页脚将被固定(如果您启用页脚)。您还可以选择在页脚中克隆页眉并将其修复。此外,如果您将浏览器窗口设置得太小并且无法容纳所有列...它也会水平滚动(标题也是)。

此插件允许浏览器调整列的大小,使其不是固定宽度的列。

您只需将 DIV 的类名传递给插件,如下所示: $('.myDiv').fixedHeaderTable(footer: true, footerId: 'myFooterId');插件将完成剩下的工作。 FooterID 是页面上包含页脚标记的元素。如果您想将分页作为页脚,则使用此选项。

如果您在页面上有多个表格,它也适用于您希望有一个固定标题的每个表格。

在这里查看:http://fixedheadertable.mmalek.com/

请记住它仍然是“测试版”,所以我每天都会添加新功能和错误修复。

支持的浏览器:IE6、IE7、IE8、FireFox、Safari 和 Chrome

这是我对另一个有同样问题的人的回复的链接:Frozen table header inside scrollable div

【讨论】:

【参考方案2】:
<table style="width: 300px" cellpadding="0" cellspacing="0">
<tr>
  <td>Column 1</td>
  <td>Column 2</td>
</tr>
</table>

<div style="overflow: auto;height: 100px; width: 320px;">
  <table style="width: 300px;" cellpadding="0" cellspacing="0">
  <tr>
    <td>Value 1</td>
    <td>Value 2</td>
  </tr>
  <tr>
    <td>Value 1</td>
    <td>Value 2</td>
  </tr>
  <tr>
    <td>Value 1</td>
    <td>Value 2</td>
  </tr>
  <tr>
    <td>Value 1</td>
    <td>Value 2</td>
  </tr>
  <tr>
    <td>Value 1</td>
    <td>Value 2</td>
  </tr>
  <tr>
    <td>Value 1</td>
    <td>Value 2</td>
  </tr>
  </table>
</div>

这将创建一个固定的列标题,其下方有可滚动的表格。诀窍是将要滚动的表格嵌入标签中,并将溢出属性设置为自动。当内部表格的内容大于周围的高度时,这将强制浏览器显示滚动条。

如果要容纳滚动条,外部表格的宽度必须大于内部表格的宽度。这可能很难完全正确,因为某些用户可能已将其滚动条设置为比默认值更宽或更小。但是,如果有大约 20 到 30 像素的差异,您通常可以很好地显示滚动条。

CSS-Tricks 还谈到了使用 JavaScript 和 CSS 来帮助解决这个问题,以便您可以使用突出显示。这是article的链接。

【讨论】:

虽然这可行,但从可访问性的角度来看并不是很好。没有表头 (),即使有,它们也不会与相关列显式关联,因为该表分为两个表。 如果我手动定义每列的宽度,这实际上是正确的——正如 pmc 所说,从可访问性来看可能并不理想,但我见过的所有解决方案都是由 远远我的最爱,非常感谢! 如果你的桌子挤得满满当当,这似乎不太对劲。 是的,我正在研究与此类似的解决方案,但我遇到了滚动条略微偏离标题的问题。 【参考方案3】:

如果您可以固定列宽,那就容易多了。如果你想让浏览器计算出宽度,那就更难了。基本上,让表格在 div 中滚动(高度,溢出:自动),并将该 div 放在 position:relative div 中。在外层div中,有另一个div position:absolute,overflow:hidden,height:不管header高度是多少,设置这个div的innerHTML为inner div的innerHTML;这是一个演示页面。有很多陷阱,但它是可行的......

<html>
<head></head>
<body onload="doit();">
<div id="outer" style="position:relative;">
  <div id="inner" style="height:100px; overflow:auto;">
    <script>
       var html = '<table><tr><th>Heading 1</th><th>Heading 2</th></tr>';
       var width = Math.floor(Math.random() * 100);
       var d = '';
       for(var i = 0; i < width; i++)d += 'a';
       for(var i = 0; i < 100; i++)
          html += '<tr><td>' + d + '</td><td>some more data</td>';
       
       html += '</table>';
       document.write(html);
    </script>
  </div>
  <div id="secondWrapper" style="position:absolute; background:#fff; left:0; top:0; height:25px; overflow:hidden;"></div>
</div>

<script>
function doit()
  var inner = document.getElementById('inner');
  var secondWrapper = document.getElementById('secondWrapper');
  secondWrapper.innerHTML = inner.innerHTML; 

</script>
</body>
</html>

请注意,当您刷新并且数据大小发生变化时,标题完全匹配。这才是真正的诀窍。

【讨论】:

我完全不明白它是如何工作的,所以它一定是黑魔法。更严重的是,我不得不摆弄我的 TH 标签的高度和 secondWrapper 的高度才能让它工作。如果表格的最大宽度为 98% 左右,它似乎也会更好地工作,以防止表格和滚动条相互碰撞。无论如何,你是怎么想到/从哪里得到这个的?真的很聪明。 其他人注意:如果您有一个带有可编辑元素的表格,则此方法会复制表格并因此复制元素。您已收到警告。 有一大堆的陷阱。在使用这个之后,我认为它不够稳定,无法在任何生产代码中使用。不过,现在改变我对这个答案的赞成票已经太晚了,这太糟糕了。【参考方案4】:

我认为解决方案是为 tbody 设置显式高度并将溢出设置为自动或滚动。不幸的是,正如您所发现的,表格和 CSS 是一个棘手的组合,IE 喜欢在它上面窒息。

【讨论】:

【参考方案5】:

这个怎么样:

<table style="width: 400px;"> 
<thead><tr> <th> head </th> </tr>
</thead>
<tbody style="height: 100px; overflow-y: auto; overflow-x: hidden;">
<tr> <th> .. </th> </tr>
</tbody>
</table>

【讨论】:

一个好主意,但它不起作用:jsfiddle.net/f22uoxqb【参考方案6】:

Sitepoint 上也有一个关于这类事情的测验,适合那些寻找非 JS 解决方案的人。但是我发现如果单元格的内容不够宽,表格页脚对于阻止表格标题折叠它们的宽度是必要的。我最终将 tfoot 隐藏在我使用它的应用程序中。 它是纯 HTML/CSS,可在 IE6 和现代浏览器中运行。不过,标题有一些样式限制。

【讨论】:

以上是关于表格 - 固定标题、可滚动正文、最强大/最简单的解决方案? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

水平和垂直可滚动的大表格

创建带有可滚动标题的表格

具有固定列和标题的可滚动表格,带有现代 CSS

滚动时修复表格标题

固定可滚动正文和标题的 Bootstrap 4 表

滚动期间表头需要保持固定[重复]