Napisz do mnie
← Wszystkie wpisy

Flexbox
od podstaw

Tutorial CSS
Adrian Fabiszak · 9 min czytania

Wyśrodkowanie diva, menu z logo po lewej i przyciskiem po prawej, karty o równej wysokości. Kiedyś każde z tych zadań wymagało sztuczki z float, position albo tabelą. Dziś wystarczy jedna linijka: display: flex. W tym wpisie przejdziesz przez wszystko, czego flexbox potrzebuje w codziennej pracy, i zobaczysz to na żywo w demo.

01 / 07Kontener i elementy

Flexbox zawsze działa na dwóch poziomach:

  • kontener flex to rodzic, któremu nadajesz display: flex,
  • elementy flex to jego bezpośrednie dzieci; wnuków flexbox nie dotyczy.
Struktura<nav class="menu">
  <a href="/">Start</a>
  <a href="/blog/">Blog</a>
  <a href="/kontakt/">Kontakt</a>
</nav>
Jedna linijka zmienia układ.menu {
  display: flex;
  gap: 16px;
}

Linki stają w rzędzie, mają odstęp 16 px, a ich wysokość wyrównuje się do najwyższego. Bez ani jednego marginesu.

Dwie grupy właściwości

Część właściwości ustawiasz na kontenerze (justify-content, align-items, gap), a część na elementach (flex-grow, align-self, order). Połowa problemów z flexboxem bierze się z ustawienia właściwości na złym poziomie.

02 / 07Oś główna i oś poprzeczna

To najważniejsza koncepcja we flexboxie. Kontener ma dwie osie:

  • oś główna biegnie w kierunku flex-direction, domyślnie poziomo od lewej do prawej,
  • oś poprzeczna jest do niej prostopadła.

justify-content zawsze działa na osi głównej, a align-items na poprzecznej. Gdy zmienisz flex-direction na column, osie zamieniają się miejscami, a razem z nimi kierunki obu właściwości.

Sprawdź to w demo: ustaw justify-content: center, a potem przełącz flex-direction na column. Elementy wyśrodkują się już w pionie, nie w poziomie.

Demo na żywoKliknij: właściwości kontenera
1
2
3
4
flex-direction
justify-content
align-items
.box { display: flex; }

03 / 07Właściwości kontenera

Właściwość Najczęstsze wartości Co robi
flex-direction row, column, row-reverse kierunek osi głównej
flex-wrap nowrap, wrap czy elementy mogą przejść do nowej linii
justify-content flex-start, center, space-between, space-evenly rozkład na osi głównej
align-items stretch, flex-start, center, flex-end ustawienie na osi poprzecznej
align-content flex-start, center, space-between rozkład linii, gdy jest wrap
gap 16px, 1rem 2rem odstęp między elementami

Zwróć uwagę na domyślne align-items: stretch. Dlatego elementy w rzędzie mają równą wysokość, choć żadnemu nie ustawiono wysokości. Gdy chcesz, żeby każdy miał wysokość swojej treści, zmień to na flex-start.

04 / 07Właściwości elementów

Elementy decydują, jak dzielą się miejscem w kontenerze. Robią to trzy właściwości:

  • flex-basis: rozmiar startowy elementu na osi głównej, zanim flexbox rozdzieli wolne miejsce,
  • flex-grow: ile wolnego miejsca element zabiera, w proporcji do pozostałych,
  • flex-shrink: jak mocno element się kurczy, gdy miejsca brakuje.

W praktyce zapisuje się je razem w skrócie flex:

Skrót flex.item {
  flex: 1;            /* flex: 1 1 0%   → równe części, niezależnie od treści */
}

.sidebar {
  flex: 0 0 280px;    /* nie rośnij, nie kurcz się, zawsze 280px */
}

.content {
  flex: 1 1 auto;     /* rozmiar z treści, a potem dziel wolne miejsce */
}

Poniżej galeria, w której każda karta ma flex: 1. Najedź na kartę albo przejdź do niej klawiszem Tab: dostanie flex-grow: 4 i zabierze cztery razy więcej wolnego miejsca niż sąsiednie.

01flex-grow
02flex-basis
03gap
04order

Do pojedynczego elementu przydają się jeszcze dwie właściwości:

  • align-self nadpisuje align-items tylko dla tego elementu,
  • order zmienia kolejność wyświetlania bez zmiany HTML. Używaj go ostrożnie: czytniki ekranu i klawisz Tab dalej idą w kolejności z kodu.
Element nie chce się zwęzić?

Elementy flex mają domyślnie min-width: auto, więc nie zwężą się poniżej swojej treści, np. długiego adresu URL. Dopisz min-width: 0 i problem znika.

05 / 07Gotowe wzorce

Cztery układy, które flexbox rozwiązuje w kilku linijkach.

Wyśrodkowanie w obu osiach:

Środek kontenera.center {
  display: flex;
  justify-content: center;
  align-items: center;
  min-height: 100vh;
}

Menu z logo po lewej i przyciskiem po prawej. margin-left: auto zabiera całe wolne miejsce przed elementem i przesuwa go na koniec:

Pasek nawigacji.navbar {
  display: flex;
  align-items: center;
  gap: 24px;
}

.navbar .cta {
  margin-left: auto;
}

Karty, które same zawijają się do nowej linii:

Responsywne karty bez media queries.cards {
  display: flex;
  flex-wrap: wrap;
  gap: 20px;
}

.card {
  flex: 1 1 260px; /* min. ok. 260px, a resztę miejsca dzielą równo */
}

Stopka zawsze na dole strony, nawet gdy treści jest mało:

Sticky footerbody {
  display: flex;
  flex-direction: column;
  min-height: 100vh;
}

main {
  flex: 1;
}

06 / 07Flexbox czy Grid

Oba narzędzia się uzupełniają. Prosta zasada: flexbox układa elementy w jednym kierunku, a Grid w dwóch naraz.

  • 01

    Flexbox

    Menu, paski narzędzi, rzędy przycisków, wyrównanie treści w karcie. Rozmiar wynika z treści.

  • 02

    Grid

    Siatki kart, galerie, szkielet strony z nagłówkiem i panelem bocznym. Najpierw siatka, potem treść.

  • 03

    Razem

    Grid układa strukturę strony, a flexbox wyrównuje elementy w środku każdej komórki.

07 / 07Najczęstsze pytania

Czym różni się justify-content od align-items?

justify-content rozkłada elementy wzdłuż osi głównej, a align-items ustawia je na osi poprzecznej. Przy flex-direction: row oś główna jest pozioma, a przy column pionowa, więc obie właściwości zamieniają się wtedy kierunkami.

Dlaczego element flex nie chce się zwęzić?

Elementy flex mają domyślnie min-width: auto, więc nie zwężą się poniżej szerokości swojej treści, np. długiego słowa lub obrazka. Rozwiązaniem jest min-width: 0 na tym elemencie.

Flexbox czy Grid?

Flexbox do układów w jednym kierunku: menu, paski narzędzi, rzędy przycisków, wyrównanie w karcie. Grid do układów w dwóch kierunkach naraz, np. siatki kart czy szkieletu całej strony. W praktyce oba świetnie działają razem.

Czy gap działa we flexboxie?

Tak. Wszystkie współczesne przeglądarki obsługują gap we flexboxie, więc nie musisz już dodawać marginesów do elementów i kasować ich przy ostatnim.

Flexbox opanujesz, gdy zapamiętasz jedną rzecz: justify-content działa na osi głównej, a align-items na poprzecznej. Resztę doczytasz w tabeli powyżej, a wzorce z ostatniej sekcji wklejaj śmiało do swoich projektów.

Podziel się wpisem

Jeśli wpis Ci pomógł, wyślij go komuś, kto też walczy z frontendem.

LinkedInXFacebook