【问题标题】:How to resize a container div to the total height of its children?如何将容器 div 的大小调整为其子项的总高度?
【发布时间】:2008-11-25 14:15:34
【问题描述】:

我有一个容器元素,我需要在其内容更改时调整它的大小。它包含 2 个绝对定位的 div,它们都可以改变高度。如果我没有指定容器的高度,那么容器之后的任何内容都会消失在内容之下。

目前我正在执行以下操作,但我很乐意找到一个不那么费力的替代方案:

(容器有 position:relative,#main 和 #sidebar 是 position:absolute,#sidebar 的内容没有指定定位)

css:

div#mapcontainer { position:relative; width:100%; height: 600px;  }
div#main { position:absolute; top: 0; left: 10px; width: 500px; height: 400px; }
div#sidebar { position:absolute; top:10px; right:10px; width: 155px; height: 405px;}

html:

<div id="container">
    <div id="main">variable height content here</div>
    <div id="sidebar">
       <div id="foo">...</div>
       <div id="bar">....</div>
       ...
    </div>
<div>

js:

fixHeights = function() {   
    var children_height = 0;  
    $('#sidebar'). children().each(function(){children_height += $(this).height();});
    $('#container').height(Math.max(children_height, $('#main').height()));
};

【问题讨论】:

    标签: javascript jquery dom


    【解决方案1】:

    这是一个非常奇怪的问题,因为 div 的高度始终是其子项的高度。

    您是否在容器 div 中浮动内容?当您浮动子内容时,包含 div 的行为不再相同。

    如果您的浮动内容超出了容器 div 的底部,请将以下 div 添加到容器 div 子级的最底部:

    <div style="clear:both;"></div>
    

    这将不允许孩子漂浮在它上面,从而迫使包含的 div 成为其最高孩子的高度...

    <div id="container">
      <div id="dynamic" style="float:left;width:100px;">dynamic content goes here</div>
      <div id="static" style="margin-left:104px;">Lots of static stuff here</div>
      <div style="clear:both;"></div>
    </div>
    

    好的,我不知道您为什么要按现在的方式进行定位,但我已经为一个看起来像桌面应用程序的网站做了类似的事情。我不相信除了使用 javascript 之外还有其他方法可以做到这一点。 Html 文档旨在流动,而不是僵化。如果您想放弃 javascript,则必须放弃定位样式并使用浮动和清除 div。它没有那么可怕......

    【讨论】:

    • 我更喜欢在 CSS 中执行此操作,而不是为了重置而向页面添加额外内容。
    • 对不起 - 我不够清楚,在我澄清之前被打断了。我添加了更多关于定位的信息
    【解决方案2】:

    如果你浮动容器 div "overflow: auto" 也可以神奇地工作,尤其是对于整个 IE hasLayout 崩溃

    【讨论】:

    • 谢谢。试过了,但没有用。我添加了定位信息以使问题更清晰。
    【解决方案3】:

    您没有指定,但我认为您遇到了浮动元素的问题,并且您希望它们所在的容器至少是最大浮动元素的大小。您应该尝试以下 CSS hack,它会强制浏览器将容器元素的大小重新渲染为浮动元素的大小:

    #wrapper:after {
        clear:both;
        content:".";
        display:block;
        height:0;
        visibility:hidden;
    }
    

    让我知道你想出了什么,如果这可行。取决于您的浏览器,还有许多其他黑客可以尝试。

    【讨论】:

    • 谢谢尼克。对不起,我没有更清楚。我添加了有关容器和内容定位的更多信息。 wrapper:after 没有解决我的问题。
    • 刚刚为我解决了这个问题。 :-)
    【解决方案4】:

    我会尝试更改 css 以不使用绝对定位。在 Firefox 中,您需要使用 cmets 中提到的包装技巧来使 mapcontainer 具有正确的高度。

    div#mapcontainer { clear:both;宽度:100%;最小高度:600px; }

    div#main { float:left;左边距:10px;宽度:500px;高度:400px; }

    div#sidebar { float:left;边距顶部:10px;边距右:10px;宽度:155px;高度:405px;}

    【讨论】:

      【解决方案5】:

      Overflow:visible; 那是票。 overflow:auto 将在需要时创建一个滚动条。

      【讨论】:

      • 虽然这通常是我解决它的方式,但截至今天,Google Chrome 正在打破这一点,为水平滚动条所在的位置垂直添加额外的填充,从而无缘无故地导致垂直滚动条。 (Chrome 10.0.648.151 [损坏],Firefox 4 [正确],Opera 11.01 [正确])
      猜你喜欢
      • 2012-04-02
      • 2010-12-25
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 2014-09-17
      • 2017-07-15
      • 2012-11-14
      • 2020-10-26
      相关资源
      最近更新 更多