Comment puis-je envoyer un <div> intérieur au bas de son parent <div>?

184

Le div dans une autre image div et le code ci-dessous. Parce qu'il y aura du texte et des images de la div parent. Et le div rouge sera le dernier élément du div parent.

texte alternatif

<div style="width: 200px; height: 150px; border: 1px solid black;">
    <div style="width: 100%; height: 50px; border: 1px solid red;">
    </div>
</div>
uzay95
la source
Le code du div parent est-il logiquement placé au-dessus du div enfant? Les images et le texte sont-ils ajoutés dynamiquement? Quelle est la question spécifique?
justkt

Réponses:

219

C'est une façon

<div style="position: relative; 
            width: 200px; 
            height: 150px; 
            border: 1px solid black;">

    <div style="position: absolute; 
                bottom: 0; 
                width: 100%; 
                height: 50px; 
                border: 1px solid red;">
    </div>
</div>

Mais comme la div interne est positionnée de manière absolue, vous devrez toujours vous soucier des autres contenus de la div externe qui la chevauchent (et vous devrez toujours définir des hauteurs fixes).

Si vous pouvez le faire, il est préférable de faire de cette div interne le dernier objet DOM de votre div externe et de la définir sur "clear: both".

Jon Smock
la source
1
Merci pour votre explication et IE Hack (si je ne me trompe pas, vous avez ajouté ** width: 100% for IE Hack).
uzay95 du
1
Non, la largeur: 100% était là dans votre original - je ne l'ai pas ajouté.
Jon Smock
1
J'ai essayé de mettre en gras les sections que j'ai modifiées, mais le Markdown ne s'applique pas à l'intérieur des blocs de code :-P
Jon Smock
:) En fait, je ne pouvais pas comprendre comment nous piratons IE avec des symboles, c'est pourquoi je pensais que c'était IE Hacking :)
uzay95
Gardez simplement à l'esprit que si le conteneur parent flotte, cette approche ne fonctionnera pas.
klewis
85

Une manière flexbox.

HTML:

<div class="parent">
  <div>Images, text, buttons oh my!</div>
  <div>Bottom</div>
</div>

CSS:

.parent {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
}

/*  not necessary, just to visualize it */

.parent {
  height: 500px;
  border: 1px solid black;
}


.parent div {
  border: 1px solid red;
}

entrez la description de l'image ici

Éditer:

Source - Guide Flexbox

Prise en charge du navigateur pour flexbox - Caniuse

Franklin Tarter
la source
4
OMG, où étais-tu toute ma vie [de programmation]! ;) J'adore le fait que ce soit si simple et ne gâche pas le positionnement, et cela semble fonctionner à peu près dans tous les navigateurs: caniuse.com/#feat=flexbox . Cela devrait être la solution et la réponse acceptée pour la programmation moderne.
Sablefoste
1
Flexbox est généralement le "moyen facile" de nos jours et dispose (presque) d'un excellent support de navigateur et d'une documentation. Ajout du lien caniuse à la réponse.
Franklin Tarter
80

Créez le div externe position="relative"et le div interne position="absolute"et définissez-le bottom="0".

Fermin
la source
8
et width=100%aussi.
Kevin
6
Oui, cela fonctionne mais le positionnement absolu rompt la «disposition naturelle». La hauteur de la div interne ne sera pas incluse en tant que hauteur du parent et, à mesure que la div externe se rétrécit, vous pourriez voir un chevauchement avec d'autres éléments de la div externe.
Ayush Gupta
15

Voici une autre astuce CSS pure, qui n'affecte pas un flux d'éléments.

#parent {
  min-height: 100vh; /* set height as you need */
  display: flex;
  flex-direction: column;
  background: grey;
}
.child {
  margin-top: auto;
  background: green;
}
<div id="parent">
  <h1>Positioning with margin</h1>
  <div class="child">
    Content to the bottom
  </div>
</div>

R3gi
la source
Génial si vous ne voulez pas définir une hauteur sur le div parent! Je vous remercie!
Johan Nordli
1
c'était la meilleure réponse pour moi
Russell Chisholm
Génial! L'autre solution flex déplaçait tout mon contenu hors de propos, celle-ci isole l'objet que vous souhaitez mettre en bas du reste. Excellente solution!
Alejandro Aristizábal le
8

Il se peut que vous ne souhaitiez pas un positionnement absolu car il rompt la redistribution: dans certaines circonstances, une meilleure solution consiste à créer l'élément grand-parent display:table;et l'élément parent display:table-cell;vertical-align:bottom;. Après cela, vous devriez pouvoir donner les éléments enfants display:inline-block;et ils couleront automatiquement vers le bas du parent.

Ansikt
la source
8

Remarque: ce n'est en aucun cas la meilleure façon de procéder!

Situation : je devais faire la même chose mais seulement je ne pouvais pas ajouter de div supplémentaires, donc j'étais coincé avec ce que j'avais et plutôt que de supprimer innerHTML et de créer un autre via javascript presque comme 2 rendus dont j'avais besoin pour avoir le contenu au en bas (barre animée).

Solution: Compte tenu de ma fatigue à l'époque, il semble normal de penser à une telle méthode, mais je savais que j'avais un élément DOM parent dont la hauteur de la barre commençait.

Plutôt que de jouer avec le javascript, j'ai utilisé une réponse CSS ( PAS TOUJOURS BONNE IDÉE )! :)

-moz-transform:rotate(180deg);
-webkit-transform:rotate(180deg);
-ms-transform:rotate(180deg);

Oui c'est correct, au lieu de positionner le DOM, j'ai retourné son parent en css.

Pour mon scénario, cela fonctionnera! Peut-être pour d'autres aussi! Pas de flamme! :)

Pogrindis
la source
1
Ce n'est peut-être pas la meilleure façon de le faire, mais c'est une approche assez géniale et très créative. J'ai moi-même lutté contre ce problème depuis un moment aujourd'hui, mes principaux points de friction: pas de hauteur fixe, doit être complètement fluide (pas assez de caractères pour expliquer pourquoi display: table ne fonctionnait pas). Cela a tout géré à merveille; les images à l'intérieur du div sont également retournées lorsque cela se produit, alors j'ai juste utilisé la classe sur ces éléments pour les retourner. Ressemble exactement comme il se doit, sans hauteurs définies. Un peu hacky mais bon, parfois il n'y a pas de meilleure alternative. Bien joué!
tganyan
4

Voici un moyen d'éviter les div absolus et les tables si vous connaissez la hauteur du parent:

<div class="parent">
    <div class="child"> <a href="#">Home</a>
    </div>
</div>

CSS:

.parent {
    line-height:80px;
    border: 1px solid black;
}
.child {
    line-height:normal;
    display: inline-block;
    vertical-align:bottom;
    border: 1px solid red;
}

JsFiddle:

Exemple

formatc
la source
0
<div style="width: 200px; height: 150px; border: 1px solid black;position:relative">
    <div style="width: 100%; height: 50px; border: 1px solid red;position:absolute;bottom:0">
    </div>
</div>
ЯegDwight
la source