Jak mogę wysłać wewnętrzny <div> do dolnej części jego rodzica <div>?

184

Div wewnątrz innego obrazu div i kodu poniżej. Ponieważ będzie tekst i obrazy rodzica div. A czerwony div będzie ostatnim elementem div rodzica.

alternatywny tekst

<div style="width: 200px; height: 150px; border: 1px solid black;">
    <div style="width: 100%; height: 50px; border: 1px solid red;">
    </div>
</div>
uzay95
źródło
Więc czy kod nadrzędnego div div jest logicznie umieszczony nad divem potomnym? Czy obrazy i tekst są dodawane dynamicznie? Jakie jest konkretne pytanie?
justkt

Odpowiedzi:

218

To jest jeden sposób

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

Ale ponieważ wewnętrzny div jest ustawiony absolutnie, zawsze będziesz musiał martwić się o to, że inna zawartość w zewnętrznej div nachodzi na niego (i zawsze będziesz musiał ustawić stałe wysokości).

Jeśli możesz to zrobić, lepiej uczynić ten div div ostatnim obiektem DOM w twoim div div i ustawić go na „wyczyść: oba”.

Jon Smock
źródło
1
Dziękujemy za wyjaśnienie i IE Hack (jeśli się nie mylę, dodałeś ** szerokość: 100% dla IE Hack).
uzay95
1
Nie, szerokość: 100% było w twoim oryginale - nie dodałem go.
Jon Smock
1
Próbowałem pogrubić sekcje, które zmieniłem, ale Markdown nie stosuje się do bloków kodu :-P
Jon Smock 27'10
:) Właściwie nie mogłem zrozumieć, jak hakujemy IE za pomocą symboli, dlatego pomyślałem, że to hakowanie IE :)
uzay95
Pamiętaj tylko, że jeśli kontener nadrzędny jest pływający, to podejście nie będzie działać.
klewis
84

Sposób na 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;
}

wprowadź opis zdjęcia tutaj

Edytować:

Źródło - Przewodnik Flexbox

Obsługa przeglądarki Flexbox - Caniuse

Franklin Tarter
źródło
4
OMG, gdzie byłeś całe moje [programistyczne] życie! ;) Uwielbiam to, że jest to tak proste i nie przeszkadza w pozycjonowaniu, i wydaje się, że dotyczy tylko wszystkich przeglądarek: caniuse.com/#feat=flexbox . To powinno być rozwiązanie i akceptowana odpowiedź na współczesne programowanie.
Sablefoste
1
Flexbox jest obecnie zazwyczaj „łatwym sposobem” i ma (prawie) doskonałą obsługę przeglądarki oraz dokumentację. Dodanie linku kajaka do odpowiedzi.
Franklin Tarter
80

Zrób zewnętrzny div position="relative"i wewnętrzny div position="absolute"i ustaw go bottom="0".

Fermin
źródło
8
i width=100%też.
Kevin
6
Tak, to działa, ale pozycjonowanie absolutne łamie „naturalny układ”. Wysokość wewnętrznego div nie zostanie uwzględniona jako wysokość rodzica, a gdy zewnętrzny div staje się węższy, możesz zauważyć nakładanie się na inne elementy w div div.
Ayush Gupta
15

Oto kolejna sztuczka CSS, która nie wpływa na przepływ elementów.

#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
źródło
Niesamowite, jeśli nie chcesz ustawiać wysokości div rodzica! Dziękuję Ci!
Johan Nordli,
1
to była dla mnie najlepsza odpowiedź
Russell Chisholm
Wspaniały! Drugie rozwiązanie flex przeniosło całą moją zawartość na miejsce, ta izoluje obiekt, który chcesz umieścić na dole od reszty. Świetne rozwiązanie!
Alejandro Aristizábal
8

Być może nie chcesz pozycjonowania bezwzględnego, ponieważ przerywa ono przepływ: w niektórych okolicznościach lepszym rozwiązaniem jest utworzenie elementu dziadka display:table;i elementu nadrzędnego display:table-cell;vertical-align:bottom;. Po wykonaniu tej czynności powinieneś być w stanie podać elementy potomne, display:inline-block;a one automatycznie przepłyną w kierunku dna elementu nadrzędnego.

Ansikt
źródło
8

Uwaga: To nie jest najlepszy sposób, aby to zrobić!

Sytuacja : Musiałem zrobić to samo, tylko że nie byłem w stanie dodać żadnych dodatkowych div, dlatego utknąłem z tym, co miałem i zamiast usuwać innerHTML i tworzyć kolejne za pomocą javascript prawie jak 2 rendery, potrzebowałem mieć zawartość dół (animowany pasek).

Rozwiązanie: Biorąc pod uwagę to, jak byłem zmęczony, nawet myślenie o takiej metodzie wydaje się normalne, ale wiedziałem, że mam macierzysty element DOM, od którego zaczyna się wysokość paska.

Zamiast zadzierać z javascript, użyłem odpowiedzi CSS ( NIE ZAWSZE DOBRY POMYSŁ )! :)

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

Tak, to prawda, zamiast pozycjonowania DOM, odwróciłem jego rodzica do góry nogami w css.

W moim scenariuszu będzie działać! Być może także dla innych! Bez ognia! :)

Pogrindis
źródło
1
To może nie być najlepszy możliwy sposób, ale jest to dość niesamowite, bardzo kreatywne podejście. Ja od dawna zmagam się z tym problemem, moje główne kwestie: brak ustalonych wysokości, musi być całkowicie płynny (za mało znaków, aby wyjaśnić, dlaczego wyświetlanie: stół nie działa). Wszystko pięknie sobie z tym poradziło; obrazy wewnątrz div są również odwracane, kiedy to się dzieje, więc użyłem klasy na tych elementach, aby je odwrócić. Wygląda dokładnie tak, jak powinien, bez ustalonych wysokości. Trochę zuchwały, ale hej, czasem nie ma lepszej alternatywy. Dobra robota!
tganyan
4

Oto sposób uniknięcia absolutnych div i tabel, jeśli znasz wzrost rodzica:

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

Przykład

formatc
źródło
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
źródło