我有一个有两个孩子的容器div
。第一个孩子有一个给定的高度。如何在不给出特定高度的情况下让第二个孩子占据容器div
的“自由空间”?
在示例中,粉红色div
也应占据空白区域。
与此问题类似:How to make div occupy remaining height?
但我不想给绝对位置。
答案 0 :(得分:134)
扩展#down
子级以填充#container
的剩余空间可以通过各种方式完成,具体取决于您希望实现的浏览器支持以及#up
是否具有已定义的高度
<强>样品强>
.container {
width: 100px;
height: 300px;
border: 1px solid red;
float: left;
}
.up {
background: green;
}
.down {
background: pink;
}
.grid.container {
display: grid;
grid-template-rows: 100px;
}
.flexbox.container {
display: flex;
flex-direction: column;
}
.flexbox.container .down {
flex-grow: 1;
}
.calc .up {
height: 100px;
}
.calc .down {
height: calc(100% - 100px);
}
.overflow.container {
overflow: hidden;
}
.overflow .down {
height: 100%;
}
<div class="grid container">
<div class="up">grid
<br />grid
<br />grid
<br />
</div>
<div class="down">grid
<br />grid
<br />grid
<br />
</div>
</div>
<div class="flexbox container">
<div class="up">flexbox
<br />flexbox
<br />flexbox
<br />
</div>
<div class="down">flexbox
<br />flexbox
<br />flexbox
<br />
</div>
</div>
<div class="calc container">
<div class="up">calc
<br />calc
<br />calc
<br />
</div>
<div class="down">calc
<br />calc
<br />calc
<br />
</div>
</div>
<div class="overflow container">
<div class="up">overflow
<br />overflow
<br />overflow
<br />
</div>
<div class="down">overflow
<br />overflow
<br />overflow
<br />
</div>
</div>
<强>网格强>
CSS的grid
布局提供了另一种选择,尽管它可能不如Flexbox模型那么简单。但是,它只需要设置容器元素的样式:
.container { display: grid; grid-template-rows: 100px }
grid-template-rows
将第一行定义为固定的100px高度,剩余行将自动拉伸以填充剩余空间。
我非常确定IE11需要-ms-
前缀,因此请务必验证您希望支持的浏览器中的功能。
<强> Flexbox的强>
CSS3的Flexible Box Layout Module (flexbox
)现在得到了很好的支持,可以非常容易地实现。因为它很灵活,所以当#up
没有定义的高度时它甚至可以工作。
#container { display: flex; flex-direction: column; }
#down { flex-grow: 1; }
重要的是要注意IE10&amp; IE11对某些flexbox属性的支持可能有问题,IE9或更低版本根本没有支持。
计算出的高度
另一个简单的解决方案是使用CSS3 calc
功能单元as Alvaro points out in his answer,但它要求第一个孩子的高度为已知值:
#up { height: 100px; }
#down { height: calc( 100% - 100px ); }
它受到广泛支持,唯一值得注意的例外是&lt; = IE8或Safari 5(不支持)和IE9(部分支持)。其他一些问题包括将 calc 与 transform 或 box-shadow 结合使用,因此请务必在多个浏览器中进行测试你。
其他替代方案
如果需要较旧的支持,您可以将height:100%;
添加到#down
,将粉红色div设为全高,只需注意一点。它会导致容器溢出,因为#up
正在将其推下来。
因此,您可以将overflow: hidden;
添加到容器中以解决此问题。
或者,如果#up
的高度固定,您可以将其绝对放置在容器中,并将填充顶部添加到#down
。
而且,另一种选择是使用表格显示:
#container { width: 300px; height: 300px; border: 1px solid red; display: table;}
#up { background: green; display: table-row; height: 0; }
#down { background: pink; display: table-row;}
答案 1 :(得分:21)
我提出这个问题差不多两年了。我刚刚提出了css calc()来解决我遇到的这个问题,并认为如果有人遇到同样的问题会很好。 (顺便说一句,我最终使用绝对位置)。
http://jsfiddle.net/S8g4E/955/
这是css
#up { height:80px;}
#down {
height: calc(100% - 80px);//The upper div needs to have a fixed height, 80px in this case.
}
有关它的更多信息,请访问:http://css-tricks.com/a-couple-of-use-cases-for-calc/
答案 2 :(得分:5)
我没有找到一个令人满意的答案,所以我必须自己找出答案。
我的要求:
calc()
不应该使用,因为其余元素对其他元素大小一无所知; flex-grow: 1
指定为具有计算高度(如果有)的所有直接父级和元素,这样当元素内容大小时,它们将占用所有剩余空间较小; flex-shrink: 0
指定为所有高度固定的flex项目,这样,当元素内容大小大于剩余空间大小时,它们就不会变小; overflow: hidden
指定为所有具有计算高度的直接父级(如果有),以禁止滚动并禁止显示溢出内容; overflow: auto
指定为元素以启用其内部滚动。JSFiddle (element has direct parents with computed height)
JSFiddle (simple case: no direct parents with computed height)
答案 3 :(得分:4)
我的回答只使用CSS,它不使用overflow:hidden或display:table-row。它要求第一个孩子确实具有给定的身高,但在你的问题中,你要说明只有第二个孩子需要高度未指定,所以我相信你应该认为这是可以接受的。
HTML
<div id="container">
<div id="up">Text<br />Text<br />Text<br /></div>
<div id="down">Text<br />Text<br />Text<br /></div>
</div>
CSS
#container { width: 300px; height: 300px; border:1px solid red;}
#up { background: green; height: 63px; float:left; width: 100% }
#down { background:pink; padding-top: 63px; height: 100%; box-sizing: border-box; }
答案 4 :(得分:2)
除非我误解,否则您只需将height: 100%;
和overflow:hidden;
添加到#down
。
#down {
background:pink;
height:100%;
overflow:hidden;
}
编辑:由于您不想使用overflow:hidden;
,因此您可以在此方案中使用display: table;
;但是,在IE 8之前不支持它。(display: table;
support)
#container {
width: 300px;
height: 300px;
border:1px solid red;
display:table;
}
#up {
background: green;
display:table-row;
height:0;
}
#down {
background:pink;
display:table-row;
}
注意:您已说过,#down
身高应为#container
身高减去#up
身高。 display:table;
解决方案正是如此,而this jsfiddle将非常清晰地描绘出来。
答案 5 :(得分:2)
查看演示 - http://jsfiddle.net/S8g4E/6/
使用css -
#container { width: 300px; height: 300px; border:1px solid red; display: table;}
#up { background: green; display: table-row; }
#down { background:pink; display: table-row;}
答案 6 :(得分:1)
您可以使用浮动来推送内容:
您有一个固定大小的容器:
#container {
width: 300px; height: 300px;
}
允许内容在浮动旁边流动。除非我们将浮点数设置为全宽:
#up {
float: left;
width: 100%;
}
虽然#up
和#down
分享了最高职位,但#down
的内容只能在浮动#up
的底部之后开始:
#down {
height:100%;
}
答案 7 :(得分:-3)
我不确定它是否可以纯粹用CSS完成,除非你觉得用幻象来伪装它。也许使用Josh Mein的答案,并将#container
设置为overflow:hidden
。
对于它的价值,这是一个jQuery解决方案:
var contH = $('#container').height(),
upH = $('#up').height();
$('#down').css('height' , contH - upH);