CSS - 将float子DIV高度展开为父级的高度

Vee*_*era 427 html css layout

我的页面结构如下:

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

    <div class="child-right floatLeft">
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

现在,child-leftDIV将拥有更多内容,因此parentDIV的高度会根据孩子的DIV而增加.

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

Sot*_*ris 438

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

.parent {
    overflow: hidden;
    position: relative;
    width: 100%;
}
Run Code Online (Sandbox Code Playgroud)

然后为.child-right这些:

.child-right {
    background:green;
    height: 100%;
    width: 50%;
    position: absolute;
    right: 0;
    top: 0;
}
Run Code Online (Sandbox Code Playgroud)

找到CSS的例子更详细的结果这里约等于身高列的详细信息在这里.

  • 您的CSS会导致未定义的行为 - 父级的高度取决于子级的高度,但子级具有根据父级定义的百分比高度:这是无效的,并且可能无法以跨浏览器的方式工作. (13认同)
  • 是的,你需要添加:padding-bottom:32768px; margin-bottom:-32768px; 给孩子们 (4认同)
  • 只要保证右列的内容比左侧更少或者它将被剪裁,这种方法就可以正常工作.我也编辑了答案,省略了无用的声明. (3认同)
  • @MatthewBlackford:这是一个"黑客",因为它可以防止保证金崩溃.您可以通过其他方式防止边距折叠,例如使用1px透明边框,但实质上,但重要的是您避免边距崩溃.除非作为最后的手段,否则我不会使用此解决方案,因为当您的假设结果出错时,它会导致奇怪的布局错误和意外裁剪(或叠加内容).简而言之:除非你真的需要,否则你不想这样做. (3认同)

Eam*_*nne 193

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

  1. display: flex:到目前为止最简单和最好的解决方案并且非常灵活 - 但IE9和更老版本不支持.
  2. table或者display: table:非常简单,非常兼容(几乎每个浏览器都有),非常灵活.
  3. display: inline-block; width:50% 带有负边距的黑客:非常简单,但是柱底边框有点棘手.

1. display:flex

这非常简单,并且很容易适应更复杂或更详细的布局 - 但是只有IE10或更高版本(除了其他现代浏览器之外)才支持flexbox.

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

相关的html:

<div class="parent"><div>column 1</div><div>column 2</div></div>
Run Code Online (Sandbox Code Playgroud)

相关的CSS:

.parent { display: -ms-flex; display: -webkit-flex; display: flex; }
.parent>div { flex:1; }
Run Code Online (Sandbox Code Playgroud)

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

2. <table>display: table

一个简单且非常兼容的方法是使用table- 如果你需要旧的IE支持,我建议你先尝试一下.你在处理专栏; divs + floats根本不是最好的方法(更不用说多个级别的嵌套div只是为了破解css限制而不仅仅是"语义"而不仅仅是使用一个简单的表).如果您不想使用该table元素,请考虑使用cssdisplay: table(不受IE7及更旧版本支持).

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

相关的html :(但考虑使用普通的<table>)

<div class="parent"><div>column 1</div><div>column 2</div></div>
Run Code Online (Sandbox Code Playgroud)

相关的CSS:

.parent { display: table; }
.parent > div {display: table-cell; width:50%; }
/*omit width:50% for auto-scaled column widths*/
Run Code Online (Sandbox Code Playgroud)

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

吻:除非你特别需要,否则不要使用漂浮黑客.如果IE7是一个问题,我仍然会选择一个带有语义列的普通表,而不是任何一天难以维护,灵活性较低的技巧CSS解决方案.

顺便说一下,如果你需要你的布局响应(例如小手机上没有列)你可以使用@media查询回退到小屏幕宽度的普通块布局 - 无论你使用<table>或任何其他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>
Run Code Online (Sandbox Code Playgroud)

相关的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; 
}
Run Code Online (Sandbox Code Playgroud)

这有点棘手,负边距意味着列的"真实"底部变得模糊.这反过来意味着你不能相对于那些列的底部放置任何东西,因为它被截断了overflow: hidden.请注意,除了内联块之外,您还可以使用浮点数实现类似的效果.


TL; DR:如果可以忽略IE9及更早版本,请使用flexbox ; 否则尝试(css)表.如果这两个选项都不适合你,那么就会出现负边距黑客攻击,但是这些可能会导致在开发过程中容易遗漏的奇怪显示问题,并且需要注意布局限制.

  • `border-spacing:10px;`表元素上的`将引入类似边距的间距.或者,您可以在需要额外空间的位置添加额外(空)列.你还可以在表格单元格中添加填充; 然而,填充将包含在背景中,因此可能不是您想要的.但你是对的,它不像普通的边际那么灵活.并且你不能相对于列定位任何东西,这可能是一个问题. (3认同)
  • 我不得不说:我同意你,在这种情况下,一个简单的表就足够了.问题是有一个共同的观点来忽略每个布局与表 (3认同)
  • 表格的问题在于,当屏幕被调整为较小的宽度(响应式设计)时,表格单元格会被挤压而不是在下一个格式的顶部平铺一个.padding-bottom的第二种方法:32768px; margin-bottom:-32768px; 是非常惊人的,几乎完全符合我的需要...感谢那一个...边界底部是一个问题,但... (3认同)

Aip*_*hee 23

对于父母:

display: flex;
Run Code Online (Sandbox Code Playgroud)

为孩子:

align-items: stretch;
Run Code Online (Sandbox Code Playgroud)

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

  • 不建议.IE9仍然是一个东西. (2认同)

Dob*_*hev 18

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

.parent { 
  overflow: hidden; 
}
.parent .floatLeft {
  # your other styles
  float: left;
  margin-bottom: -99999px;
  padding-bottom: 99999px;
}
Run Code Online (Sandbox Code Playgroud)

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

  • hacky as hell.我不建议将其用于生产应用程序 (15认同)

Tar*_*req 11

请设置父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;
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

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


Oli*_*cal 8

父母有高度吗?如果你这样设置父母身高.

div.parent { height: 300px };
Run Code Online (Sandbox Code Playgroud)

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

div.child-right { height: 100% };
Run Code Online (Sandbox Code Playgroud)

编辑

以下是使用JavaScript的方法.


Sal*_*n A 5

CSS表格显示非常适用于此:

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

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

你试图让父母的身高取决于孩子的身高和孩子的身高取决于父母的身高.不会计算.CSS Faux色谱柱是最佳解决方案.这样做的方法不止一种.我宁愿不使用JavaScript.


小智 5

我用它来评论部分:

.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;
}
Run Code Online (Sandbox Code Playgroud)
<div class="parent">
  <div class="child-left">Short</div>
  <div class="child-right">Tall<br>Tall</div>
</div>
Run Code Online (Sandbox Code Playgroud)

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