Jak zrobić pływającą div 100% wysokości swojego rodzica?

256

Oto HTML:

<div id="outer">
    <div id="inner"></div>
    Test
</div>

A oto CSS:

#inner {
  float: left;
  height: 100%;
}

Po sprawdzeniu za pomocą narzędzi dla programistów Chrome wewnętrzna div uzyskuje wysokość 0 pikseli.

Jak mogę zmusić go do 100% wysokości div rodzica?

Nathan Osman
źródło
1
Więc chcesz, żeby tekst w zewnętrznej div (nie w wewnętrznej div), ale pływająca wewnętrzna div była wysokością zewnętrznej div?
edl
Jaki efekt końcowy próbujesz osiągnąć? Myślę, że moje zamieszanie polega na tym, że jeśli wewnętrzny podział jest tak wysoki jak zewnętrzny, a zewnętrzny jest tak wysoki jak tekst, to czy to nie to samo, co mieć tekst w wewnętrznym div?
edl
2
@edl: Tak, jest :) Powodem, dla którego chcę tego w ten sposób, jest to, że wewnętrzny div ma obraz jako tło. Tekst musi być obok niego. Oba muszą znajdować się wewnątrz zewnętrznego div, ponieważ ma również obraz tła.
Nathan Osman,
3
Zobacz także stackoverflow.com/questions/1122381
Chadwick
2
Widzenie i wypróbowywanie odpowiedzi na to pytanie było po prostu przygnębiające.
EternalHour

Odpowiedzi:

125

Aby #outerwysokość opierała się na jej treści i na tej #innerpodstawie opierała wysokość, należy bezwzględnie ustawić oba elementy.

Więcej szczegółów można znaleźć w specyfikacji właściwości css height , ale w zasadzie #innermusi ona ignorować #outerwysokość, jeśli #outerwysokość jest auto, chyba że #outer jest ustawiona absolutnie. Wówczas #innerwysokość będzie wynosić 0, chyba że #inner sam jest umieszczony całkowicie.

<style>
    #outer {
        position:absolute; 
        height:auto; width:200px; 
        border: 1px solid red; 
    }
    #inner {
        position:absolute; 
        height:100%; 
        width:20px; 
        border: 1px solid black; 
    }
</style>

<div id='outer'>
    <div id='inner'>
    </div>
    text
</div>

Jednak ... pozycjonując #innerabsolutnie, floatustawienie zostanie zignorowane, więc musisz #innerjawnie wybrać szerokość dla i dodać dopełnienie, #outeraby sfałszować zawijanie tekstu, które podejrzewam, że chcesz. Na przykład poniżej wypełnienie #outerma szerokość #inner+3. Dogodnie (ponieważ celem było uzyskanie #innerwysokości do 100%) nie ma potrzeby zawijania tekstu pod spodem #inner, więc będzie wyglądał tak, jakby #innerbył pływający.

<style>
    #outer2{
        padding-left: 23px;
        position:absolute; 
        height:auto; 
        width:200px; 
        border: 1px solid red; 
    }
    #inner2{
        left:0;
        position:absolute; 
        height:100%; 
        width:20px; 
        border: 1px solid black; 
   }
</style>

<div id='outer2'>
    <div id='inner2'>
    </div>
    text
</div>

Usunąłem moją poprzednią odpowiedź, ponieważ była ona oparta na zbyt wielu błędnych założeniach dotyczących twojego celu.

Chadwick
źródło
118
Hmm .. pytanie dotyczyło dywizji Floated. Odpowiedziałeś na temat absolutnie div div
Mihkel L.,
57
Nigdy nie przestaję zaskakiwać, jak skomplikowane jest osiąganie niesamowicie prostych rzeczy w HTML/CSS:)
Yuriy Nakonechnyy
15
Jakiś sposób to zrobić bez szerokości kodowania? Nie nadaje się do reagujących pojemników.
Jake Wilson,
23
Nie wiem, dlaczego tak bardzo zostało to zaakceptowane i ocenione. Pytanie dotyczy pływających div, które przywiodły mnie tutaj z moich poszukiwań, a zamiast tego odpowiada absolutnie pozycjonowany div.
Matt K
2
Jak sprawić, by pojemnik pływający pasował do niego pionowo? Nie zmuszając go już do unoszenia się na wodzie! Ha ha. Niezła próba i wystarczająco blisko, by uznać ją za przydatną.
Rolf,
124

Dla rodzica:

display: flex;

Powinieneś dodać kilka prefiksów http://css-tricks.com/using-flexbox/

Edycja: Jedyną wadą jest IE jak zwykle, IE9 nie obsługuje flex. http://caniuse.com/flexbox

Edycja 2: Jak zauważył @toddsby, wyrównywanie elementów jest dla elementu nadrzędnego, a jego domyślną wartością jest w rzeczywistości rozciągnięcie . Jeśli chcesz mieć inną wartość dla dziecka, istnieje właściwość align-self.

Edycja 3: jsFiddle: https://jsfiddle.net/bv71tms5/2/

Aiphee
źródło
3
Należy zauważyć, że działa to tylko w nowoczesnych przeglądarkach i nawet wtedy wymaga prefiksów dostawcy.
kontur
12
Dziwi mnie, że na to rozwiązanie nie zwrócono większej uwagi, biorąc pod uwagę, że pierwotne pytanie wymaga, aby div div był zmienny i cała pozycja: absolutne rozwiązania naprawdę rzucają klucz w prace w większości sytuacji, w których używasz float. To rozwiązanie zapewnia świetne rozwiązanie, w którym skutki uboczne pozycji: absolut nie stanowią problemu, a jeśli chcesz kopać dalej, możesz uzyskać całkiem dobrą kompatybilność z różnymi przeglądarkami.
Łukasz
Oto odpowiedź tutaj. IE9 niedługo wyjdzie, równie dobrze może pomóc, dając dobry, solidny kopniak. To rozwiązanie jest takie fajne, proste i łatwe ... Skończyłem hackować razem alternatywne rozwiązania. ;)
jrista
2
Zgodnie z najnowszą specyfikacją Flexbox: patrz w3.org/TR/css-flexbox-1/#align-items-property . align-items: stretch;nie jest wymagane, ponieważ jest to wartość domyślna. Należy to również zdefiniować na rodzicu, a nie na dziecku.
toddsby
1
Dodano skrzypce w odpowiedzi. @Tigran
Aiphee
77

W rzeczywistości, dopóki element macierzysty jest ustawiony, możesz ustawić wzrost dziecka na 100%. Mianowicie, w przypadku, gdy nie chcesz, aby rodzic był absolutnie ustawiony. Pozwól, że wyjaśnię dalej:

<style>
    #outer2 {
        padding-left: 23px;
        position: relative; 
        height:auto; 
        width:200px; 
        border: 1px solid red; 
    }
    #inner2 {
        left:0;
        position:absolute; 
        height:100%; 
        width:20px; 
        border: 1px solid black; 
    }
</style>

<div id='outer2'>
    <div id='inner2'>
    </div>
</div>
Nathaniel Schweinberg
źródło
14
Fajnie, to jest mniej ograniczające niż wymóg Chadwicka position:absolute(który mógłby kolidować ze stylami strony)
Henry
3
To może być tylko ja, ale mam problemy, jeśli pasek boczny jest większy niż treść. Kolor tła zatrzyma się w kontenerze nadrzędnym, ale zawartość paska bocznego przepełni się poza nadrzędnym.
Howdy_McGee
Jest to o wiele bardziej elastyczne rozwiązanie i nawet jeśli masz kilka pływających elementów potomnych, wydaje się, że akceptowalną wadą jest stylowe ustawienie ich przesunięcia absolutnie. +1
kontur
Dziękuję bardzo dużo. Moje konkretne rozwiązanie zamieściłem jako odpowiedź na inne pytanie na SO: stackoverflow.com/a/31749164/84661 .
Brian Haak
24

Tak długo, jak nie potrzebujesz obsługiwać wersji Internet Explorera wcześniejszych niż IE8, możesz tego użyć display: table-cell:

HTML:

<div class="outer">
    <div class="inner">
        <p>Menu or Whatever</p>
    </div>
    <div class="inner">
        <p>Page contents...</p>
    </div>
</div>

CSS:

.inner {
    display: table-cell;
}

Zmusi to każdy element z .innerklasą do zajmowania pełnej wysokości elementu nadrzędnego.

Nathan Osman
źródło
Chociaż to zadziała, nie wyświetli marginesu, nawet jeśli go określisz. To rozwiązanie zawiedzie, jeśli chcesz przypisać margines. Możesz przypisać padding jako obejście, ale jak byś to rozwiązał, gdybyś potrzebował marginesu (a nie padding)?
Devner,
13
Czy coś mi umyka? Twoje pytanie wymaga, aby element pływający miał wysokość 100%. Gdy pływający display: table-cell;element nie wypełnia już wysokości swojego pojemnika? Coś mi brakuje, bo to twoje pytanie ...?
user56reinstatemonica8
16

Zrobiłem przykład rozwiązującego problem.

Musisz zrobić owijkę, unieść ją na wodzie, a następnie ustawić absolutnie div i dać mu 100% wysokości.

HTML

<div class="container">
    <div class="left">"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." </div>
  <div class="right-wrapper">
    <div class="right">"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." </div>
  </div>
  <div class="clear">&nbsp;</div>
</div>

CSS:

.container {
    width: 100%;
    position:relative;
}
.left {
    width: 50%;
    background-color: rgba(0, 0, 255, 0.6);
    float: left;
}
.right-wrapper {
    width: 48%;
    float: left;
}
.right {
    height: 100%;
    position: absolute;
}

Wyjaśnienie: .right div jest absolutnie ustawiony. Oznacza to, że jego szerokość i wysokość oraz górne i lewe pozycje zostaną obliczone na podstawie pierwszego elementu div absolutnie lub względnie pozycjonowanego TYLKO, jeśli właściwości width lub height są wyraźnie zadeklarowane w CSS; jeśli nie są one jednoznacznie zadeklarowane, właściwości te zostaną obliczone na podstawie kontenera nadrzędnego (.right-wrapper).

Zatem 100% wysokości DIV zostanie obliczona na podstawie wysokości końcowej kontenera, a pozycja końcowa pozycji prawej zostanie obliczona na podstawie kontenera rodzica.

Mandarinazul
źródło
1
Jest to solidne rozwiązanie w sytuacjach, w których można zagwarantować, że zawartość .rightkolumny jest krótsza niż zawartość .leftkolumny. Na przykład, jeśli używasz tego w komponencie, w którym .leftkolumna ma treść o różnych rozmiarach, a prawa kolumna po prostu wyświetla strzałkę do strony szczegółów, to rozwiązanie działa dobrze. +1 za to
Zachary Kniebel
15

Oto prostszy sposób na osiągnięcie tego:

  1. Ustaw wyświetlanie kontenera trzech elementów (#outer): tabela
  2. I ustaw same elementy (#inner) display: table-cell
  3. Usuń element pływający.
  4. Sukces.
#outer{
    display: table;
}
#inner {
    display: table-cell;
    float: none;
}

Dzięki @Itay in Floated div, 100% wysokości

leopinzon
źródło
8

Jeśli jesteś przygotowany na użycie małej jQuery, odpowiedź jest prosta!

$(function() {
    $('.parent').find('.child').css('height', $('.parent').innerHeight());
});

Działa to dobrze w przypadku przestawiania pojedynczego elementu na bok ze 100% wysokością jego elementu nadrzędnego, podczas gdy inne elementy pływające, które normalnie byłyby owijane, są trzymane z jednej strony.

Mam nadzieję, że pomoże to innym fanom jQuery.

Obi-Dan
źródło
18
Wydaje się przesadą rzucanie javascript na ten problem z układem.
kontur
1
Jako ktoś, kto musi się rozwijać w IE: DZIĘKUJĘ!
Rook
1
Może trochę przesada, ale to piękna odpowiedź, dzięki!
Martin
1
Zgadzam się, że wszystkie problemy z pozycjonowaniem powinny być rozwiązane bez JS.
michaeluskov
1
Używanie JS AND jQuery
ViliusL
3

To jest przykładowy kod dla systemu siatki o równej wysokości.

#outer{
width: 100%;
margin-top: 1rem;
display: flex;
height:auto;
}

Powyżej znajduje się CSS dla zewnętrznego div

#inner{
width: 20%;
float: left;
border: 1px solid;
}

Powyżej jest wewnętrzny div

Mam nadzieję, że ci to pomoże

Biswajit
źródło
1

To mi pomogło.

#outer {
    position:relative;
}
#inner {
    position:absolute;
    top:0;
    left:0px;
    right:0px;
    height:100%;
}

Zmień w prawo: i w lewo: aby ustawić preferowaną # szerokość wewnętrzną.

sevenkey
źródło
1

Podobny przypadek, gdy potrzebujesz kilku elementów potomnych o tej samej wysokości, można rozwiązać za pomocą Flexbox:

https://css-tricks.com/using-flexbox/

Wszystkie elementy ustawione display: flex;dla elementów nadrzędnych i flex: 1;podrzędnych będą miały tę samą wysokość.

romaroma
źródło
-1

próbować

#outer{overflow: auto;}

pokaż więcej opcji w: Jak uchronić rodziców elementów pływających przed zapadnięciem się?

Rodrigo Barreiro
źródło
opcja „przepełnienie: ukryte” wydaje się działać lepiej, ponieważ nie ma szansy na wyrzucenie ...
Rodrigo Barreiro
Jeśli znalazłeś lepsze rozwiązanie, możesz edytować swoją odpowiedź. Dobrze byłoby również dodać do swojej odpowiedzi więcej informacji, na przykład informacje podane w łączu.
Kaczor Donald