Wie kann ich ein inneres <div> an den unteren Rand seines übergeordneten <div> senden?

184

Das div in einem anderen div Bild und Code unten. Weil es Text und Bilder des übergeordneten Div gibt. Und rotes div wird das letzte Element des übergeordneten div sein.

Alt-Text

<div style="width: 200px; height: 150px; border: 1px solid black;">
    <div style="width: 100%; height: 50px; border: 1px solid red;">
    </div>
</div>
uzay95
quelle
Wird der Code des übergeordneten Div logisch über dem untergeordneten Div platziert? Werden die Bilder und der Text dynamisch hinzugefügt? Was ist die spezifische Frage?
Justkt

Antworten:

216

Dies ist eine Möglichkeit

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

Da das innere Div jedoch absolut positioniert ist, müssen Sie sich immer um andere Inhalte im äußeren Div kümmern, die es überlappen (und Sie müssen immer feste Höhen festlegen).

Wenn Sie dies tun können, ist es besser, dieses innere Div zum letzten DOM-Objekt in Ihrem äußeren Div zu machen und es auf "clear: both" zu setzen.

Jon Smock
quelle
1
Vielen Dank für Ihre Erklärung und IE Hack (wenn ich mich nicht irre, haben Sie ** Breite hinzugefügt: 100% für IE Hack).
uzay95
1
Nein, die Breite: 100% war in Ihrem Original vorhanden - ich habe es nicht hinzugefügt.
Jon Smock
1
Ich habe versucht, die Abschnitte, die ich geändert habe, fett zu schreiben, aber der Markdown gilt nicht innerhalb der Codeblöcke :-P
Jon Smock
:) Eigentlich konnte ich nicht verstehen, wie wir IE mit Symbolen hacken, deshalb dachte ich, es ist IE-Hacking :)
uzay95
Denken Sie daran, dass dieser Ansatz nicht funktioniert, wenn der übergeordnete Container schwebt.
Klewis
84

Ein Flexbox-Weg.

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

Geben Sie hier die Bildbeschreibung ein

Bearbeiten:

Quelle - Flexbox-Handbuch

Browserunterstützung für Flexbox - Caniuse

Franklin Tarter
quelle
4
OMG, wo warst du mein ganzes [Programmier-] Leben lang! ;) Ich finde es toll, dass dies so einfach ist und sich nicht auf die Positionierung auswirkt , und es scheint fast in allen Browsern zu funktionieren : caniuse.com/#feat=flexbox . Dies sollte die Lösung und akzeptierte Antwort für die moderne Programmierung sein.
Sablefoste
1
Flexbox ist heutzutage normalerweise der "einfache Weg" und bietet (fast) hervorragende Browserunterstützung und Dokumentation. Hinzufügen des Caniuse-Links zur Antwort.
Franklin Tarter
80

Machen Sie das äußere position="relative"und das innere Div position="absolute"und stellen Sie es ein bottom="0".

Fermin
quelle
8
und width=100%auch.
Kevin
6
Ja, das funktioniert, aber die absolute Positionierung bricht das "natürliche Layout". Die Höhe des inneren Divs wird nicht als Höhe des übergeordneten Elements berücksichtigt. Wenn das äußere Div enger wird, kann es zu Überlappungen mit anderen Elementen im äußeren Div kommen.
Ayush Gupta
15

Hier ist ein weiterer reiner CSS-Trick, der einen Elementfluss nicht beeinflusst.

#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
quelle
Genial, wenn Sie keine Höhe für das übergeordnete Div festlegen möchten! Danke dir!
Johan Nordli
1
Dies war die beste Antwort für mich
Russell Chisholm
Toll! Die andere Flex-Lösung hat meinen gesamten Inhalt verschoben. Diese isoliert das Objekt, das Sie unten platzieren möchten, vom Rest. Tolle Lösung!
Alejandro Aristizábal
8

Möglicherweise möchten Sie keine absolute Positionierung, da dies den Reflow unterbricht. Unter bestimmten Umständen besteht eine bessere Lösung darin, das Großelternelement display:table;und das übergeordnete Element zu erstellen display:table-cell;vertical-align:bottom;. Danach sollten Sie in der Lage sein, den display:inline-block;untergeordneten Elementen zu geben, und sie fließen automatisch zum unteren Rand des übergeordneten Elements.

Ansikt
quelle
8

Hinweis: Dies ist keineswegs der bestmögliche Weg, dies zu tun!

Situation : Ich musste das gleiche tun, nur konnte ich keine zusätzlichen Divs hinzufügen, daher blieb ich bei dem, was ich hatte, und anstatt innerHTML zu entfernen und ein anderes über Javascript zu erstellen, fast wie 2 Renderings, die ich brauchte, um den Inhalt im zu haben unten (animierte Leiste).

Lösung: Angesichts der Müdigkeit, die ich zu der Zeit hatte, scheint es normal, überhaupt an eine solche Methode zu denken, aber ich wusste, dass ich ein übergeordnetes DOM-Element hatte, von dem aus die Höhe der Leiste begann.

Anstatt weiter mit dem Javascript herumzuspielen, habe ich eine ( NICHT IMMER GUTE IDEE ) CSS-Antwort verwendet! :) :)

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

Ja, das ist richtig. Anstatt das DOM zu positionieren, habe ich das übergeordnete Element in CSS auf den Kopf gestellt.

Für mein Szenario wird es funktionieren! Möglicherweise auch für andere! Keine Flamme! :) :)

Pogrindis
quelle
1
Dies ist vielleicht nicht der bestmögliche Weg, aber dies ist ein ziemlich großartiger, sehr kreativer Ansatz. Ich selbst habe heute eine Weile mit diesem Thema gerungen, meine Hauptprobleme: Keine festgelegten Höhen, müssen vollständig flüssig sein (nicht genug Zeichen, um zu erklären, warum display: table nicht funktioniert hat). Dies handhabte alles schön; In diesem Fall werden auch die Bilder im div gespiegelt, sodass ich die Klasse für diese Elemente verwendet habe, um sie zurückzudrehen. Sieht genau so aus, wie es sollte, ohne festgelegte Höhen. Ein bisschen hacky, aber hey, manchmal gibt es keine bessere Alternative. Gut gemacht!
Tganyan
4

So vermeiden Sie absolute Divs und Tabellen, wenn Sie die Größe der Eltern kennen:

<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:

Beispiel

formatc
quelle
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
quelle