高度为100%且溢出的元素

J0H*_*0HN 5 html css overflow

我基本上需要实现的是有一个元素(div,span,table,等等)消耗100%的'父高度',如果内容更高则显示滚动.

问题是,只有奇怪的铬和IE可以正常工作height:100%; overflow: auto;.标准中的Firefox,Opera和IE(任何IE 7+,任何"标准")都会忽略溢出并将html元素拉伸到父级大小以下.如果我设置固定高度它可以工作,但我无法确定渲染前的可用高度,有多个可能的值.

简化示例(jsFiddle为此):

<body>
    <div id="parent">
        <table id='container'>
            <tr>
                <td>
                    <div id='element-in-question'>
                        <!--Content long enough to stretch the div-->
                    </div>
                </td>
            </tr>
            <tr>
            <td id='footer-cell'>
                <div id='footer'>I'm footer<div>
            </td>
            </tr>
        </table>
    </div>
</body>
Run Code Online (Sandbox Code Playgroud)

CSS:

#parent { height:500px; width:500px; position:absolute; }
#container { height: 100%; width:100%; }
#element-in-question { height:100%; width:100%; overflow: auto; }
#footer-cell { height:30px;}
#footer { height: 30px; }
Run Code Online (Sandbox Code Playgroud)

在真正的应用程序中,所有这些东西都在iframe中运行,表用于呈现页眉和页脚等等.请不要建议停止使用表格,它是100多个需要注意的地方的遗留应用程序.CSS唯一的解决方案将是理想的.

还有一点:它应该适用于Chrome,IE10标准模式.不支持FF,Opera和Safari,IE9及以下版本的处理方式不同.

更新:大约有十个不同高度的页脚,理想情况下解决方案不应该依赖于固定的页脚高度.

Jos*_*ess 5

干得好:

更新了小提琴。

问题是它将height: 100%;填充下一个定义的容器。无论出于何种原因,表都不被视为用于此目的的有效容器。因此,我们需要做的是利用表格布局的一些奇特之处。

position: absolute;
top:5px; left:5px;
right: 5px;
bottom: 40px;
overflow: auto;
border: 1px solid green;
background-color: #eee;
Run Code Online (Sandbox Code Playgroud)

无需在 上进行相对定位td。别问我为什么,也许比我更有见识的人可以插话。

无论如何,这样我们就可以强制它扩展以填充一定量的空间,同时仍然允许:

  1. 页脚可见。
  2. 存在的填充(即使它在技术上不是填充。)
  3. 该解决方案适用于跨浏览器环境。

真心希望这会有所帮助;如果没有,我很乐意再试一次。


更新

你说 javascript 不是你想要的方式,但这里有一个使用 jQuery 的简短解决方案,它实际上可以解决问题:

更新了小提琴

$('td > div').each(function() {
    var t = $(this);
    var text = t.html();
    t.hide();
    t.height(t.parent().height());
    t.show(text);
});
Run Code Online (Sandbox Code Playgroud)

为什么这有效:

在 100% 高度起作用之前,需要div其父级具有定义的高度,但这不是您的选择,因为您已经声明这都是动态内容。没问题。我们只需要 jQuery 将计算出的高度推送到div浏览器已经渲染出来的高度即可。很简单,对吧?

嗯,没那么快。Div 并不意味着受表格单元格的限制,至少在理想情况下是这样。我们已经在 中拥有了一个逻辑上的、独立的容器td,并且如果它已经有大量内容溢出了它的边界,那么它div并不太关心它的高度是多少。td当我们去查询该高度时td,无论它实际上是什么,它都会报告它比它包含的元素大。因此,如果您在注释掉我们清空 的行后查看小提琴div,您会发现td错误地将自身报告为几乎 900 像素高。

那么我们该怎么办?

好吧,我们将这些内容从div. 现在它只是一个外壳,而且在任何情况下它都会比它的容器小。这意味着当我们查询它时,它td不会谎报它的大小,因为它自信地包含它的子项。

一旦我们从 TD 得到真相,我们就告诉 TDdiv其父级报告的大小就是它需要的大小,并将其返回给它的内容。

瞧。现在你已经有了一个真正尊重其父级的div对象。要是真正的孩子也这么容易就好了。