Znalazłem sposób, aby kontener div zajmował co najmniej pełną wysokość strony, ustawiając min-height: 100%;
. Jednak gdy dodam zagnieżdżony element div i ustawię height: 100%;
go, nie rozciąga się on do wysokości kontenera. Czy jest sposób, aby to naprawić?
html, body {
height: 100%;
margin: 0;
}
#containment {
min-height: 100%;
background: pink;
}
#containment-shadow-left {
height: 100%;
background: aqua;
}
<div id="containment">
<div id="containment-shadow-left">
Hello World!
</div>
</div>
display:flex
iflex-direction:column
i dać dzieckuflex:1
.Odpowiedzi:
To jest zgłoszony błąd webkita (chrome / safari). Dzieci rodziców z minimalnym wzrostem nie mogą dziedziczyć właściwości height: https://bugs.webkit.org/show_bug.cgi?id=26559
Najwyraźniej dotyczy to również Firefoksa (w tej chwili nie można testować w IE)
Możliwe obejście:
Błąd nie pojawia się, gdy element wewnętrzny ma pozycjonowanie bezwzględne.
Zobacz http://jsfiddle.net/xrebB/
Edytuj 10 kwietnia 2014 r
Ponieważ obecnie pracuję nad projektem, dla którego naprawdę potrzebuję kontenerów nadrzędnych
min-height
i elementów podrzędnych dziedziczących wysokość kontenera, przeprowadziłem dalsze badania.Po pierwsze: nie jestem już taki pewien, czy obecne zachowanie przeglądarki naprawdę jest błędem. Specyfikacje CSS2.1 mówią:
Jeśli umieszczę minimalną wysokość w moim kontenerze, nie określam jawnie jego wysokości - więc mój element powinien uzyskać
auto
wysokość. I to jest dokładnie to, co robi Webkit - i wszystkie inne przeglądarki.Po drugie, obejście, które znalazłem:
Jeśli ustawię mój element kontenera na
display:table
withheight:inherit
, działa dokładnie tak samo, jakbym dał mumin-height
100%. I - co ważniejsze - jeśli ustawię nadisplay:table-cell
to element podrzędny , doskonale odziedziczy wysokość elementu kontenera - czy to 100%, czy więcej.Pełny CSS:
Znaczniki:
Zobacz http://jsfiddle.net/xrebB/54/ .
źródło
Dodaj
height: 1px
do kontenera nadrzędnego. Działa w Chrome, FF, Safari.źródło
height: 1px;
nie nadpisze minimalnej wysokości. Wręcz przeciwnie. To najlepsze rozwiązanie tutaj ... demo: jsbin.com/mosaboyo/1/editheight: 1px;
działa stackoverflow.com/questions/2341821/height100-vs-min-height100min-height
. Np. Jeśli jest wystarczająco dużo tekstu, to się przepełni. Zobacz jsbin.com/vuyapitizo/1Pomyślałem, że podzielę się tym, ponieważ nigdzie tego nie widziałem i właśnie to naprawiłem moje rozwiązanie.
ROZWIĄZANIE :
min-height: inherit;
Miałem rodzica z określonym minimalnym wzrostem i potrzebowałem dziecka, które również miało ten wzrost.
W ten sposób dziecko zachowuje się teraz jako wysokość 100% minimalnego wzrostu.
Mam nadzieję, że niektórzy uznają to za przydatne :)
źródło
min-height
. Gdy wzrost rodziców jest większy, dziecko się nie rozszerzy.Zostało to dodane w komentarzu przez @jackocnr, ale przegapiłem to. Myślę, że w przypadku nowoczesnych przeglądarek jest to najlepsze podejście.
Sprawia, że element wewnętrzny wypełnia cały kontener, jeśli jest za mały, ale zwiększa wysokość kontenera, jeśli jest zbyt duży.
źródło
Rozwiązanie Kushagra Gour działa (przynajmniej w Chrome i IE) i rozwiązuje pierwotny problem bez konieczności używania
display: table;
idisplay: table-cell;
. Zobacz plunker: http://plnkr.co/edit/ULEgY1FDCsk8yiRTfOWUUstawienie
min-height: 100%; height: 1px;
na zewnętrznym divie powoduje, że jego rzeczywista wysokość wynosi co najmniej 100%, zgodnie z wymaganiami. Pozwala również wewnętrznemu elementowi div na prawidłowe dziedziczenie wysokości.źródło
Oprócz istniejących odpowiedzi dostępne są również jednostki rzutni
vh
. Prosty fragment poniżej. Oczywiście można go również używać razemcalc()
, np.min-height: calc(100vh - 200px);
Gdy nagłówek strony i stopka mają200px
razem wysokość.źródło
Nie wierzę, że to błąd przeglądarek. Wszystkie zachowują się w ten sam sposób - to znaczy, gdy przestaniesz określać wyraźne wysokości, min-height jest w zasadzie „ostatnim krokiem”.
Wydaje się, że dokładnie tak sugeruje specyfikacja CSS 2.1: http://www.w3.org/TR/CSS2/visudet.html#the-height-property
Dlatego, ponieważ element
min-height
nadrzędny nie ma wyraźnegoheight
zestawu właściwości, domyślnie jest ustawiony na auto.Istnieje kilka sposobów obejścia tego, prawdopodobnie przy użyciu
display: table-cell
lub nowszych stylów, takich jak flexbox, jeśli jest to możliwe w przeglądarkach docelowych odbiorców. W pewnych sytuacjach można to również odwrócić, używając właściwościtop
ibottom
na bezwzględnie pozycjonowanym elemencie wewnętrznym, który daje 100% wysokości bez określania tego.źródło
Chociaż
display: flex;
zostało to tutaj zasugerowane, rozważ użyciedisplay: grid;
teraz, gdy jest szeroko obsługiwany . Domyślnie jedyny element podrzędny siatki całkowicie wypełnia element nadrzędny.źródło
Dla pracowników Google:
To obejście jquery powoduje, że #containment automatycznie pobiera wysokość (przez, height: auto), a następnie pobiera rzeczywistą wysokość przypisaną jako wartość w pikselach.
źródło
Obecnie najlepszym sposobem na osiągnięcie tego jest użycie
display: flex;
. Jednak możesz napotkać problem podczas próby obsługi IE11. Według https://caniuse.com przy użyciu flexbox:Rozwiązanie zgodne z przeglądarką Internet Explorer
Rozwiązaniem jest użycie
display: table;
na rodzica idisplay: table-row;
na dziecku zarównoheight: 100%;
jako zamiennikmin-height: 100%;
.Większość rozwiązań Wymienione tu użyć
display:
table
,table-row
i / lubtable-cell
, ale nie powielać to samo zachowanie jakmin-height: 100%;
, który jest:height
własności);min-height
;Podczas korzystania z tego rozwiązania zachowanie jest takie samo, a właściwość
min-height
nie jest potrzebna, co pozwala ominąć błąd.Wyjaśnienie
Powodem, dla którego to działa, jest to, że w przeciwieństwie do większości elementów, elementy używające
display:
table
itable-row
zawsze będą tak wysokie jak ich zawartość. To sprawia, że ichheight
własność zachowuje się podobnie domin-height
.Rozwiązanie w akcji
źródło
Kolejne rozwiązanie JS, które jest łatwe i można go użyć, aby uniknąć niełatwego rozwiązania CSS lub dodatkowego znacznika / hacky.
W / jQuery:
Dyrektywa Angular:
Do użycia w ten sposób:
źródło
To zwykle działa dla mnie: