L'espansione del #down
bambino per riempire lo spazio rimanente #container
può essere eseguita in vari modi a seconda del supporto del browser che si desidera ottenere e se o meno#up
ha un'altezza definita .
Campioni
.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>
Griglia
Il grid
layout del CSS offre ancora un'altra opzione, anche se potrebbe non essere così semplice come il modello Flexbox. Tuttavia, richiede solo lo stile dell'elemento contenitore:
.container { display: grid; grid-template-rows: 100px }
Il grid-template-rows
definisce la prima riga come 100px altezza fissa, e rimangono righe tenderanno automaticamente per riempire lo spazio rimanente.
Sono abbastanza sicuro che IE11 richieda -ms-
prefissi, quindi assicurati di convalidare la funzionalità nei browser che desideri supportare.
Flexbox
Il modulo di layout a scatola flessibileflexbox
di CSS3 ( ) è ora ben supportato e può essere molto facile da implementare. Poiché è flessibile, funziona anche quando #up
non ha un'altezza definita.
#container { display: flex; flex-direction: column; }
#down { flex-grow: 1; }
È importante notare che il supporto di IE10 e IE11 per alcune proprietà flexbox può essere difettoso e IE9 o versioni precedenti non hanno alcun supporto.
Altezza calcolata
Un'altra facile soluzione è utilizzare l' unità funzionale CSS3calc
, come sottolinea Alvaro nella sua risposta , ma richiede che l'altezza del primo figlio sia un valore noto:
#up { height: 100px; }
#down { height: calc( 100% - 100px ); }
È ampiamente supportato, con le uniche eccezioni degne di nota: <= IE8 o Safari 5 (nessun supporto) e IE9 (supporto parziale). Alcuni altri problemi includono l'uso di calc in combinazione con transform o box-shadow , quindi assicurati di testare in più browser se questo ti preoccupa.
Altre alternative
Se è necessario un supporto precedente, è possibile aggiungere height:100%;
a #down
renderà il div rosa a tutta altezza, con un avvertimento. Provocherà un trabocco per il contenitore, perché lo #up
sta spingendo verso il basso.
Pertanto, potresti aggiungere overflow: hidden;
al contenitore per risolverlo.
In alternativa, se l'altezza di #up
è fissa, puoi posizionarlo assolutamente all'interno del contenitore e aggiungere un padding-top a #down
.
E un'altra opzione sarebbe quella di utilizzare un display da tavolo:
#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;}