Menu

flex-wrap i flex-direction w CSS: rzędy, kolumny, zawijanie

flex-wrap decyduje, czy elementy flex ściskają się w jednej linii, czy przechodzą do następnej, a flex-direction decyduje, czy układają się w rzędzie, czy w kolumnie. Poznaj obie właściwości na przykładach na żywo, skrót flex-flow, align-content i responsywny rząd kart bez media queries.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

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
wrapElementy, które się nie mieszczą, zaczynają nową linię poniżej
wrap-reverseTo 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 pisaniana początku linii
row-reverseobok siebie, w odwrotnej kolejnościna końcu linii
columnjeden pod drugim, od góry do dołuna górze
column-reversejeden nad drugim, od dołu do góryna 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: 1 zaczynają od flex-basis równego 0 i ściskają się w jednej linii. Nadaj im prawdziwy rozmiar bazowy, na przykład flex: 1 1 200px.
  • flex-wrap na elementach. Ta właściwość należy do kontenera flex.
  • Używanie align-items do rozmieszczania zawiniętych linii. To wyrównuje elementy w każdej linii; same linie przesuwa align-content.
  • Samotny ostatni element rozciągnięty na cały rząd. To flex-grow w linii z jednym elementem. Użyj grida, jeśli każda karta musi mieć tę samą szerokość.
  • Oczekiwanie, że flex-direction: column wypełni wysokość. Kontener kolumnowy jest tylko tak wysoki jak jego zawartość, chyba że nadasz mu height, więc justify-content nie 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.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ