带有固定标题的 HTML 表格?

IT技术 javascript css html-table
2021-01-21 04:40:23

是否有跨浏览器的 CSS/JavaScript 技术来显示长 HTML 表格,以便列标题固定在屏幕上并且不随表格主体滚动。想想 Microsoft Excel 中的“冻结窗格”效果。

我希望能够滚动浏览表格的内容,但始终能够看到顶部的列标题。

6个回答

这可以用四行代码干净地解决。

如果您只关心现代浏览器,则可以通过使用 CSS 转换更轻松地实现固定标头。听起来很奇怪,但效果很好:

  • HTML 和 CSS 保持原样。
  • 没有外部 JavaScript 依赖项。
  • 四行代码。
  • 适用于所有配置(表格布局:固定等)。
document.getElementById("wrap").addEventListener("scroll", function(){
   var translate = "translate(0,"+this.scrollTop+"px)";
   this.querySelector("thead").style.transform = translate;
});

除了 Internet Explorer 8- 之外,对 CSS 转换的支持是广泛可用的

以下是完整示例供参考:

@ user5249203我知道你问了几个一个月前,但我有同样的问题,这是由于边界崩溃:看到这一点:stackoverflow.com/questions/33777751/...
2021-03-16 04:40:23
这在任何版本的 IE 或 Edge 中都不起作用。这是一个基于@redhead的评论jsfiddle.net/n6o8ocwb/2 的版本
2021-03-30 04:40:23
@AlexAlexeev,您的解决方案很棒。谢谢你。我注意到,生成的固定标题没有区分列的边界线。默认的 CSS 样式丢失。即使我包含了这个......$(this).addClass('border')改变了表格的其余部分,我在边框类中传递的字体、大小、颜色。但是,不会向固定标题添加行。感谢有关如何解决此问题的任何意见
2021-03-31 04:40:23
我不得不说,尽管我之前发表过评论,但这是我见过的最接近完美解决方案的事情。甚至水平滚动也是完美的(比我自己的解决方案更好)。这是一个带有边框的示例(您不能使用边框折叠)和一个粘在表格而不是容器上的滚动条:jsfiddle
2021-04-02 04:40:23
发现,它有效,但必须将转换应用于 th / td,而不是 thead。
2021-04-09 04:40:23

我为此寻找了一段时间的解决方案,发现大多数答案都不起作用或不适合我的情况,所以我用 jQuery 编写了一个简单的解决方案。

这是解决方案大纲:

  1. 克隆需要固定标题的表,并将克隆的副本放在原始表的顶部。
  2. 从顶部桌子上取下桌子主体。
  3. 从底部表格中删除表格标题。
  4. 调整列宽。(我们跟踪原始列宽)

以下是可运行演示中的代码。

function scrolify(tblAsJQueryObject, height) {
  var oTbl = tblAsJQueryObject;

  // for very large tables you can remove the four lines below
  // and wrap the table with <div> in the mark-up and assign
  // height and overflow property  
  var oTblDiv = $("<div/>");
  oTblDiv.css('height', height);
  oTblDiv.css('overflow', 'scroll');
  oTbl.wrap(oTblDiv);

  // save original width
  oTbl.attr("data-item-original-width", oTbl.width());
  oTbl.find('thead tr td').each(function() {
    $(this).attr("data-item-original-width", $(this).width());
  });
  oTbl.find('tbody tr:eq(0) td').each(function() {
    $(this).attr("data-item-original-width", $(this).width());
  });


  // clone the original table
  var newTbl = oTbl.clone();

  // remove table header from original table
  oTbl.find('thead tr').remove();
  // remove table body from new table
  newTbl.find('tbody tr').remove();

  oTbl.parent().parent().prepend(newTbl);
  newTbl.wrap("<div/>");

  // replace ORIGINAL COLUMN width				
  newTbl.width(newTbl.attr('data-item-original-width'));
  newTbl.find('thead tr td').each(function() {
    $(this).width($(this).attr("data-item-original-width"));
  });
  oTbl.width(oTbl.attr('data-item-original-width'));
  oTbl.find('tbody tr:eq(0) td').each(function() {
    $(this).width($(this).attr("data-item-original-width"));
  });
}

$(document).ready(function() {
  scrolify($('#tblNeedsScrolling'), 160); // 160 is height
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>

<div style="width:300px;border:6px green solid;">
  <table border="1" width="100%" id="tblNeedsScrolling">
    <thead>
      <tr><th>Header 1</th><th>Header 2</th></tr>
    </thead>
    <tbody>
      <tr><td>row 1, cell 1</td><td>row 1, cell 2</td></tr>
      <tr><td>row 2, cell 1</td><td>row 2, cell 2</td></tr>
      <tr><td>row 3, cell 1</td><td>row 3, cell 2</td></tr>
      <tr><td>row 4, cell 1</td><td>row 4, cell 2</td></tr>			
      <tr><td>row 5, cell 1</td><td>row 5, cell 2</td></tr>
      <tr><td>row 6, cell 1</td><td>row 6, cell 2</td></tr>
      <tr><td>row 7, cell 1</td><td>row 7, cell 2</td></tr>
      <tr><td>row 8, cell 1</td><td>row 8, cell 2</td></tr>			
    </tbody>
  </table>
</div>

此解决方案适用于 Chrome 和 IE。由于它基于 jQuery,因此这也应该适用于其他支持 jQuery 的浏览器。

@tetra td { 最大宽度:30px;这将允许开发人员控制行的显示方式。
2021-03-15 04:40:23
不幸的是,如果您需要列的像素完美对齐,这不起作用:jsbin.com/elekiq/1源代码)。您可以看到一些标题从它们应该在的位置稍微偏移了一点。如果您使用背景,效果会更加明显:jsbin.com/elekiq/2源代码)。(我按照同样的方式工作,在我的代码中遇到了这个,找到了你的并想“哦,我想知道他是否为我解决了这个问题!”可悲的是没有。:-))浏览器想要控制单元格的宽度...
2021-03-16 04:40:23
但是如果某些标题单元格中的内容比 td 单元格中的内容长怎么办?我在 IE7 中尝试过,width() 破坏了一切。IE8 和 IE9 工作正常,但...
2021-03-20 04:40:23
当内容大于宽度时,我们如何解决问题?
2021-03-21 04:40:23
这似乎不适用于水平滚动 - 它创建标题,但它超出了可滚动区域(可见)并且不随内容滚动。
2021-04-05 04:40:23

我刚刚完成了一个 jQuery 插件的组合,该插件将使用有效的 HTML 获取有效的单个表(必须有一个 thead 和 tbody),并将输出一个具有固定页眉的表,可选的固定页脚可以是克隆页眉或任何您选择的内容(分页等)。如果您想利用更大的显示器,它也会在调整浏览器大小时调整表格的大小。另一个新增功能是如果表格列无法全部显示在视图中,则能够横向滚动。

http://fixedheadertable.com/

在 github 上:http : //markmalek.github.com/Fixed-Header-Table/

它非常容易设置,您可以为其创建自己的自定义样式。它还在所有浏览器中使用圆角。请记住,我刚刚发布了它,所以它在技术上仍然是测试版,我要解决的小问题很少。

它适用于 Internet Explorer 7、Internet Explorer 8、Safari、Firefox 和 Chrome。

这次真是万分感谢。我知道这个问题已经有一年多了,但即使冒着搅动沉淀的淤泥的风险,我还是想告诉你,你的工作受到赞赏
2021-03-13 04:40:23
最新版本在 IE6 中不起作用。我不再支持 IE6。
2021-03-26 04:40:23
谢谢!我将在今天晚些时候下班回家时添加一个新版本。这是我的博客条目的链接,其中包含我正在添加的内容:fixedheadertable.mmalek.com/2009/10/07/...
2021-03-30 04:40:23
在您的演示中,ie6 中的宽度是关闭的 :-( 表格标题和正文未对齐。
2021-04-06 04:40:23
伟大的工作马克 - 不幸的是,移动设备(iPad,Android 平板电脑)中固定标题和列的滚动存在一些问题 - 当我滚动内容时,这些固定部分不会滚动 - 当我停止滚动并点击表格时,固定部件“跳”到适当的位置 - 有没有简单的方法来解决这个问题?
2021-04-08 04:40:23

我还创建了一个插件来解决这个问题。我的项目 - jQuery.floatThead已经存在 4 年多了,并且非常成熟。

它不需要外部样式,也不希望您的表格以任何特定方式进行样式设置。它支持 Internet Explorer9+ 和 Firefox/Chrome。

目前(2018-05)它有:

GitHub 上的 405 次提交和 998 颗星


这里的许多(不是全部)答案都是快速技巧,可能已经解决了一个人遇到的问题,但并非对每张桌子都有效。

其他一些插件很旧,可能在 Internet Explorer 上运行良好,但在 Firefox 和 Chrome 上会失效。

谢谢你。我很高兴地报告说,此时该项目每 4 个月就会收到大约 1 个错误报告。我没有做很多破坏性的改变。它非常坚固且有效。
2021-03-16 04:40:23
安德鲁,我该怎么处理你的评论?当然,该插件有效,因为它在我自己的文档站点和大量其他站点上使用。
2021-03-22 04:40:23
伟大的。非常感谢。该插件在 Firefox 45.2、Chromium 51 和 IE 11 中运行良好。此外,它不会干扰在同一页面上构建的大量 JS 和 jQuery 代码。
2021-04-02 04:40:23
很棒的插件,支持嵌套表和偏移量。
2021-04-09 04:40:23

所有在 CSS 规范之外解决这个问题的尝试都是我们真正想要的东西的苍白阴影:交付 THEAD 的隐含Promise。

长期以来,这个冻结的表头问题一直是 HTML/CSS 中的一个开放性伤口。

在一个完美的世界里,这个问题会有一个纯 CSS 解决方案。不幸的是,似乎没有一个好的地方。

关于该主题的相关标准讨论包括:

更新:Firefox 发布position:sticky的第 32 版。每个人都赢了!

以同样的方式处理柱子会很棒
2021-03-14 04:40:23
@DanielWaltrip 所有浏览器?stackoverflow.com/a/37646284/3640407 MSIE 仍然比 Edge 多
2021-03-17 04:40:23
这现在适用于所有浏览器:thead th { position: sticky; top: 0; }. 我们可以更新此答案以清楚说明这一点吗?
2021-04-04 04:40:23
关于。Firefox 和 position:sticky,它不适用于表头:bugzilla.mozilla.org/show_bug.cgi ? id=925259#c8 ... 该错误的补丁明确指出:“我们目前不支持相对定位内部表格元素,因此我们也将它们从粘性定位中排除。”
2021-04-05 04:40:23
有道理。根据caniuse.com/#search=position%3Asticky,全球 86% 的网络用户都支持它
2021-04-08 04:40:23