12

具有动态生成的 HTML 表的 JSP 页面,其中行数未知。

在后端有属性,设置最大行数,例如:max_rows=15

如何将 HTML 表的行数限制为max_rows值?表格的其他部分应该可以通过垂直滚动访问,这意味着用户可以看到 15 行,如果向下滚动,它将看到表格的其他行。

可以通过计算行的平均高度并使用 div-wrapper 的 max-height 属性来凭经验完成,但我认为这种方法不是很稳定。

所以需要依赖行数。也许有这种情况的插件或者它是标准的 CSS 或 HTML 解决方案?

4

6 回答 6

10

这可以通过标准的 HTML、CSS 和一些 javascript 来完成。对于关闭 javascript 的客户端,它也可以优雅地降级。我的意思是,他们只会看到未经滚动条修改的原始表格。尝试这样的事情:

<html>
<head>
    <style type="text/css">
        table {
            width:  100%;
            border-collapse: collapse;
        }
        td {
            border: 1px solid black;
        }
        .scrollingTable {
            width: 30em;
            overflow-y: auto;
        }
    </style>
    <script type="text/javascript">
        function makeTableScroll() {
            // Constant retrieved from server-side via JSP
            var maxRows = 4;

            var table = document.getElementById('myTable');
            var wrapper = table.parentNode;
            var rowsInTable = table.rows.length;
            var height = 0;
            if (rowsInTable > maxRows) {
                for (var i = 0; i < maxRows; i++) {
                    height += table.rows[i].clientHeight;
                }
                wrapper.style.height = height + "px";
            }
        }
    </script>
</head>
<body onload="makeTableScroll();">
    <div class="scrollingTable">
        <table id="myTable">
            <tr>
                <td>blah blah</td>
                <td>blah blah</td>
                <td>blah blah</td>
                <td>blah blah</td>
            </tr>
            <tr>
                <td>Here is some long text that should wrap: blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah</td>
                <td>blah blah</td>
                <td>blah blah</td>
                <td>blah blah</td>
            </tr>
            <tr>
                <td>blah</td>
                <td>blah</td>
                <td>blah</td>
                <td>blah</td>
            </tr>
            <tr>
                <td>blah blah</td>
                <td>blah blah</td>
                <td>blah blah</td>
                <td>blah blah</td>
            </tr>
            <tr>
                <td>blah blah</td>
                <td>blah blah</td>
                <td>blah blah</td>
                <td>blah blah</td>
            </tr>
            <tr>
                <td>blah blah</td>
                <td>blah blah</td>
                <td>blah blah</td>
                <td>blah blah</td>
            </tr>
            <tr>
                <td>blah</td>
                <td>blah</td>
                <td>blah</td>
                <td>blah</td>
            </tr>
        </table>
    </div>
</body>
</html>

这在 Firefox、Chrome 和 IE 7 中进行了测试,但它应该适用于所有现代浏览器。请注意,每行的内容有多高或每个单元格有多少填充都无关紧要。如果您不想在表格上使用border-collapse:collapse,那么您必须在for 循环中添加代码以考虑单元格间距。

如果你有更粗的边框,那么用这个替换javascript函数:

function makeTableScroll() {
    // Constant retrieved from server-side via JSP
    var maxRows = 4;

    var table = document.getElementById('myTable');
    var wrapper = table.parentNode;
    var rowsInTable = table.rows.length;
    try {
        var border = getComputedStyle(table.rows[0].cells[0], '').getPropertyValue('border-top-width');
        border = border.replace('px', '') * 1;
    } catch (e) {
        var border = table.rows[0].cells[0].currentStyle.borderWidth;
        border = (border.replace('px', '') * 1) / 2;
    }
    var height = 0;
    if (rowsInTable > maxRows) {
        for (var i = 0; i < maxRows; i++) {
            height += table.rows[i].clientHeight + border;
        }
        wrapper.style.height = height + "px";
    }
}

其中的 try/catch 处理了 IE 和其他浏览器之间的差异。catch 中的代码是针对 IE 的。

于 2010-01-23T18:37:43.563 回答
5

编辑:这实际上并没有解决提出的问题。我错过了问题中用户需要能够滚动才能查看其余行的部分。哎呀。 所以,我想js实际上是需要的。


这实际上可以在没有 javascript 的情况下完成。诀窍是使用nth-child(x)

table {
    border-collapse: collapse;
}

tr:nth-child(n + 4) {
    visibility: hidden;
}

需要边框折叠,以便边框不会超出隐藏行。

这是小提琴

于 2015-03-07T20:14:31.130 回答
3

将您的表格放在一个 div 块中,并使用 CSS 指定 div 的高度和溢出属性。

<style type="text/css">
.table_outer { height: 15em; overflow: auto; }
</style>

<div class="table_outer">
  <table>
     ...table content...
  </table>
</div>

这样 div 有一个固定的高度,当 div 块的内容太高时,浏览器会添加一个滚动条。

我将高度设置为 15em,对应于 15 * font-height。当使用边框、填充和其他东西时,这个高度是不正确的。但它可以为您的设计更正确地计算(以 px 为单位)。

于 2010-01-22T13:57:06.600 回答
1

仅使用 CSS 和 HTML 是无法做到这一点的,您也需要 javascript。获取前 15 行的高度,并将包装 div 的高度限制为该高度。在 div 上设置 overflow: auto 以获取滚动条。

如果关闭 javascript,请不要忘记在 div 上设置默认高度作为后备。

于 2010-01-22T16:35:59.240 回答
0

试试这个:

table > tbody > tr:nth-child(n+15) {
    display:none;
}
于 2020-11-10T19:20:58.897 回答
-1

您可以使用以下slice功能:

$('table tbody > tr').slice(1,5).hide();
于 2017-10-11T20:21:28.170 回答