PorównaniePorównania

Flexbox vs Grid

Flexbox układa elementy w jednym wymiarze i dopasowuje się do ich treści, a Grid definiuje dwuwymiarową siatkę wierszy i kolumn, do której wstawiasz elementy.

Na tej stronie

Porównanie w tabeli

#
  • Liczba wymiarów

    Flexbox
    Jeden: wiersz albo kolumna
    Grid
    Dwa: wiersze i kolumny naraz
  • Punkt wyjścia

    Flexbox
    Rozmiar elementów decyduje o układzie
    Grid
    Układ (siatka) decyduje, gdzie trafi element
  • Umieszczanie elementów

    Flexbox
    Kolejno, z zawijaniem do nowej linii przy flex-wrap
    Grid
    Na konkretnych liniach albo w nazwanych obszarach, nawet z nakładaniem
  • Odstępy między elementami

    Grid
    gap (działa tak samo)
  • Wyrównanie w obu osiach naraz

    Flexbox
    Tylko jedna oś na raz (justify-content, align-items)
    Grid
    place-items, place-content od razu w dwóch osiach
  • Typowe zastosowanie

    Flexbox
    Menu, lista tagów, wiersz przycisków, wyśrodkowanie
    Grid
    Układ całej strony, siatka kart o równych kolumnach

Przykład

#
CSS
.flex-row {
  display: flex;
  gap: 8px;
}

.grid-area {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 8px;
}
Podgląd

Definicja i zastosowanie

#

Obie technologie zastąpiły stare sztuczki z float i tabelami, ale rozwiązują inny problem. Flexbox pracuje na jednej osi, wierszu albo kolumnie, i rozkłada elementy zgodnie z ich naturalnym rozmiarem. Grid od razu myśli w dwóch wymiarach: najpierw rysujesz siatkę wierszy i kolumn, a potem umieszczasz w niej elementy, nawet tak, że nachodzą na siebie.

W praktyce Flexbox sprawdza się tam, gdzie elementów jest nieznana liczba i mają płynąć jeden za drugim: menu, lista tagów, wiersz przycisków. Grid wygrywa, gdy z góry znasz układ: całą stronę z nagłówkiem, panelem bocznym i treścią albo siatkę kart o równych kolumnach i wierszach.

Nic nie stoi na przeszkodzie, żeby użyć obu naraz. Częsty wzorzec to Grid dla całej strony i Flexbox w środku pojedynczej karty, gdzie liczy się tylko jeden wiersz z ikoną i tekstem.

Składnia

#
Składnia
.flex { display: flex; flex-direction: row | column; }
.grid { display: grid; grid-template-columns: ...; grid-template-rows: ...; }

Więcej przykładów

#
Flexbox: pasek narzędzi, który sam się zawija
CSS
.toolbar {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}
Podgląd

Zwęż okno podglądu: elementy same przechodzą do kolejnej linii. Grid wymagałby zdefiniowania, ile kolumn ma zmieścić siatka.

Grid: układ strony z nazwanymi obszarami
CSS
.layout {
  display: grid;
  grid-template-columns: 120px 1fr;
  grid-template-areas:
    "header header"
    "menu   content";
  gap: 8px;
}

.layout header { grid-area: header; }
.layout nav { grid-area: menu; }
.layout main { grid-area: content; }
Podgląd

Taki dwuwymiarowy układ (nagłówek na całą szerokość, panel boczny i treść) we Flexboxie wymagałby zagnieżdżania kilku kontenerów.

Dobre praktyki

#
  • Zadaj sobie pytanie: układam jeden rząd elementów czy całą kratkę w dwóch wymiarach? Odpowiedź wskazuje właściwe narzędzie.
  • Grid w jednej kolumnie (grid-template-columns: 1fr) działa prawie jak Flexbox w kolumnie. W prostych przypadkach różnica jest kosmetyczna.
  • Łącz obie technologie: Grid dla układu strony, Flexbox w środku pojedynczego komponentu.

Powiązane hasła

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.