Faire div (hauteur) occuper la hauteur restante du parent
http://jsfiddle.net/S8g4E /
j'ai un conteneur div
avec deux enfants. Le premier enfant a une taille donnée. Comment puis-je faire le deuxième enfant d'occuper l'espace du conteneur div
sans donner une hauteur spécifique?
dans l'exemple, le rose div
devrait occuper aussi l'espace blanc.
similaire à cette question: comment faire pour que div occupe la hauteur restante?
mais je ne veux pas donner position absolue .
7 réponses
agrandir le #down
enfant pour remplir l'espace restant de #container
peut être accompli de différentes façons selon le support de navigateur que vous souhaitez atteindre et si oui ou non #up
a une hauteur définie.
Échantillons
.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>
Grille
CSS grid
encore des offres de mise en page une autre option, bien qu'elle ne soit pas aussi simple que le modèle Flexbox. Toutefois, il ne nécessite que le style de l'élément de conteneur:
.container { display: grid; grid-template-rows: 100px }
le grid-template-rows
définit la première ligne comme une hauteur fixe de 100px, et les lignes restantes s'étireront automatiquement pour remplir l'espace restant.
je suis assez sûr que IE11 nécessite -ms-
préfixes, donc assurez-vous de valider la fonctionnalité dans les navigateurs que vous souhaitez prendre en charge.
Flexbox
Css3's Flexible Box Layout Module ( flexbox
) est maintenant bien pris en charge et peut être très facile à mettre en œuvre. Parce qu'il est flexible, il fonctionne même quand #up
n'a pas une hauteur définie.
#container { display: flex; flex-direction: column; }
#down { flex-grow: 1; }
il est important de noter que le support IE10 & IE11 pour certaines propriétés flexbox peut être bogué, et que IE9 ou ci-dessous n'a aucun support.
Hauteur Calculée
une autre solution facile est d'utiliser le CSS3 calc
unité fonctionnelle, comme Alvaro le souligne dans sa réponse , mais il exige que la taille du premier enfant soit une valeur connue:
#up { height: 100px; }
#down { height: calc( 100% - 100px ); }
il est assez largement soutenu, avec les seules exceptions notables étant <= IE8 ou Safari 5 (Pas de soutien) et IE9 (soutien partiel). Quelque d'autres problèmes comprennent l'utilisation calc en conjonction avec transform ou box-shadow , alors assurez-vous de tester dans plusieurs navigateurs si cela vous concerne.
Autres Variantes
si un support plus ancien est nécessaire, vous pouvez ajouter height:100%;
à #down
fera le div pink pleine hauteur, avec une mise en garde. Il causera un débordement pour le container, parce que #up
le pousse vers le bas.
par conséquent, vous pouvez ajouter overflow: hidden;
au conteneur pour corriger cela.
alternativement, si la hauteur de #up
est fixe, vous pouvez le positionner absolument à l'intérieur du conteneur, et Ajouter un dessus de rembourrage à #down
.
et, encore une autre option serait d'utiliser un affichage de table:
#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;}
Cela fait presque deux ans que je n'ai pas posé cette question. Je viens de trouver CSS calc () qui résout ce problème que j'avais et j'ai pensé qu'il serait bien de l'ajouter au cas où quelqu'un aurait le même problème. (Au fait, j'ai fini par utiliser la position absolue).
http://jsfiddle.net/S8g4E/955 /
voici le css
#up { height:80px;}
#down {
height: calc(100% - 80px);//The upper div needs to have a fixed height, 80px in this case.
}
et plus d'informations à ce sujet ici: http://css-tricks.com/a-couple-of-use-cases-for-calc /
support du navigateur: http://caniuse.com/#feat=calc
ma réponse n'utilise que CSS, et n'utilise pas overflow: hidden ou display: table-row. Il exige que le premier enfant ait réellement une taille donnée, mais dans votre question vous déclarez que seul le deuxième enfant a besoin de sa taille non spécifiée, donc je pense que vous devriez trouver cela acceptable.
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; }
vérifiez la démo - http://jsfiddle.net/S8g4E/6 /
utiliser les feuilles de style css
#container { width: 300px; height: 300px; border:1px solid red; display: table;}
#up { background: green; display: table-row; }
#down { background:pink; display: table-row;}
vous pouvez utiliser des flotteurs pour abaisser le contenu:
vous avez un conteneur de taille fixe:
#container {
width: 300px; height: 300px;
}
Le contenu peut s'écouler à côté d'un flotteur. Sauf si nous réglons le flotteur à pleine largeur:
#up {
float: left;
width: 100%;
}
alors que #up
et #down
partagent la position supérieure, le contenu de #down
ne peut commencer qu'après le bas de la floated #up
:
#down {
height:100%;
}
sauf erreur de ma part, vous pouvez simplement ajouter height: 100%;
et overflow:hidden;
à #down
.
#down {
background:pink;
height:100%;
overflow:hidden;
}
Edit: puisque vous ne voulez pas utiliser overflow:hidden;
, vous pouvez utiliser display: table;
pour ce scénario; cependant, il n'est pas supporté avant 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;
}
Note: Vous avez dit que vous vouliez que la hauteur #down
soit #container
hauteur moins #up
hauteur. La solution display:table;
fait exactement cela et ce jsfiddle va dépeindre cela assez clairement.
Je ne suis pas sûr que cela puisse être fait purement avec CSS, à moins que vous ne soyez à l'aise pour faire semblant avec des illusions. Peut-être utiliser la réponse de Josh Mein, et mettre #container
à overflow:hidden
.
pour ce que ça vaut, voici une solution jQuery:
var contH = $('#container').height(),
upH = $('#up').height();
$('#down').css('height' , contH - upH);