Każdy element HTML to prostokątne pudełko. Zrozumienie jak te pudełka się zachowują, jak je układać i pozycjonować — to fundament CSS.
W tym artykule przejdziemy przez Box Model, positioning, a potem głęboko wejdziemy w Flexbox i Grid. Na końcu będziesz wiedzieć, kiedy użyć którego.
Krótka odpowiedź: CSS Box Model opisuje każdy element HTML jako prostokąt złożony z treści, paddingu, obramowania i marginesu — box-sizing: border-box sprawia, że width i height obejmują padding i border, co ułatwia obliczenia. Flexbox służy do układów jednowymiarowych (wiersz lub kolumna) i dobrze sprawdza się w nawigacji czy wyrównaniu elementów, natomiast Grid to system dwuwymiarowy idealny do złożonych siatek i layoutów całych stron. Oba mechanizmy można łączyć.
Do budowania odstępów w nowoczesnych layoutach zwykle lepiej używać gap niż kombinacji marginów na dzieciach.
Właściwości flex items
Code
.item { flex-grow: 1; /* jak bardzo może rosnąć (0 = nie rośnie) */ flex-shrink: 1; /* jak bardzo może się kurczyć */ flex-basis: 200px; /* bazowy rozmiar przed grow/shrink */ /* Skrót */ flex: 1; /* flex-grow: 1, flex-shrink: 1, flex-basis: 0 */ flex: 0 0 200px; /* nie rośnie, nie kurczy się, 200px */ /* Nadpisanie align-items dla tego elementu */ align-self: center; /* Kolejność */ order: 2; /* domyślnie 0, wyższe = później */}
.container { display: grid; grid-template-columns: repeat(3, minmax(200px, 1fr)); /* Min 200px, max równy podział */}
auto-fit i auto-fill
Code
.container { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); /* Tworzy tyle ścieżek ile się zmieści, także pustych */}.container { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); /* Podobnie, ale puste ścieżki się zwijają i istniejące elementy się rozszerzają */}
.container { display: grid; /* Wyrównanie zawartości w komórkach */ justify-items: start | end | center | stretch; /* oś X */ align-items: start | end | center | stretch; /* oś Y */ place-items: center center; /* skrót: align justify */}
justify-content i align-content w Grid
Code
.container { display: grid; /* Wyrównanie całej siatki w kontenerze */ justify-content: start | end | center | space-between | space-around; align-content: start | end | center | space-between | space-around;}
Flexbox vs Grid — kiedy który?
Scenariusz
Flexbox
Grid
Nawigacja (pozioma)
✅
⚠️
Lista kart (responsywna)
⚠️
✅
Centrowanie elementu
✅
✅
Layout strony (header/main/footer)
⚠️
✅
Wyrównanie w jednej linii
✅
⚠️
Złożona siatka
❌
✅
Nieznana liczba elementów
✅
✅
Zasada ogólna:
Flexbox — gdy układ zależy od contentu (content-out)
Grid — gdy masz zdefiniowaną siatkę (layout-in)
Mogą współpracować!
Code
/* Grid dla głównego layoutu */.page { display: grid; grid-template-areas: "header" "main" "footer";}/* Flexbox dla nawigacji w headerze */.header { display: flex; justify-content: space-between; align-items: center;}/* Grid dla siatki kart */.card-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 20px;}/* Flexbox wewnątrz karty */.card { display: flex; flex-direction: column;}.card-footer { margin-top: auto; /* przesuń na dół */}
FAQ
Czym różni się Flexbox od Grid i kiedy używać którego?
Flexbox to system jednowymiarowy — układa elementy w jednej osi (wiersz lub kolumna) i dobrze sprawdza się w komponentach takich jak nawigacja, pasek przycisków czy wyrównanie elementów w linii. Grid to system dwuwymiarowy, który kontroluje jednocześnie wiersze i kolumny — idealny do layoutu całej strony, siatek kart czy złożonych widoków. W praktyce oba mechanizmy często współpracują w jednym projekcie.
Co to jest box-sizing: border-box i dlaczego warto go używać?
Domyślnie CSS oblicza width i height tylko dla contentu — padding i border są dodawane do zadeklarowanego rozmiaru. Z border-box zadeklarowana szerokość obejmuje padding i border, co sprawia, że rozmiary elementów są bardziej przewidywalne. Standardowa praktyka to ustawienie *, *::before, *::after { box-sizing: border-box; } globalnie.
Czym jest margin collapse i jak go uniknąć?
Margin collapse to zjawisko, w którym sąsiednie pionowe marginesy elementów blokowych łączą się w jeden większy margines zamiast sumować się. Zwycięża większy z dwóch marginesów. Można go uniknąć stosując Flexbox lub Grid jako kontener (dzieci kontenerów flex/grid nie podlegają margin collapse), dodając padding lub border do rodzica, albo używając overflow: hidden.
Jak wyśrodkować element w pionie i poziomie w CSS?
Najprościej z Flexbox: ustaw display: flex; justify-content: center; align-items: center; na kontenerze. Działa zarówno dla dzieci znanych, jak i nieznanych rozmiarów. Alternatywnie z Grid: display: grid; place-items: center;. Oba sposoby są nowoczesne i dobrze wspierane przez przeglądarki.
Czym jest position: sticky i jak go używać?
position: sticky to hybryda relative i fixed — element zachowuje się jak relatywny w normalnym przepływie dokumentu, ale "przykleja się" do określonej pozycji podczas scrollowania. Wymaga podania wartości top, right, bottom lub left i działa tylko w obrębie swojego kontenera rodzica. Przydatne do nagłówków tabel, paneli bocznych czy pasków nawigacji wewnątrz sekcji.
Jak działają auto-fit i auto-fill w CSS Grid?
Oba słowa kluczowe w repeat() automatycznie tworzą tyle kolumn (lub wierszy) ile się zmieści. auto-fill tworzy ślady nawet jeśli nie ma wystarczająco elementów (możliwe puste kolumny), natomiast auto-fit zwija puste ślady i rozciąga istniejące elementy. Najczęściej używa się ich razem z minmax() do tworzenia responsywnych siatek bez media queries: grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)).
Czy można łączyć Flexbox i Grid w jednym projekcie?
Tak i jest to zalecane podejście. Grid dobrze nadaje się do makrolayoutu strony (header, sidebar, main, footer), natomiast Flexbox sprawdza się wewnątrz komponentów. Przykładowo: Grid definiuje układ strony, Flexbox wyrównuje elementy w nawigacji, a Grid ponownie tworzy siatkę kart produktów — każde narzędzie tam, gdzie ma sens.
Podsumowanie
Pojęcie
Opis
Box Model
content + padding + border + margin
box-sizing: border-box
width zawiera padding i border
display: block
pełna szerokość, nowa linia
display: inline
tylko potrzebna szerokość
position: relative
przesunięcie względem siebie
position: absolute
względem rodzica z position
Flexbox
1D layout (wiersz LUB kolumna)
Grid
2D layout (wiersze I kolumny)
Box Model i positioning to fundamenty. Flexbox i Grid to narzędzia, które rozwiązują 99% problemów z layoutem. Jeśli korzystasz z Tailwind CSS, to jego klasy utility — flex, grid, gap — to właśnie te mechanizmy pod spodem.
Jeśli chcesz przełożyć ten temat na lepszą architekturę frontendu, uporządkować React lub Next.js i podnieść jakość pracy zespołu, skontaktuj się ze mną. Pomagam zamieniać wiedzę z artykułów w praktyczne decyzje technologiczne.
Maciej Sala — project manager i frontendowiec z doświadczeniem w marketingu internetowym. Na co dzień pracuję z Reactem, Next.js i TypeScriptem, łącząc perspektywę produktową z praktycznym podejściem do kodu. Przez kilka lat związany z branżą gier wideo jako project manager i game designer.
Absolwent historii na Uniwersytecie Jagiellońskim i studiów podyplomowych z marketingu internetowego na Akademii Górniczo-Hutniczej w Krakowie. Poza pracą trenuje na siłowni, maluje figurki i realizuje własne projekty.
Astro.js vs Next.js — które narzędzie wybrać w 2026 roku?
Fachowe porównanie Astro.js i Next.js z perspektywy developera pracującego na co dzień w Next.js. Architektura, wydajność, SEO, DX, koszty i konkretne use case — z benchmarkami i przykładami kodu.
WordPress → Next.js — migracja treści, redirecty 301 i zachowanie pozycji SEO
Jak przenieść stronę z WordPress na Next.js bez utraty pozycji w Google? Eksport treści, mapowanie URL, redirecty 301, migracja obrazów i weryfikacja indeksacji.
Google Search Console + Next.js — indeksacja, błędy, performance i co z nimi robić
Jak korzystać z Google Search Console dla strony Next.js? Weryfikacja, sitemap, indeksacja, Core Web Vitals, crawl budget i najczęstsze problemy — praktyczny poradnik.