【问题标题】:How to make Scrollable Table with fixed headers using CSS [duplicate]如何使用 CSS 制作带有固定标题的可滚动表 [重复]
【发布时间】:2013-11-02 18:18:33
【问题描述】:

我想固定我的表格的标题。表格存在于可滚动的 div 中。请在此处查看我的代码:http://jsfiddle.net/w7Mm8/114/ 请建议我解决此问题。

谢谢

我的代码:

<div style="position: absolute; height: 200px; overflow: auto; ">
    <div style="height: 250px;">
        <table border="1">
            <th>head1</th>
            <th>head2</th>
            <th>head3</th>
            <th>head4</th>
            <tr>
                <td>row 1, cell 1</td>
                <td>row 1, cell 2</td>
                <td>row 1, cell 2</td>
                <td>row 1, cell 2</td>
            </tr>
            <tr>
                <td>row 2, cell 1</td>
                <td>row 2, cell 2</td>
                <td>row 1, cell 2</td>
                <td>row 1, cell 2</td>
            </tr>
        </table>
    </div>
</div>

【问题讨论】:

  • 现代的方法是使用粘性标题,例如thead {position: -webkit-sticky; position: sticky; top: 0px; z-index: 100;}
  • @MikePoole webkit-sticky 做什么?
  • @tommy.carstensen webkit-sticky 与 Safari 中的 sticky 相同。

标签: html css html-table


【解决方案1】:

我能想到一个厚颜无耻的方法,我认为这不是最好的选择,但它会奏效。

将标题创建为单独的表,然后将另一个放在 div 中并设置最大大小,然后使用 overflow 允许滚动进入。

table {
  width: 500px;
}

.scroll {
  max-height: 60px;
  overflow: auto;
}
<table border="1">
  <tr>
  <th>head1</th>
  <th>head2</th>
  <th>head3</th>
  <th>head4</th>
  </tr>
</table>
<div class="scroll">
  <table>
    <tr><td>Text Text</td><td>Text Text</td><td>Text Text</td><td>Text Text</td></tr>
    <tr><td>Text Text</td><td>Text Text</td><td>Text Text</td><td>Text Text</td></tr>
    <tr><td>Text Text</td><td>Text Text</td><td>Text Text</td><td>Text Text</td></tr>
    <tr><td>Text Text</td><td>Text Text</td><td>Text Text</td><td>Text Text</td></tr>
    <tr><td>Text Text</td><td>Text Text</td><td>Text Text</td><td>Text Text</td></tr>
    <tr><td>Text Text</td><td>Text Text</td><td>Text Text</td><td>Text Text</td></tr>
    <tr><td>More Text</td><td>More Text</td><td>More Text</td><td>More Text</td></tr>
    <tr><td>Text Text</td><td>Text Text</td><td>Text Text</td><td>Text Text</td></tr>
    <tr><td>Even More Text Text</td><td>Even More Text Text</td><td>Even More Text Text</td><td>Even More Text Text</td></tr>
  </table>
</div>

【讨论】:

  • 这仅适用于表格具有固定宽度和固定列大小的情况;如果不是这种情况,如何正确地将标题与表格列对齐?
  • 你不能。即使使用 javascript 设置列宽,有时计算可能会相差 1 个像素。
【解决方案2】:

您要做的是将表格的内容与表格的标题分开。 您只想滚动 &lt;th&gt; 元素。 您可以使用&lt;tbody&gt;&lt;thead&gt; 元素在HTML 中轻松定义这种分隔。
现在表格的标题和主体仍然相互连接,它们仍然具有相同的宽度(和相同的滚动属性)。现在要让它们不再像表格一样“工作”,您可以设置display: block。这样&lt;thead&gt;&lt;tbody&gt; 就分开了。

table tbody, table thead
{
    display: block;
}

现在您可以将滚动设置到表格的主体:

table tbody 
{
   overflow: auto;
   height: 100px;
}

最后,因为&lt;thead&gt; 不再与正文共享相同的宽度,您应该为表格的标题设置一个静态宽度:

th
{
    width: 72px;
}

您还应该为&lt;td&gt; 设置一个静态宽度。这解决了未对齐列的问题。

td
{
    width: 72px;
}


请注意,您还缺少一些 HTML 元素。每一行都应该在一个 &lt;tr&gt; 元素中,其中包括标题行:
<tr>
     <th>head1</th>
     <th>head2</th>
     <th>head3</th>
     <th>head4</th>
</tr>

我希望这就是你的意思。

jsFiddle

附录

如果您想更好地控制列宽,让它们之间的宽度不同,当然要保持标题和正文列对齐,您可以使用以下示例:

    table th:nth-child(1), td:nth-child(1) { min-width: 50px;  max-width: 50px; }
    table th:nth-child(2), td:nth-child(2) { min-width: 100px; max-width: 100px; }
    table th:nth-child(3), td:nth-child(3) { min-width: 150px; max-width: 150px; }
    table th:nth-child(4), td:nth-child(4) { min-width: 200px; max-width: 200px; }

【讨论】:

  • 标题和正文单元格的宽度与此解决方案不一致。
  • 这在您的演示中也不起作用......即使添加额外的行,表格内容也不会滚动。是的,标题与正文不对齐。
  • 不错,但对我来说没用。如果我必须为标题和列定义固定宽度,则此解决方案对我的需求没有用。我希望表格动态适应它的内容和浏览器窗口的宽度。浏览器开发人员没有为这个问题发明更智能的解决方案吗?对我来说,很明显应该在相应的 TD 上显示 TH,而不是在任何其他地方。这是表头的意义!
  • 对我不起作用
  • @cprn 这会有些不同。您可以自己尝试并最终发布一个新问题。或者可能存在一个表插件?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-13
  • 2018-02-27
  • 1970-01-01
  • 2018-08-07
  • 1970-01-01
  • 2018-02-26
相关资源
最近更新 更多