Chcesz szybko ułożyć elementy na stronie w ładny, elastyczny sposób bez męczenia się z floatami i zawiłymi obliczeniami szerokości? Flexbox to idealne narzędzie. W tym artykule wyjaśnię to prosto, po ludzku — pokażę, jak działa Flexbox, dam gotowy kod, opiszę najważniejsze właściwości i podpowiem, jak go używać w praktycznych układach (np. kartach, nagłówku z przyciskami, siatce). Gotowy? Zaczynamy.
Dlaczego warto używać Flexboxa?
Flexbox (ang. Flexible Box Layout) to moduł CSS zaprojektowany do układów jednowymiarowych — czyli takich, które układasz w rzędzie (row) lub w kolumnie (column). Jest:
- prosty i intuicyjny,
- świetny do centrowania elementów (zarówno w pionie, jak i w poziomie),
- dobrze radzi sobie z dynamiczną zmianą rozmiaru elementów,
- obsługiwany przez wszystkie nowoczesne przeglądarki.
Jeżeli chcesz mieć kontrolę nad rozmieszczeniem elementów bez skomplikowanych hacków — flexbox to najkrótsza droga.
Podstawowe pojęcia (szybko i jasno)
- container (kontener) — element, któremu ustawiasz
display: flex;. Wszystkie jego bezpośrednie dzieci stają się flex-itemami. - flex-item — każde bezpośrednie dziecko kontenera flex.
- main axis — główna oś (domyślnie pozioma:
row). - cross axis — oś pomocnicza (domyślnie pionowa).
Minimalny, działający przykład
Poniżej znajdziesz kompletny kod HTML + CSS, który możesz wkleić do pliku index.html i otworzyć w przeglądarce. To prosty układ kart w rzędzie, który pięknie się zachowuje przy zmianie szerokości okna.
<!doctype html>
<html lang="pl">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Prosty Flexbox — przykład</title>
<style>
/* Reset minimalny */
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial;
padding: 2rem;
background: #f5f7fa;
color: #222;
}
h1 { margin-bottom: 1rem; font-size: 1.5rem; }
/* Kontener flex */
.flex-container {
display: flex; /* <-- tu aktywujemy flexbox */
gap: 1rem; /* odstęp między elementami */
flex-wrap: wrap; /* zawijanie elementów przy ciasnym miejscu */
justify-content: center; /* wyrównanie wzdłuż osi głównej */
align-items: stretch; /* wyrównanie wzdłuż osi poprzecznej */
}
/* Pojedyncza karta (flex-item) */
.card {
background: #fff;
border-radius: 8px;
box-shadow: 0 6px 18px rgba(20,30,40,0.06);
padding: 1rem;
width: 280px; /* szerokość preferowana */
flex: 1 1 240px; /* rośnie, kurczy się, minimum 240px */
display: flex;
flex-direction: column; /* zawartość karty w kolumnie */
gap: 0.75rem;
}
.card h3 { font-size: 1.1rem; }
.card p { font-size: 0.95rem; line-height: 1.4; color: #444; }
.card .actions { margin-top: auto; display: flex; gap: 0.5rem; }
.btn {
padding: 0.5rem 0.75rem;
border-radius: 6px;
border: none;
cursor: pointer;
font-weight: 600;
background: #0b74de;
color: #fff;
}
/* Prosty design responsywny */
@media (max-width: 600px) {
.card { width: 100%; flex-basis: 100%; }
.flex-container { justify-content: stretch; }
}
</style>
</head>
<body>
<h1>Przykład prostego flexboxa</h1>
<div class="flex-container">
<article class="card">
<h3>Karta 1</h3>
<p>To jest przykładowa karta. Flexbox sprawia, że układ jest elastyczny i przyjazny dla responsywności.</p>
<div class="actions">
<button class="btn">Szczegóły</button>
<button class="btn" style="background:#6c757d">Anuluj</button>
</div>
</article>
<article class="card">
<h3>Karta 2</h3>
<p>Zobacz jak karty zawijają się przy mniejszej szerokości okna. To zasługa <code>flex-wrap</code>.</p>
<div class="actions">
<button class="btn">Szczegóły</button>
</div>
</article>
<article class="card">
<h3>Karta 3</h3>
<p>Flexbox pozwala również na prostą kontrolę porządku elementów i centrowanie ich zarówno w pionie jak i w poziomie.</p>
<div class="actions">
<button class="btn">Szczegóły</button>
</div>
</article>
</div>
</body>
</html>
Omówienie kluczowych właściwości użytych powyżej
display: flex;— robi z elementu kontener flex.gap— prosty sposób na odstęp między elementami (bez marginów na każdym itemie).flex-wrap: wrap;— pozwala elementom zawijać się do kolejnych wierszy, gdy brakuje miejsca.justify-content— ustala rozmieszczenie elementów wzdłuż osi głównej (flex-start,center,space-between,space-around).align-items— ustawia wyrównanie w osi poprzecznej (stretch,center,flex-start,flex-end).flex: 1 1 240px;— skrócona notacja:flex-grow flex-shrink flex-basis. Mówi, że element może rosnąć (1), kurczyć się (1) i ma bazową szerokość240px.
Kilka praktycznych wskazówek
- Do centrowania elementu:
Jeśli chcesz, żeby coś było dokładnie na środku, zastosuj:.center { display:flex; justify-content:center; align-items:center; } - Ustawianie porządku (order):
Flexbox pozwala zmienić kolejność bez zmiany HTML:.item { order: 2; } /* wyższa liczba → później */ - Układ nagłówka z przyciskem po prawej:
Zrobisz to tak:.header { display:flex; align-items:center; justify-content:space-between; } - Unikaj nadmiernego używania
widthna itemach — lepiej kontrolować ich rozmiar przezflex-basis,min-widthimax-width.
Typowe pułapki i jak ich unikać
- Brak zawijania — jeśli nie ustawisz
flex-wrap: wrap, elementy będą się kurczyć do zera na małych ekranach. Jeśli chcesz zawijać, dodajflex-wrap: wrap. - Niespodziewane rozciąganie — domyślnie
align-items: stretchrozciąga elementy w osi poprzecznej. Jeśli chcesz ich naturalnej wysokości, ustawalign-items: flex-startlubcenter. - Kolejność DOM vs. wizualna —
orderzmienia tylko wizualny porządek; czytniki i SEO wciąż czytają w kolejności DOM. Jeśli elementy mają znaczenie semantyczne, lepiej zmienić HTML.
Dostępność i SEO — krótkie przypomnienie
Flexbox to tylko warstwa wyglądu. Aby strona była przyjazna dla wyszukiwarek i użytkowników:
- Używaj semantycznych znaczników (
header,main,nav,article,section,footer). - Nie polegaj na
orderdo przekazywania kluczowej treści — kolejność DOM ma znaczenie dla czytników ekranu. - Dodaj znaczące nagłówki (
h1,h2, …) i atrybutyaltdla obrazów. - Upewnij się, że przyciski to rzeczywiście
<button>lub linki<a>, żeby zachować poprawne działanie klawiatury.
Rozszerzenia — kilka dodatkowych tricków
- Flexbox + media queries — dla bardziej zaawansowanej responsywności używaj
@mediai zmieniajflex-directionlubflex-basisw zależności od szerokości ekranu. - Mieszanie z gridem — Flexbox świetnie działa w pojedynczym wymiarze; jeśli potrzebujesz dwuwymiarowej siatki (rows + columns), rozważ CSS Grid. Możesz też łączyć oba narzędzia (np. grid do ogólnego layoutu, flex do elementów wewnątrz kart).
Flexbox to narzędzie, które powinna znać każda osoba tworząca front-end. Jest szybkie do nauczenia, intuicyjne i niezwykle praktyczne w większości codziennych układów. Kluczowe właściwości, które warto poznać od razu to: display: flex, flex-direction, justify-content, align-items, flex-wrap i flex (skrót). Powyższy przykład da Ci gotową bazę — możesz go dowolnie rozbudowywać.