7

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

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

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

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

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

4

2 回答 2

14

好,我知道了:

您需要将表格包装在两个 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.

像这样的东西应该工作:

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 当然这会容易得多,但现在我不允许为这个项目使用第三方库。

于 2012-08-04T09:56:06.900 回答
-1

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

<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的最简单的方法。你不这么认为吗?

于 2014-03-27T04:44:16.953 回答