填充剩余的垂直空间-只有 CSS

我需要在 #first下用 #second div 填充 #wrapper剩余垂直空间剩余垂直空间

我需要一个唯一的 CSS 解决方案。

#wrapper {
width: 300px;
height: 100%;
}


#first {
width: 300px;
height: 200px;
background-color: #F5DEB3;
}


#second {
width: 300px;
height: 100%;
background-color: #9ACD32;
}
<div id="wrapper">
<div id="first"></div>
<div id="second"></div>
</div>

147681 次浏览

You can do this with position:absolute; on the #second div like this :

FIDDLE

CSS :

#wrapper{
position:relative;
}


#second {
position:absolute;
top:200px;
bottom:0;
left:0;
width:300px;
background-color:#9ACD32;
}

EDIT : Alternative solution

Depending on your layout and the content you have in those divs, you could make it much more simple and with less markup like this :

FIDDLE

HTML :

<div id="wrapper">
<div id="first"></div>
</div>

CSS :

#wrapper {
height:100%;
width:300px;
background-color:#9ACD32;
}
#first {
background-color:#F5DEB3;
height: 200px;
}

If you can add an extra couple of divs so your html looks like this:

<div id="wrapper">
<div id="first" class="row">
<div class="cell"></div>
</div>
<div id="second" class="row">
<div class="cell"></div>
</div>
</div>

You can make use of the display:table properties:

#wrapper
{
width:300px;
height:100%;
display:table;
}


.row
{
display:table-row;
}


.cell
{
display:table-cell;
}


#first .cell
{
height:200px;
background-color:#F5DEB3;
}


#second .cell
{
background-color:#9ACD32;
}

Example

You can use CSS Flexbox instead another display value, The Flexbox Layout (Flexible Box) module aims at providing a more efficient way to lay out, align and distribute space among items in a container, even when their size is unknown and/or dynamic.

Example

/* CONTAINER */
#wrapper
{
width:300px;
height:300px;
display: -webkit-box; /* OLD - iOS 6-, Safari 3.1-6 */
display: -moz-box; /* OLD - Firefox 19- (buggy but mostly works) */
display: -ms-flexbox; /* TWEENER - IE 10 */
display: -webkit-flex; /* NEW - Chrome */
display: flex; /* NEW, Spec - Opera 12.1, Firefox 20+ */
-ms-flex-direction: column;
-moz-flex-direction: column;
-webkit-flex-direction: column;
flex-direction: column;
}


/* SOME ITEM CHILD ELEMENTS */
#first
{
width:300px;
height: 200px;
background-color:#F5DEB3;


}


#second
{
width:300px;
background-color: #9ACD32;
-webkit-box-flex: 1; /* OLD - iOS 6-, Safari 3.1-6 */
-moz-box-flex: 1; /* OLD - Firefox 19- */
-webkit-flex: 1; /* Chrome */
-ms-flex: 1; /* IE 10 */
flex: 1; /* NEW, */
}

jsfiddle Example

If you want to have full support for old browsers like IE9 or below, you will have to use a polyfills like flexy, this polyfill enable support for Flexbox model but only for 2012 spec of flexbox model.

Recently I found another polyfill to help you with Internet Explorer 8 & 9 or any older browser that not have support for flexbox model, I still have not tried it but I leave the link here

You can find a usefull and complete Guide to Flexbox model by Chris Coyer here

All you need is a bit of improved markup. Wrap the second within the first and it will render under.

<div id="wrapper">
<div id="first">
Here comes the first content
<div id="second">I will render below the first content</div>
</div>
</div>

Demo

If you don't want to have fix heights for your main-container (top, bottom, ....), you can simply use this css-file to get a flex-container which uses the remaining space incl. working!!! scrollbars

Fiddler

<!DOCTYPE html>
<html >
<head>
<title>Flex Container</title>
<link rel="stylesheet" href="http://demo.qooxdoo.org/5.0/framework/indigo-5.0.css">


<style>
.cont{
background-color: blue;
position: absolute;
height: 100%;
width: 100%;
}


.headerContainer {
background-color: green;
height: 100px;
width: 100%;
}


.mainContainer {
background-color: white;
width: 100%;
overflow: scroll
}


.footerContainer {
background-color: gray;
height: 100px;
width: 100%;
}
</style>




</head>


<body class="qx-flex-ready" style="height: 100%">
<div class="qx-vbox cont">
<div class="headerContainer">Cell 1: flex1</div>
<div class="mainContainer qx-flex3">
x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>
x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>
x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>
x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>
x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>


</div>
<div class="footerContainer" >Cell 3: flex1</div>
</div>
</body>
</html>

You can just add the overflow:auto option:

#second
{
width:300px;
height:100%;
overflow: auto;
background-color:#9ACD32;
}

The modern way to achieve this is using CSS Flexbox (see the MDN Web Docs).

html, body {
height: 100%;
}


.wrapper {
display: flex;
flex-direction: column;
width: 300px;
height: 100%;
}


.first {
height: 50px;
}


.second {
flex-grow: 1;
}
<div class="wrapper">
<div class="first" style="background:#b2efd8">First</div>
<div class="second" style="background:#80c7cd">Second</div>
</div>

Have you tried changing the wrapper height to vh instead of %?

#wrapper {
width:300px;
height:100vh;
}

That worked great for me when I wanted to fill my page with a gradient background for instance...