Co robi display: flex
Ustaw display: flex na rodzicu, a jego bezpośrednie dzieci ustawią się w rzędzie, obok siebie, i rozciągną do tej samej wysokości. Ta jedna deklaracja zastępuje float, inline-block i większość sztuczek z pozycjonowaniem przy układaniu rzędu elementów.
W pierwszym pudełku każdy div zajmuje całą linię. W drugim trzy elementy stoją w jednym rzędzie, każdy tylko tak szeroki jak jego treść, a One i Three rozciągają się do wysokości Two. Zmienił się tylko rodzic: display: flex ustawia się na kontenerze, nigdy na elementach.
Edytor flexboxa na żywo
Wybierz wartości i obserwuj, jak elementy się przesuwają. Linia kodu pod pudełkiem to CSS dla tego, co widzisz, a lista pod nią pokazuje, gdzie przeglądarka naprawdę umieściła każdy element, zmierzone przez getBoundingClientRect().
Co warto wypróbować:
justify-content: space-between: element 1 ląduje na x 0, a element 3 dotyka przeciwnej krawędzi.align-items: center: trzy elementy zachowują własne wysokości, a ich środki się wyrównują. Przy domyślnymstretchelement 1 nie ma własnej wysokości i wypełnia całe 170px kontenera.flex-direction: column: terazjustify-contentprzesuwa elementy w pionie, aalign-itemsw poziomie. Obie właściwości podążają za osiami, a nie za ekranem.
Oś główna i oś poprzeczna
Każdy kontener flex ma dwie osie. Oś główna to kierunek, w którym płyną elementy, ustawiany przez flex-direction. Oś poprzeczna biegnie w poprzek niej.
flex-direction | Oś główna | Oś poprzeczna | justify-content przesuwa elementy | align-items przesuwa elementy |
|---|---|---|---|---|
row (domyślnie) | pozioma, w kolejności czytania | pionowa | w poziomie | w pionie |
row-reverse | pozioma, odwrócona | pionowa | w poziomie | w pionie |
column | pionowa, od góry do dołu | pozioma | w pionie | w poziomie |
column-reverse | pionowa, od dołu do góry | pozioma | w pionie | w poziomie |
Na stronie pisanej od prawej do lewej (dir="rtl") row zaczyna się przy prawej krawędzi, bo oś główna podąża za kierunkiem pisania.
Właściwości kontenera
Te właściwości ustawia się na elemencie z display: flex:
| Właściwość | Co robi | Domyślnie |
|---|---|---|
flex-direction | Rząd albo kolumna i w którą stronę | row |
flex-wrap | Czy elementy przechodzą do nowej linii, gdy zabraknie miejsca | nowrap |
flex-flow | Skrót dla flex-direction i flex-wrap | row nowrap |
justify-content | Położenie i odstępy wzdłuż osi głównej | normal (działa jak flex-start) |
align-items | Położenie elementów wzdłuż osi poprzecznej | normal (działa jak stretch) |
align-content | Odstępy między liniami, gdy elementy się zawijają | normal |
gap | Odstęp między elementami (row-gap, column-gap) | 0 |
justify-content i align-items mają własną stronę ze wszystkimi wartościami: justify-content i align-items. Zawijanie i kierunek omawia strona o flex-wrap.
Właściwości elementów: flex-grow, flex-shrink, flex-basis
Te właściwości ustawia się na dzieciach i decydują one, jak dzielą szerokość kontenera:
flex-basis: rozmiar, od którego element zaczyna, zanim wolne miejsce zostanie rozdzielone (autooznacza "użyj mojej szerokości albo treści").flex-grow: ile udziałów pozostałego miejsca bierze element.0oznacza, że nigdy nie rośnie.flex-shrink: ile element oddaje, gdy brakuje miejsca.0oznacza, że nigdy się nie kurczy.
Skrót flex ustawia wszystkie trzy:
| Piszesz | Co oznacza | Zachowanie |
|---|---|---|
flex: initial (domyślnie) | 0 1 auto | Rozmiar treści, może się kurczyć, nigdy nie rośnie |
flex: 1 | 1 1 0% | Zaczyna od zera i bierze równy udział w miejscu |
flex: auto | 1 1 auto | Rozmiar treści plus udział w pozostałym miejscu |
flex: none | 0 0 auto | Dokładnie jego treść albo szerokość, nigdy nie rośnie ani się nie kurczy |
flex: 2 | 2 1 0% | Dwa razy większy udział niż element z flex: 1 |
Każdy rząd ma 480px szerokości wewnątrz paddingu, a dwa odstępy po 8px zostawiają elementom 464px. Wypisane szerokości pokazują, jak je rozdzielono: po około 155px w pierwszym rzędzie, 116 + 232 + 116 w drugim (element z flex: 2 dostaje dwa razy większy udział niż każdy sąsiad) i 100 + 372 w trzecim, gdzie element z flex: none zachowuje swoją szerokość, a drugi bierze całą resztę.
Prawdziwe układy z flexboxem
Nagłówek z logo na początku i odnośnikami na końcu to najczęstszy układ flex. margin-inline-start: auto na jednym elemencie zjada całe wolne miejsce przed nim i spycha go razem ze wszystkim, co po nim następuje, na koniec:
align-items: center wyrównuje większy tekst logo z odnośnikami, a gap rozsuwa odnośniki bez marginesów, które trzeba by kasować na ostatnim.
Drugi codzienny wzorzec to wiersz z mediami: ikona o stałym rozmiarze i tekst, który bierze resztę i zawija się we własnej kolumnie.
flex: none to gwarancja. Elementy flex domyślnie się kurczą, więc jeśli usuniesz tę właściwość z koła, a z tekstu usuniesz też flex: 1, akapit ściśnie koło do szerokości około 23px: powstanie owal. Do wyśrodkowania jednej rzeczy w pudełku flexbox potrzebuje dwóch linii (justify-content: center; align-items: center); strona o wyśrodkowaniu diva porównuje to z innymi sposobami.
order i dostępność
Właściwość order i kierunki -reverse zmieniają miejsce, w którym elementy się pojawiają, a nie ich miejsce w HTML. Czytniki ekranu i klawisz Tab nadal podążają za kolejnością w HTML, więc osoba korzystająca z klawiatury może przeskoczyć z pierwszego odnośnika na ekranie do ostatniego. Używaj ich tylko do dekoracji; gdy kolejność coś znaczy, zmień HTML.
Flexbox czy grid
Flexbox działa w jednym kierunku naraz: elementy w rzędzie dopasowują rozmiar do treści, a druga linia (przy zawijaniu) nie wyrównuje się z pierwszą. Grid działa w dwóch: definiujesz kolumny i wiersze, a elementy się w nie wpasowują. Pasek nawigacji, pasek narzędzi albo wiersz formularza to flexbox; galeria albo strona z panelem bocznym to grid.
Częste błędy
display: flexna elemencie zamiast na rodzicu.display: flexdostaje kontener; jego dzieci to elementy.- Oczekiwanie, że
align-itemsprzesunie elementy w pionie bez wysokości. Jeśli kontener jest tylko tak wysoki jak jego najwyższy element, nie ma miejsca na przesunięcie. Nadaj kontenerowi wysokość; w przeciwnym razie właściwość działa, tylko nie ma nic do zrobienia. - Tekst, który wystaje zamiast się kurczyć. Elementy flex mają
min-width: auto. Dodajmin-width: 0do elementu, który ma się kurczyć. - Używanie
flex: 1i zdziwienie, że szerokości się różnią. Elementy zflex: 1dzielą miejsce po równo, ale element, którego treść się nie mieści (długi adres URL, obraz), nie skurczy się poniżej niej. To też naprawiamin-width: 0. - Marginesy między elementami. Użyj
gapna kontenerze; działa tylko między elementami. - Niepotrzebne zagnieżdżanie flex. Elementami flex są tylko bezpośrednie dzieci. Wnuki podlegają zwykłemu układowi, chyba że ich własny rodzic też ma
display: flex.
Najczęściej zadawane pytania
Co robi display: flex?
Zamienia element w kontener flex. Jego bezpośrednie dzieci stają się elementami flex i domyślnie układają się w rzędzie, obok siebie, rozciągnięte do tej samej wysokości, a właściwości takie jak justify-content, align-items i gap sterują tym, jak dzielą miejsce.
Co oznacza flex: 1?
flex: 1 to skrót od flex: 1 1 0%: element może rosnąć (flex-grow: 1), może się kurczyć (flex-shrink: 1) i zaczyna od rozmiaru zero (flex-basis: 0%). Elementy, które wszystkie mają flex: 1, dzielą wolne miejsce po równo, więc mają tę samą szerokość, chyba że ich treść się nie mieści.
Czym różni się justify-content od align-items?
justify-content ustawia elementy wzdłuż osi głównej (w rzędzie w poziomie), a align-items wzdłuż osi poprzecznej (w rzędzie w pionie). Przy flex-direction: column osie się zamieniają, więc justify-content działa w pionie.
Flexbox czy grid?
Używaj flexboxa dla pojedynczego rzędu albo kolumny, których elementy dopasowują rozmiar do treści: pasków nawigacji, grup przycisków, etykiety obok pola. Używaj grida, gdy chcesz wierszy i kolumn wyrównanych względem siebie, na przykład siatki kart albo układu strony.
Dlaczego mój element flex wystaje z kontenera?
Element flex ma domyślnie min-width: auto, więc nie chce się skurczyć poniżej szerokości swojego najdłuższego słowa albo najszerszego dziecka. Ustaw na elemencie min-width: 0 (albo overflow: hidden), żeby mógł się skurczyć, na przykład żeby zadziałało text-overflow: ellipsis.
Czy flexbox działa na elementach liniowych, takich jak span?
Tak. Każdy element z display: flex jest kontenerem flex, a jego dzieci stają się elementami flex bez względu na ich własną wartość display, więc dzieci <span> przestają być liniowe i przyjmują szerokość, wysokość i margines jak bloki.