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 .

77
demandé sur Community 2012-06-27 16:13:14

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;}​
117
répondu Quantastical 2017-12-13 16:11:50

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

19
répondu Alvaro 2014-02-20 06:19:02

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; }

http://jsfiddle.net/S8g4E/288/

4
répondu T.W.R. Cole 2013-03-04 22:07:40

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;}
2
répondu Dipak 2012-06-27 12:22:53

vous pouvez utiliser des flotteurs pour abaisser le contenu:

http://jsfiddle.net/S8g4E/5 /

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%;
}​
1
répondu biziclop 2012-06-27 12:22:13

sauf erreur de ma part, vous pouvez simplement ajouter height: 100%; et overflow:hidden; à #down .

#down { 
    background:pink; 
    height:100%; 
    overflow:hidden;
}​

Live DEMO

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;
}​

Live DEMO

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.

1
répondu Josh Mein 2012-06-27 12:53:30

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);
-3
répondu Jezen Thomas 2012-06-27 12:19:57