【问题标题】:How to: Fixed Table Header with ONE table (no jQuery)如何:用一张表固定表头(无 jQuery)
【发布时间】:2012-07-16 07:40:04
【问题描述】:

我知道,在 stackoverflow 上至少有 3 打这样的问题,但我仍然无法做到这一点:

一个简单的表格,其中thead 粘贴/固定在顶部,tbody 滚动。 过去几天我尝试了很多,现在我最终在这里哭求帮助。

解决方案应该适用于 IE8+ 和最新的 FF、Chrome 和 Safari。 与this one 等其他“可能的重复项”的不同之处在于,我想使用两个嵌套表或 jQuery(虽然纯 JavaScript 很好)。

我想要的演示:
http://www.imaputz.com/cssStuff/bigFourVersion.html.

问题是它在IE中不起作用,我可以使用一些JS。

【问题讨论】:

  • 这与这里的技术讨论无关,但 AFAICT 这个imaputz.com/cssStuff/bigFourVersion.html 可以在 IE10 上运行(可能早期版本已经崩溃)。
  • 您确定this 在IE 中不适合您吗?哪个IE?链接页面说它应该在 IE6+ 中工作。
  • @MattKantor 它在 IE8 中不起作用(在 IE8 模式下使用 IE10 测试)。
  • @Garry 不是 - 正如我所提到的,我不想使用两个嵌套表

标签: sticky tableheader


【解决方案1】:

好的,我明白了:

您需要将表格包装在两个 DIV 中:

<div class="outerDIV">
  <div class="innerDIV">
    <table></table>
  </div>
</div>

DIV 的 CSS 如下:

.outerDIV {
  position: relative;
  padding-top: 20px;   //height of your thead
}
.innerDIV {
  overflow-y: auto;
  height: 200px;       //the actual scrolling container
}

原因是,您基本上使内部 DIV 可滚动,然后通过将 THEAD 粘到外部 DIV 上将其拉出。

现在将thead 粘贴到outerDIV 上

table thead {
  display: block;
  position: absolute;
  top: 0;
  left: 0;
}

tbody 也需要有display: block

现在您会注意到滚动有效,但宽度完全混乱。那是Javascript进来的。 您可以自行选择分配方式。我自己给表格中的 TH 提供了固定宽度,并构建了一个简单的脚本,该脚本采用宽度并将它们分配给tbody 中的第一个 TD 行。

这样的事情应该可以工作:

function scrollingTableSetThWidth(tableId)
{
    var table = document.getElementById(tableId);

    ths = table.getElementsByTagName('th');
    tds = table.getElementsByTagName('td');

    if(ths.length > 0) {
        for(i=0; i < ths.length; i++) {
            tds[i].style.width = getCurrentComputedStyle(ths[i], 'width');
        }
    }
}

function getCurrentComputedStyle(element, attribute)
{
    var attributeValue;
    if (window.getComputedStyle) 
    { // class A browsers
        var styledeclaration = document.defaultView.getComputedStyle(element, null);
        attributeValue = styledeclaration.getPropertyValue(attribute);
    } else if (element.currentStyle) { // IE
        attributeValue = element.currentStyle[vclToCamelCases(attribute)];
    }
    return attributeValue;
}

当然,使用 jQuery 会容易得多,但目前我不允许在这个项目中使用第三方库。

【讨论】:

  • 应该是 - 取 tbody 宽度中的第一个 TD 行并将其分配给 th 宽度,反之亦然。 ths[i].style.width = getCurrentComputedStyle(tds[i], 'width');
  • 当然你可以反过来做。在这个特定的用例中,我必须这样做,因为用户之前定义了 TH 的宽度(动态创建的表),它定义了整个表的宽度
  • 好的,听起来像是不同的用例,因此处理方式不同。
  • 对不起,第二个功能我没看懂?我该怎么办?
  • 只需在某处插入第二个函数。它由第一个函数调用。它将计算给定元素的 CSS 样式(当然,使用 jQuery 等更容易)。
【解决方案2】:

也许我们应该改变一种方法来实现这个目标。例如:

<div><ul><li>1</li><li>2</li></ul></div> //make it fixed
<table>
    <thead>
        <tr><th>1</th><th>2</th></tr>
    </thead>
    <tfoot></tfoot>
    <tbody></tbody>
</table>

当然,这对语义不好。但它是没有js或jq的最简单的方法。 你不这么认为吗?

【讨论】:

  • 不,我不知道。您的 div 不需要修复。它不是滚动表主体的一部分。与表格单元格宽度相比,宽度也是完全错误的。您的答案与下面的甘道夫相同,并且不起作用。没有 JS,这是不可能的。
  • 你确定吗?给我你的电子邮件,我会把我的例子发给你。
  • 如果你的 talbe 在视口的顶部,我的解决方案会很好。如果没有,则在开始时使该 div 的显示为无,并在 talbe 滑到顶部时使其阻塞,并在无法看到 talbe 时再次使其变为无。当然要使用一些js。
  • 是的,没错。现在你可以去jsfiddle.net/JChen___/3fUFV 看看我的例子。
  • 太棒了。首先,您的解决方案在真实网站中使用时会与其他内容、文本、元素,当然还有很多这样的表格分开。第二:您的解决方案不灵活。 5 个具有不同行数和内容的表,它会分开。您必须为每个表格单独指定宽度,这不是可接受的解决方案。现在取 100 个服务器生成的表。您不能将您的解决方案用于动态和灵活的布局/内容/框架。
猜你喜欢
  • 2017-11-09
  • 1970-01-01
  • 2020-08-20
  • 1970-01-01
  • 2017-12-22
  • 2019-12-11
  • 1970-01-01
  • 1970-01-01
  • 2014-08-25
相关资源
最近更新 更多