Menu

Flexbox w CSS: display flex, osie, wyrównanie i flex

Flexbox układa elementy w rzędzie albo w kolumnie i steruje tym, jak dzielą miejsce i jak się wyrównują. Poznaj display: flex, oś główną i poprzeczną, wszystkie właściwości kontenera, flex-grow, flex-shrink i flex-basis, z edytorem na żywo, który mierzy, gdzie ląduje każdy element.

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

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ślnym stretch element 1 nie ma własnej wysokości i wypełnia całe 170px kontenera.
  • flex-direction: column: teraz justify-content przesuwa elementy w pionie, a align-items w 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-directionOś głównaOś poprzecznajustify-content przesuwa elementyalign-items przesuwa elementy
row (domyślnie)pozioma, w kolejności czytaniapionowaw poziomiew pionie
row-reversepozioma, odwróconapionowaw poziomiew pionie
columnpionowa, od góry do dołupoziomaw pioniew poziomie
column-reversepionowa, od dołu do górypoziomaw pioniew 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 robiDomyślnie
flex-directionRząd albo kolumna i w którą stronęrow
flex-wrapCzy elementy przechodzą do nowej linii, gdy zabraknie miejscanowrap
flex-flowSkrót dla flex-direction i flex-wraprow nowrap
justify-contentPołożenie i odstępy wzdłuż osi głównejnormal (działa jak flex-start)
align-itemsPołożenie elementów wzdłuż osi poprzecznejnormal (działa jak stretch)
align-contentOdstępy między liniami, gdy elementy się zawijająnormal
gapOdstę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 (auto oznacza "użyj mojej szerokości albo treści").
  • flex-grow: ile udziałów pozostałego miejsca bierze element. 0 oznacza, że nigdy nie rośnie.
  • flex-shrink: ile element oddaje, gdy brakuje miejsca. 0 oznacza, że nigdy się nie kurczy.

Skrót flex ustawia wszystkie trzy:

PiszeszCo oznaczaZachowanie
flex: initial (domyślnie)0 1 autoRozmiar treści, może się kurczyć, nigdy nie rośnie
flex: 11 1 0%Zaczyna od zera i bierze równy udział w miejscu
flex: auto1 1 autoRozmiar treści plus udział w pozostałym miejscu
flex: none0 0 autoDokładnie jego treść albo szerokość, nigdy nie rośnie ani się nie kurczy
flex: 22 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: flex na elemencie zamiast na rodzicu. display: flex dostaje kontener; jego dzieci to elementy.
  • Oczekiwanie, że align-items przesunie 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. Dodaj min-width: 0 do elementu, który ma się kurczyć.
  • Używanie flex: 1 i zdziwienie, że szerokości się różnią. Elementy z flex: 1 dzielą 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ż naprawia min-width: 0.
  • Marginesy między elementami. Użyj gap na 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.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ