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?


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,


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.


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/


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>

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.


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.


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


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.


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


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


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ść.


-1

próbować

#outer{overflow: auto;}

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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.