【问题标题】:How can I expand floated child div's height to parent's height?如何将浮动子 div 的高度扩展到父级的高度?
【发布时间】:2011-06-15 19:56:11
【问题描述】:

我的页面结构为:

<div class="parent">
    <div class="child-left floatLeft">
    </div>

    <div class="child-right floatLeft">
    </div>
</div>

现在,child-left DIV 将包含更多内容,因此parent DIV 的高度会随着子 DIV 的增加而增加。

但问题是child-right 高度没有增加。我怎样才能使它的高度等于它的父级?

【问题讨论】:

    标签: html css layout


    【解决方案1】:

    父母有身高吗?如果你像这样设置父母的身高。

    div.parent { height: 300px };
    

    然后你可以像这样让孩子伸展到全高。

    div.child-right { height: 100% };
    

    编辑

    Here is how you would do it using JavaScript.

    【讨论】:

    • 父级没有固定高度。它正在按照子左侧的高度展开。
    • 啊,我也是这么想的,那么你需要一些 JavaScript,我会在稍后添加它。
    • @Olical JSFiddle 链接已损坏。删除它或更新答案。谢谢!
    • js 的链接现在给出 404
    【解决方案2】:

    我最近在我的网站上使用 jQuery 完成了这项工作。该代码计算最高 div 的高度,并将其他 div 设置为相同的高度。技巧如下:

    http://www.broken-links.com/2009/01/20/very-quick-equal-height-columns-in-jquery/

    我不相信height:100% 会起作用,所以如果你不明确知道 div 高度,我认为没有纯 CSS 解决方案。

    【讨论】:

    • 你应该至少在准备好、调整大小、方向改变、字体调整大小时触发它。
    【解决方案3】:

    对于parent 元素,添加以下属性:

    .parent {
        overflow: hidden;
        position: relative;
        width: 100%;
    }
    

    那么对于.child-right这些:

    .child-right {
        background:green;
        height: 100%;
        width: 50%;
        position: absolute;
        right: 0;
        top: 0;
    }
    

    通过 CSS 示例 here 和有关等高列 here 的更多信息查找更详细的结果。

    【讨论】:

    • 您的 CSS 会导致未定义的行为 - 父级的高度取决于子级的高度,但子级的高度是根据父级定义的:这是无效的,并且可能无法交叉使用-浏览器方式。
    • 我看到你并没有浮动所有东西 - 所以这是以不缩放为代价定义的,如果右列长于左列(在 OP 的问题中确实不是这种情况)。
    • 是的,你需要添加这个:padding-bottom: 32768px;边距底部:-32768px;给孩子们。
    • 只要保证右列的内容比左列少,否则它将被剪裁。我还编辑了答案以省略无用的声明。
    • @MatthewBlackford:这是一个“黑客”,因为它可以防止边距崩溃。您可以通过其他方式防止边距折叠,例如使用 1px 透明边框,但从本质上讲,但重要的是要避免边距折叠。我不会使用这个解决方案,除非作为最后的手段,因为当你的假设被证明是错误的时,它会导致奇怪的布局错误和意外的裁剪(或叠加的内容)。简而言之:除非你真的需要,否则你不想这样做。
    【解决方案4】:

    CSS 表格显示非常适合:

    .parent {
      display: table;
      width: 100%;
    }
    .parent > div {
      display: table-cell;
    }
    .child-left {
      background: powderblue;
    }
    .child-right {
      background: papayawhip;
    }
    <div class="parent">
      <div class="child-left">Short</div>
      <div class="child-right">Tall<br>Tall</div>
    </div>

    原始答案(假设任何列都可能更高):

    你试图让父母的身高取决于孩子的身高,孩子的身高取决于父母的身高。不会计算。 CSS Faux columns 是最好的解决方案。有不止一种方法可以做到这一点。我宁愿不使用 JavaScript。

    【讨论】:

    • 好点。如果孩子的身高取决于最高兄弟姐妹的身高(是否由父母的身高决定)而不是父母的身高,那又如何呢?我想这不能在 CSS 中完成。
    • 不,兄弟姐妹之间不能影响彼此的身高。但是,display: table + display: table-cell 布局将产生所需的结果。
    • 伟大的更新!但是,我最终尝试了这个,我想在 div/单元格之间进行空格分隔,最终不得不在表格单元格 div 中创建内部 div 来实现这一点,然后当然失去了让它们使用完整高度的能力因为内部 div 不是表格单元格 div - 完全相同的问题。有什么想法吗?现在有点缺少单元格间距。
    • 啊,CSS中有边框间距! stackoverflow.com/questions/339923/… 通过使用边框间距,我能够让我的类似表格的 div 与空白分隔良好地配合使用。我现在可以通过巧妙地使用表格单元格 div 来使表格单元格(彩色背景块)使用或不使用父级的完整高度。
    • 只是我遇到的一个问题:您不能将其与float 一起使用:stackoverflow.com/questions/20110217/…
    【解决方案5】:

    此问题的常见解决方案是使用绝对定位或裁剪浮动,但这些方法很棘手,因为如果您的列的数量+大小发生变化,它们需要进行大量调整,并且您需要确保您的“主”列始终是最长。相反,我建议您使用三种更强大的解决方案之一:

    1. display: flex:到目前为止最简单和最好的解决方案并且非常灵活 - 但不受 IE9 和更早版本的支持。
    2. tabledisplay: table:非常简单,非常兼容(几乎所有浏览器),非常灵活。
    3. display: inline-block; width:50% with a negative margin hack:很简单,但列底边框有点棘手。

    1。 display:flex

    这真的很简单,而且很容易适应更复杂或更详细的布局 - 但仅 IE10 或更高版本(除了其他现代浏览器)支持 flexbox。

    示例: http://output.jsbin.com/hetunujuma/1

    相关html:

    <div class="parent"><div>column 1</div><div>column 2</div></div>
    

    相关css:

    .parent { display: -ms-flex; display: -webkit-flex; display: flex; }
    .parent>div { flex:1; }
    

    Flexbox 支持更多选项,但只要有上述任意数量的列就足够了!

    2.&lt;table&gt;display: table

    一个简单且非常兼容的方法是使用table - 如果您需要旧版 IE 支持,我建议您先尝试一下。您正在处理列; divs + floats 根本不是最好的方法(更不用说多层嵌套 div 只是为了绕过 css 限制几乎没有比仅仅使用一个简单的表更“语义”)。如果您不想使用 table 元素,考虑使用 css display: table(IE7 和更早版本不支持)。

    示例: http://jsfiddle.net/emn13/7FFp3/

    相关的 html:(但请考虑改用普通的 &lt;table&gt;

    <div class="parent"><div>column 1</div><div>column 2</div></div>
    

    相关css:

    .parent { display: table; }
    .parent > div {display: table-cell; width:50%; }
    /*omit width:50% for auto-scaled column widths*/
    

    这种方法比使用带有浮点数的overflow:hidden 更强大。您可以添加几乎任意数量的列;如果你愿意,你可以让它们自动缩放;并且您保留与古代浏览器的兼容性。与浮动解决方案不同,您也不需要事先知道哪一列最长;高度缩放就好了。

    KISS:除非您特别需要,否则不要使用浮动技巧。如果 IE7 是一个问题,我仍然会选择一个带有语义列的普通表格,而不是一个难以维护、不太灵活的技巧 CSS 解决方案。

    顺便说一句,如果您需要您的布局是响应式的(例如,在小型手机上没有列),您可以使用 @media 查询回退到小屏幕宽度的普通块布局 - 无论您使用 @ 987654341@ 或任何其他display: table 元素。

    3。 display:inline block 带有负边距黑客。

    另一种选择是使用display:inline block

    示例: http://jsbin.com/ovuqes/2/edit

    相关 html:div 标签之间没有空格很重要!)

    <div class="parent"><div><div>column 1</div></div><div><div>column 2</div></div></div>
    

    相关css:

    .parent { 
        position: relative; width: 100%; white-space: nowrap; overflow: hidden; 
    }
    
    .parent>div { 
        display:inline-block; width:50%; white-space:normal; vertical-align:top; 
    }
    
    .parent>div>div {
        padding-bottom: 32768px; margin-bottom: -32768px; 
    }
    

    这有点棘手,负边距意味着列的“真实”底部被遮挡。这反过来意味着您不能相对于这些列的底部定位任何东西,因为它被overflow: hidden 截断。请注意,除了 inline-blocks 之外,您还可以使用浮点数实现类似的效果。


    TL;DR:如果可以忽略 IE9 及更早版本,请使用 flexbox;否则尝试(css)表。如果这些选项都不适合您,则存在负边距黑客,但这些可能会导致在开发过程中很容易错过的奇怪显示问题,并且您需要注意布局限制。

    【讨论】:

    • 不错,但值得注意的是,您无法在这些单元格之间使用边距(如果您希望它们设置样式,填充也无济于事)。
    • border-spacing:10px; 在 table 元素上会引入类似边距的间距。或者,您可以在需要额外空间的位置添加额外(空)列。您还可以在表格单元格内添加填充;但是,该填充将包含在背景中,因此这可能不是您想要的。但你是对的,它不像正常保证金那样灵活。而且你不能相对于列定位任何东西,这可能是个问题。
    • 那么无表布局是否更好?
    • 我不得不说:我同意你的观点,在这种情况下,一张简单的桌子就足够了。问题是有一个共同的观点是忽略每个布局与表格
    • 表格的问题在于,当屏幕被调整为更小的宽度(响应式设计)时,表格单元格会被压扁,而不是将一个单元格平铺在下一个单元格的顶部。第二种方法 padding-bottom: 32768px;边距底部:-32768px;非常棒,几乎完全符合我的需要...感谢那个...虽然边框底部是一个问题...
    【解决方案6】:

    请将父 div 设置为 overflow: hidden
    然后在子 div 中,您可以为 padding-bottom 设置大量。例如
    padding-bottom: 5000px
    然后margin-bottom: -5000px
    然后所有子 div 将是父级的高度。
    当然,如果您尝试将内容放在父 div 中(即在其他 div 之外),这将不起作用

    .parent{
        border: 1px solid black;
        overflow: hidden;
        height: auto;
    }
    .child{
        float: left;
        padding-bottom: 1500px;
        margin-bottom: -1500px;
    }
    .child1{
        background: red;
        padding-right: 10px;    
    }
    .child2{
        background: green;
        padding-left: 10px;
    }
    <div class="parent">
        <div class="child1 child">
            One line text in child1
        </div>
        <div class="child2 child">
            Three line text in child2<br />
            Three line text in child2<br />
            Three line text in child2
        </div>
    </div>

    示例:http://jsfiddle.net/Tareqdhk/DAFEC/

    【讨论】:

    • 似乎有点脏,但对我有用 - 这个问题的唯一解决方案。我使用 twitter bootstrap 进行了尝试。
    【解决方案7】:

    我找到了很多答案,但对我来说最好的解决方案可能是

    .parent { 
      overflow: hidden; 
    }
    .parent .floatLeft {
      # your other styles
      float: left;
      margin-bottom: -99999px;
      padding-bottom: 99999px;
    }
    

    你可以在这里查看其他解决方案http://css-tricks.com/fluid-width-equal-height-columns/

    【讨论】:

    • 我不知道为什么会这样,但它像魅力一样解决了我的问题。谢谢
    • 也适合我。尽管这不是干净的方式。谢谢!
    • 骇人听闻。我不建议将其用于生产应用程序
    • 这太棒了哈哈。我认为这实际上不会起作用
    【解决方案8】:

    对于父母:

    display: flex;
    

    对于儿童:

    align-items: stretch;
    

    你应该添加一些前缀,检查 caniuse。

    【讨论】:

    • 不推荐。 IE9 仍然是一个东西。
    • 感谢您的回答;它运作良好! “你应该添加一些前缀,检查 caniuse。”那条线是什么意思?能否为初学者添加更多信息?
    • @MdSifatulIslam 到这里:caniuse.com/#feat=flexbox 你可以看看你需要支持的浏览器是否需要特性前缀。
    【解决方案9】:

    我在评论区使用了这个:

    .parent {
        display: flex;
        float: left;
        border-top:2px solid black;
        width:635px;
        margin:10px 0px 0px 0px;
        padding:0px 20px 0px 20px;
        background-color: rgba(255,255,255,0.5);
    }
        
    .child-left {
    	align-items: stretch;
    	float: left;
    	width:135px;
    	padding:10px 10px 10px 0px;
    	height:inherit;
    	border-right:2px solid black;
    }
    
    .child-right {
    	align-items: stretch;
    	float: left;
    	width:468px;
    	padding:10px;
    }
    <div class="parent">
      <div class="child-left">Short</div>
      <div class="child-right">Tall<br>Tall</div>
    </div>

    您可以将 child-right 浮动到右侧,但在这种情况下,我已经精确计算了每个 div 的宽度。

    【讨论】:

    • 我首先想到的是身高:继承不知道为什么没有人支持
    【解决方案10】:

    如果您知道引导程序,您可以使用“flex”属性轻松完成。您需要做的就是将下面的 css 属性传递给父 div

    .homepageSection {
      overflow: hidden;
      height: auto;
      display: flex;
      flex-flow: row;
    }
    

    .homepageSection 是我的父 div。 现在在您的 html 中添加子 div 为

    <div class="abc col-md-6">
    <div class="abc col-md-6">
    

    abc 是我的子 div。您可以检查两个子 div 中的高度是否相等,而无需考虑边界,只需给子 div 提供边框

    【讨论】:

      【解决方案11】:
      <div class="parent" style="height:500px;">
      <div class="child-left floatLeft" style="height:100%">
      </div>
      
      <div class="child-right floatLeft" style="height:100%">
      </div>
      </div>
      

      我使用内联样式只是为了给出想法。

      【讨论】:

        【解决方案12】:

        我在一次实习面试中了解到这个巧妙的技巧。最初的问题是如何确保三列中每个顶部组件的高度具有显示所有可用内容的相同高度。基本上创建一个呈现最大可能高度的不可见子组件。

        <div class="parent">
            <div class="assert-height invisible">
                <!-- content -->
            </div>
            <div class="shown">
                <!-- content -->
            </div>
        </div>
        

        【讨论】:

          【解决方案13】:

          我可以看到接受的答案使用position: absolute; 而不是float: left。如果您想使用具有以下结构的float: left

          <div class="parent">
              <div class="child-left floatLeft"></div>
              <div class="child-right floatLeft"></div>
          </div>
          

          position: auto; 赋予父级,使其包含其子级的高度。

          .parent {
              position: auto;
          }
          .floatLeft {
              float: left
          }
          

          【讨论】:

            猜你喜欢
            • 2013-01-22
            • 1970-01-01
            • 1970-01-01
            • 2018-10-06
            • 2012-02-22
            • 2016-06-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多