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.

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.
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.
Do pojedynczego elementu przydają się jeszcze dwie właściwości:
align-selfnadpisujealign-itemstylko dla tego elementu,orderzmienia kolejność wyświetlania bez zmiany HTML. Używaj go ostrożnie: czytniki ekranu i klawisz Tab dalej idą w kolejności z kodu.

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.


