Mam pojemnik div
z dwójką dzieci. Pierwsze dziecko ma określony wzrost. Jak sprawić, aby drugie dziecko zajmowało „wolną przestrzeń” pojemnika div
bez podawania określonej wysokości?
W tym przykładzie różowy div
powinien zajmować również białą przestrzeń.
Podobne do tego pytania: jak sprawić, by div zajmował pozostałą wysokość?
Ale nie chcę podawać pozycji absolutnej .
Odpowiedzi:
Rozszerzanie
#down
dziecka, aby wypełnić pozostałą przestrzeń,#container
można osiągnąć na różne sposoby, w zależności od obsługi przeglądarki, którą chcesz osiągnąć i od tego, czy#up
ma określoną wysokość, czy nie .Próbki
Pokaż fragment kodu
Krata
grid
Układ CSS oferuje jeszcze jedną opcję, chociaż może nie być tak prosta jak model Flexbox. Jednak wymaga tylko stylizacji elementu kontenera:Plik
grid-template-rows
Wyznacza pierwszy wiersz w postaci stałej 100px wysokości i pozostają rzędy rozciągają się automatycznie wypełniając pozostałą przestrzeń.Jestem prawie pewien, że IE11 wymaga
-ms-
prefiksów, więc upewnij się, że sprawdziłeś funkcjonalność w przeglądarkach, które chcesz obsługiwać.Flexbox
Moduł
flexbox
CSS3 Flexible Box Layout Module ( ) jest teraz dobrze obsługiwany i może być bardzo łatwy do wdrożenia. Ponieważ jest elastyczny, działa nawet wtedy, gdy#up
nie ma określonej wysokości.Ważne jest, aby pamiętać, że obsługa IE10 i IE11 dla niektórych właściwości flexboksa może być wadliwa, a IE9 lub starsze nie mają żadnej obsługi.
Obliczona wysokość
Innym łatwym rozwiązaniem jest użycie jednostki funkcjonalnej CSS3
calc
, jak wskazuje Alvaro w swojej odpowiedzi , ale wymaga, aby wzrost pierwszego dziecka był znaną wartością:Jest dość szeroko obsługiwany, z jedynymi godnymi uwagi wyjątkami: <= IE8 lub Safari 5 (brak wsparcia) i IE9 (częściowe wsparcie). Niektóre inne problemy obejmują używanie programu calc w połączeniu z transform lub box-shadow , więc jeśli Cię to niepokoi, upewnij się, że wykonałeś test w wielu przeglądarkach.
Inne alternatywy
Jeśli potrzebne jest wsparcie starszych, można dodać
height:100%;
do#down
uczyni różową div pełnej wysokości, z jednym zastrzeżeniem. Spowoduje to przepełnienie pojemnika, ponieważ#up
popycha go w dół.Dlatego możesz dodać
overflow: hidden;
do kontenera, aby to naprawić.Alternatywnie, jeśli wysokość
#up
jest stała, możesz umieścić ją całkowicie w pojemniku i dodać wyściółkę do#down
.A jeszcze inną opcją byłoby użycie wyświetlacza tabeli:
źródło
position: relative;
pozycjonuje go względem kontenera, a nie okna. To powinno być realną opcją.Minęły prawie dwa lata, odkąd zadałem to pytanie. Właśnie wymyśliłem css calc (), które rozwiązuje ten problem, który miałem i pomyślałem, że byłoby miło dodać go na wypadek, gdyby ktoś miał ten sam problem. (Nawiasem mówiąc, ostatecznie użyłem pozycji bezwzględnej).
http://jsfiddle.net/S8g4E/955/
Oto plik css
Więcej informacji na ten temat znajdziesz tutaj: http://css-tricks.com/a-couple-of-use-cases-for-calc/
Obsługa przeglądarek: http://caniuse.com/#feat=calc
źródło
calc
gdzie obsługa szerokiej przeglądarki nie jest tak ważna (IE8 i starsze oraz Safari 5 nie obsługują tego).#up
wysokością?Moja odpowiedź używa tylko CSS i nie używa overflow: hidden ani display: table-row. Wymaga to, aby pierwsze dziecko naprawdę miało określony wzrost, ale w swoim pytaniu stwierdzasz, że tylko drugie dziecko musi mieć nieokreślony wzrost, więc uważam, że powinieneś to zaakceptować.
html
css
http://jsfiddle.net/S8g4E/288/
źródło
Abstrakcyjny
Nie znalazłem w pełni satysfakcjonującej odpowiedzi, więc musiałem sam się tego dowiedzieć.
Moje wymagania:
calc()
nie należy używać, ponieważ pozostały element nie powinien nic wiedzieć o innych rozmiarach elementów;Rozwiązanie
flex-grow: 1
dla wszystkich bezpośrednich rodziców z wyliczoną wysokością (jeśli istnieje) i elementem aby zajmowały całą pozostałą przestrzeń, gdy rozmiar zawartości elementu jest mniejszy;flex-shrink: 0
dla wszystkich elementów elastycznych o stałej wysokości aby nie zmniejszyły się, gdy rozmiar zawartości elementu jest większy niż pozostały rozmiar przestrzeni;overflow: hidden
dla wszystkich bezpośrednich rodziców z obliczoną wysokością (jeśli istnieje), aby wyłączyć przewijanie i zabronić wyświetlania zawartości przepełnienia;overflow: auto
do elementu , aby umożliwić przewijanie wewnątrz niego.JSFiddle (element ma bezpośrednich rodziców z wyliczoną wysokością)
JSFiddle (prosty przypadek: brak bezpośrednich rodziców z obliczoną wysokością)
źródło
sprawdź demo - http://jsfiddle.net/S8g4E/6/
użyj css -
źródło
height: 1px
do,#up
aby mieć pewność, że zajmuje minimalną wysokość. Oto obsługa przeglądarki dladisplay: table
: caniuse.com/css-tableChyba że się nie rozumiem, możesz po prostu dodać
height: 100%;
ioverflow:hidden;
do#down
.DEMO na żywo
Edycja: ponieważ nie chcesz używać
overflow:hidden;
, możesz użyćdisplay: table;
w tym scenariuszu; jednak nie jest obsługiwany przed IE 8. (display: table;
wsparcie )DEMO na żywo
Uwaga: Powiedziałeś, że chcesz, aby
#down
wysokość była równa#container
wysokości minus#up
wysokość.display:table;
Rozwiązanie robi dokładnie to i to jsfiddle wcieli że dość wyraźnie.źródło
overflow:hidden
do, aby ukryć dodatkową zawartość.Możesz używać pływaków do wypychania zawartości w dół:
http://jsfiddle.net/S8g4E/5/
Masz kontener o stałym rozmiarze:
Treść może przepływać obok pływaka. O ile nie ustawimy pływaka na pełną szerokość:
Podczas gdy
#up
i#down
udostępnij najwyższą pozycję,#down
zawartość może zaczynać się tylko po dolnej części pływającej#up
:źródło
#up
faktycznie obejmuje górną część#down
: jsfiddle.net/thirtydot/S8g4E/9#up
, to prawdopodobnie jest to akceptowalne.Nie jestem pewien, czy można to zrobić wyłącznie za pomocą CSS, chyba że czujesz się komfortowo w udawaniu iluzji. Może używać odpowiedź Josh mein, a zestaw
#container
dooverflow:hidden
.Oto rozwiązanie jQuery:
źródło