flex-wrap: jedna linia albo tyle, ile trzeba
Domyślnie kontener flex trzyma wszystkie elementy w jednej linii (flex-wrap: nowrap) i kurczy je, żeby się zmieściły. flex-wrap: wrap pozwala im zachować rozmiar i przejść do następnej linii:
Każdy element chce mieć 100px, a jest ich pięć w pudełku o szerokości 340px. Pięć elementów i cztery odstępy po 8px wymagają 532px, więc bez zawijania każdy element jest ściśnięty do około 62px, bo elementy flex domyślnie się kurczą. Z wrap zostają przy 100px: trzy mieszczą się w pierwszej linii, a pozostałe dwa przechodzą do drugiej.
Wartości flex-wrap
| Wartość | Co się dzieje |
|---|---|
nowrap (domyślnie) | Jedna linia. Elementy się kurczą, a gdy nie mogą już bardziej, wystają z kontenera |
wrap | Elementy, które się nie mieszczą, zaczynają nową linię poniżej |
wrap-reverse | To samo, ale nowe linie układają się w górę: pierwsza linia jest na dole |
Zobacz, jak elementy się zawijają
Przeciągnij suwak, żeby zmienić szerokość kontenera. Komunikat liczy linie i podaje, ile elementów jest w każdej:
Przy 400px cztery elementy po 90px i trzy odstępy po 8px (384px) mieszczą się w linii, więc dostajesz 4 + 2. Przeciągnij w stronę 620px, a wszystkie sześć zmieści się w jednej linii; przeciągnij w stronę 120px, a każdy element dostanie osobną linię.
flex-direction: rząd albo kolumna
flex-direction ustawia kierunek, w którym płyną elementy, czyli oś główną:
| Wartość | Elementy układają się | Pierwszy element |
|---|---|---|
row (domyślnie) | obok siebie, w kierunku pisania | na początku linii |
row-reverse | obok siebie, w odwrotnej kolejności | na końcu linii |
column | jeden pod drugim, od góry do dołu | na górze |
column-reverse | jeden nad drugim, od dołu do góry | na dole |
W dwóch pudełkach row elementy rozciągają się na pełną wysokość pudełka, bo align-items: stretch działa w poprzek rzędu. W pudełkach column z tego samego powodu rozciągają się na pełną szerokość. Osie się obróciły, a wszystkie właściwości wyrównania obróciły się razem z nimi (szczegółowo pokazuje to strona o justify-content).
flex-flow: oba w jednej linii
flex-flow to skrót dla flex-direction, a potem flex-wrap:
.cards { flex-flow: row wrap; } /* flex-direction: row; flex-wrap: wrap; */
.stack { flex-flow: column nowrap; } /* flex-direction: column; flex-wrap: nowrap; */
Responsywne karty z wrap i bez media query
Nadaj każdemu elementowi rozmiar początkowy przez flex: 1 1 180px i pozwól rzędowi się zawijać. Każdy element rośnie, żeby wypełnić swoją linię, a gdy w linii nie mieści się kolejny element 180px, następny się zawija:
W podglądzie o szerokości około 800px w pierwszej linii mieszczą się trzy karty (po około 253px), a dwie ostatnie dzielą drugą linię, gdzie każda rośnie do około 386px. Tak działa flexbox: każda linia dzieli własne miejsce, więc karty w krótkiej ostatniej linii są szersze niż te wyżej. Jeśli chcesz, żeby ostatnia karta miała tę samą szerokość co pozostałe, użyj zamiast tego grida z repeat(auto-fill, minmax(180px, 1fr)) (zobacz stronę o grid).
align-content: rozmieszczenie linii
Gdy kontener zawija elementy i jest wyższy niż jego linie, align-content decyduje, gdzie trafiają linie. Przyjmuje te same wartości co justify-content, a do tego stretch:
W pierwszym pudełku obie linie są na górze. W drugim pierwsza linia jest na górze, a druga na dole, z całą wolną wysokością pomiędzy nimi.
Odwrócona kolejność i dostępność
row-reverse, column-reverse i wrap-reverse zmieniają tylko miejsce, w którym elementy są rysowane. Czytniki ekranu i klawisz Tab nadal podążają za kolejnością w HTML, więc osoba korzystająca z klawiatury przechodzi przez elementy w kierunku odwrotnym do tego, co widzi. Odwracaj kolejność tylko dla efektu wizualnego; gdy kolejność niesie znaczenie, zmień ją w HTML.
Częste błędy
- Elementy, które się kurczą zamiast zawijać. Elementy z
flex: 1zaczynają odflex-basisrównego 0 i ściskają się w jednej linii. Nadaj im prawdziwy rozmiar bazowy, na przykładflex: 1 1 200px. flex-wrapna elementach. Ta właściwość należy do kontenera flex.- Używanie
align-itemsdo rozmieszczania zawiniętych linii. To wyrównuje elementy w każdej linii; same linie przesuwaalign-content. - Samotny ostatni element rozciągnięty na cały rząd. To
flex-groww linii z jednym elementem. Użyj grida, jeśli każda karta musi mieć tę samą szerokość. - Oczekiwanie, że
flex-direction: columnwypełni wysokość. Kontener kolumnowy jest tylko tak wysoki jak jego zawartość, chyba że nadasz muheight, więcjustify-contentnie ma miejsca do działania.
Najczęściej zadawane pytania
Co robi flex-wrap: wrap?
Pozwala elementom flex przejść do nowej linii, gdy nie mieszczą się w jednym rzędzie. Przy domyślnym nowrap elementy zostają w jednej linii i się kurczą albo wystają z kontenera, jeśli nie mogą się już bardziej skurczyć.
Dlaczego flex-wrap nie działa?
Zawijanie następuje tylko wtedy, gdy rozmiary początkowe elementów sumują się do więcej niż szerokość kontenera. Elementy z flex: 1 zaczynają od flex-basis równego 0, więc nigdy się nie zawijają; nadaj im prawdziwy rozmiar początkowy (flex: 1 1 200px albo width: 200px). Sprawdź też, czy flex-wrap jest na kontenerze flex, a nie na elementach.
Czym różni się flex-direction row od column?
row (domyślnie) ustawia elementy obok siebie w kierunku pisania, a column układa je od góry do dołu. Oś główna obraca się razem z tym, więc w kolumnie justify-content działa w pionie, a align-items w poziomie.
Co to jest flex-flow?
Skrót dla flex-direction i flex-wrap w jednej deklaracji: flex-flow: row wrap; to to samo co flex-direction: row; flex-wrap: wrap;.
Czym różni się align-items od align-content?
align-items ustawia elementy wewnątrz ich linii. align-content ustawia same linie wewnątrz kontenera, więc ma znaczenie tylko wtedy, gdy kontener ma flex-wrap: wrap i jest wyższy niż jego linie.