【问题标题】:Sticky Table Header with 100% height "panes"具有 100% 高度“窗格”的粘性表格标题
【发布时间】:2013-10-19 00:26:09
【问题描述】:

背景: 我正在使用 CSS 创建一个类似体验的 Web 应用程序,页面上的所有内容始终可见,并且只有某些 panes 是可滚动的。我现在需要将其扩展到表格。我希望表头始终保持可见(有时是页脚),但表体应该只能滚动。

到目前为止,我所做的是将“窗格”类应用于theadtfoot,然后使tbody 自动填充高度,然后使其可滚动。除了 thead、tbody 和 tfoot 不再是 100% 宽度之外,所有这些都有效。这种方法似乎让我最接近我想要的。

小提琴: 我有一个让我接近的 JSFiddle,它还演示了我用来创建固定和可滚动的 panes 的代码。 http://jsfiddle.net/va4HF/1/

要求:理想情况下,我希望保持我的pane css 不变,但在需要表格时进行调整。我也想只保留这个 CSS。

以下代码是我的概念验证代码,也包括窗格 CSS。

HTML:

<div class="column">
    <div class="pane top">Top</div>
    <div class="pane middle">
        <table>
            <thead class="pane table-head">
                <tr>
                    <th>Header</th>
                </tr>
            </thead>
            <tbody class="pane table-body fill">
                <tr><td>Text</td></tr>
                <tr><td>Text</td></tr>
                <tr><td>Text</td></tr>
                <tr><td>Text</td></tr>
                <tr><td>Text</td></tr>
                <tr><td>Text</td></tr>
                <tr><td>Text</td></tr>
                <tr><td>Text</td></tr>
                <tr><td>Text</td></tr>
                <tr><td>Text</td></tr>
                <tr><td>Text</td></tr>
                <tr><td>Text</td></tr>
                <tr><td>Text</td></tr>
                <tr><td>Text</td></tr>
                <tr><td>Text</td></tr>
            </tbody>
            <tfoot class="pane table-foot">
                <tr>
                    <th>Footer</th>
                </tr>
            </tfoot>
        </table>
    </div>
    <div class="pane bottom">Bottom</div>
</div>

CSS:

body, html {
    height:100%;
    margin:0;
    padding:0;
}
div {
    box-sizing:border-box;
    box-sizing:content-box\9; /* Fix for IE9 sizing */
    -moz-box-sizing:border-box; /* Fix for firefox sizing */
}
.column {
    position:absolute;
    width:100%;
    min-height:100%;
    height:auto;
    overflow:hidden;
}
.pane {
    position:absolute;
    width:100%;
    overflow:hidden;
}
.fill {
    height:auto;
    overflow:auto;
}
.top {
    background:pink;
    height: 20%;
    top:0;
}
.middle {
    background:red;
    top:20%;
    bottom:50px;
}
.table-head {
    height: 40px;
    top:0;
}
.table-body {
    top:40px;
    bottom:40px;
}
.table-foot {
    height: 40px;
    bottom:0;
}
.bottom {
    background:orange;
    height: 50px;
    bottom:0;
}
table thead tr, table tfoot tr {background:rgba(0,0,0,0.5);}
table tbody tr {background:rgba(0,0,0,0.3);}
table td, table th {padding:10px; color:#fff;}

/* Fix for Safari scrollbars (also styles Chrome scrollbars) */
    .fill::-webkit-scrollbar {-webkit-appearance: none;width: 10px;}
    .fill::-webkit-scrollbar-track {background-color: rgba(0,0,0, .3);border-radius: 0px;}
    .fill::-webkit-scrollbar-thumb {border-radius: 0px; background-color: rgba(255,255,255, .4);} 

研究: 其他人在Table that Fills 100% Parent Height with Fixed Header/Footer 提出了类似的问题,但没有得到很好的回应,最终使用了 Javascript,但我想尝试找到一个 CSS 解决方案。或者至少比他使用的更简单的 Javascript 解决方案(避免覆盖三个表)

【问题讨论】:

    标签: html css html-table


    【解决方案1】:

    经过大量研究以找出我的所有选项后,我选择为页眉、正文和页脚使用单独的表格,并用 div 围绕每个表格。然后我将该 div 设置为“窗格”。只要header表和body表中的列设置为等宽,就会排成一行。

    我必须做一些清理工作,其中一个导致需要保持垂直滚动条始终显示,然后在页眉和页脚表中添加边距,以便如果正文开始滚动,页眉总会排队的。

    应该是这样的:

        <div class="pane table-head">
            <table>
                <thead class="">
                    <tr>
                        <th>Header</th>
                    </tr>
                </thead>
            </table>
        </div>
        <div class="pane table-body fill">
            <table>
                <tbody>
                    <tr><td>Text</td></tr>
                    <tr><td>Text</td></tr>
                    ...
                </tbody>
            </table>
        </div>
        <div class="pane table-foot">
            <table>
                <tfoot>
                    <tr>
                        <th>Footer</th>
                    </tr>
                </tfoot>
            </table>
        </div>
    

    查看更新的 JSFiddle:http://jsfiddle.net/bluecaret/va4HF/5/

    这仍然不是一个理想的解决方案,我可能最终会放弃它并使用 Fabio 的基于 div 的表的解决方案,尽管根据一些测试我也可以看到潜在的问题。现在这就是我要坚持的。

    【讨论】:

      【解决方案2】:

      嗯,第一个问题是你为什么要使用表格,但以防万一:

      table, th{width:100% !important; min-width:240px; }
      

      其中 min-width 是表格的最小宽度

      再一次,你真的应该使用 div:更少,更简单的标记,没有这样的问题

      【讨论】:

      • 我正在使用表格,因为我有需要插入的表格数据。如果您查看小提琴,我将在其余窗格中使用 div。谢谢,但这仍然行不通。刚刚将th 设为最小宽度,而 tbody 仍然很短
      • 啊,然后您将 tbody(和/或 tr 或 td,如果需要)添加到声明中,以为它只是 th。此外,表格数据根本不需要表格,您可以使用 div 并应用“显示:表格”(请参阅​​ w3schools.com/cssref/pr_class_display.asp 的完整可能性)。我之所以提到这一点,是因为如果您需要使用响应式布局,它会挽救您的生命,相信我
      • 还是不行。它只会达到最小宽度大小并停止。我什至将所有表格元素添加到它和相同的东西。并且使 min-width 100% 也不起作用。请参阅更新的 jsfiddle:jsfiddle.net/bluecaret/va4HF/3 我会考虑将 Div 用于表格数据,但如果可能的话,我仍然更喜欢使用表格,这让我团队中的其他人更容易与不精通 CSS 的人一起工作。谢谢。
      • 您使用的代码与我给您的完全相同,请阅读以下内容:其中 min-width 是表格的最小宽度 所以如果您的表格将600px 宽度,你将添加 600px 最小宽度:我在你的小提琴上测试过它,就像一个魅力
      • 对不起,我的描述可能不太清楚。我需要表格为 100% 宽度,而不是设定的像素宽度。这意味着,如果在大型显示器上查看,表格应该被拉伸以填充宽度和高度,这可能使其成为 1000 像素,或者在较小的显示器上,600 像素。即使在较大的屏幕上,将最小宽度设置为 600 像素也会保持该尺寸。
      猜你喜欢
      • 2021-01-17
      • 2021-01-20
      • 1970-01-01
      • 1970-01-01
      • 2020-01-30
      • 1970-01-01
      • 2011-10-19
      • 1970-01-01
      • 2019-09-04
      相关资源
      最近更新 更多