CSS Grid — praktyczny poradnik po układach siatki z przykładami
CSS Grid od podstaw: grid-template-columns, fr, repeat, minmax, obszary, auto-fit, subgrid i responsywne układy bez media queries. Gotowe przykłady kodu.

W skrócie
- CSS Grid to dwuwymiarowy system układu: jednocześnie kontrolujesz kolumny i wiersze, a elementy możesz umieszczać w dowolnych komórkach.
- Siatkę tworzysz przez display: grid i grid-template-columns, a jednostka fr dzieli wolne miejsce na proporcjonalne części.
- repeat(auto-fit, minmax(250px, 1fr)) daje responsywną siatkę kart bez żadnego media query.
- grid-template-areas pozwala „narysować” układ strony nazwami obszarów i łatwo przestawić go na telefonie.
- Grid i subgrid są obsługiwane przez wszystkie współczesne przeglądarki; Flexbox nadal lepiej sprawdza się w układach jednowymiarowych.
Spis treści
CSS Grid to moduł CSS do budowania dwuwymiarowych układów: definiujesz w kontenerze kolumny i wiersze, a potem umieszczasz elementy w wybranych komórkach lub obszarach siatki. Wystarczą dwie linijki — display: grid i grid-template-columns — żeby zamienić listę elementów w równą siatkę, a jedna funkcja repeat(auto-fit, minmax(...)) sprawia, że będzie responsywna bez media queries.
Poniżej znajdziesz najważniejsze właściwości z działającymi przykładami: od pierwszej siatki, przez układ całej strony, po responsywne karty, wyrównywanie i subgrid.
Pierwsza siatka: display grid, kolumny i odstępy
Siatkę tworzysz na kontenerze. Jego bezpośrednie dzieci automatycznie stają się elementami siatki (grid items).
<div class="siatka">
<div>1</div><div>2</div><div>3</div>
<div>4</div><div>5</div><div>6</div>
</div>
.siatka {
display: grid;
grid-template-columns: 200px 1fr 1fr;
gap: 16px;
}
Efekt: trzy kolumny — pierwsza stała (200 px), dwie pozostałe dzielą resztę miejsca po równo. Elementy wypełniają komórki wiersz po wierszu, a nowe wiersze tworzą się automatycznie.
Najważniejsze pojęcia:
- ścieżka (track) — kolumna lub wiersz,
- linia — granica między ścieżkami, numerowana od 1 (także od końca: -1 to ostatnia linia),
- komórka — przecięcie wiersza i kolumny,
- obszar (area) — prostokąt złożony z kilku komórek,
gap— odstęp między ścieżkami (osobno:row-gap,column-gap), bez marginesów na krawędziach kontenera.
Jednostka fr, repeat() i minmax()
Jednostka fr dzieli wolną przestrzeń — tę, która zostaje po odjęciu kolumn o stałej szerokości i odstępów. Zapis 2fr 1fr daje kolumny w proporcji 2:1.
Przy wielu identycznych kolumnach używaj repeat():
.siatka {
grid-template-columns: repeat(4, 1fr); /* 4 równe kolumny */
grid-template-columns: 250px repeat(2, 1fr); /* stała + 2 elastyczne */
}
Funkcja minmax(min, max) ustala granice rozmiaru ścieżki:
.siatka {
grid-template-columns: minmax(200px, 300px) 1fr;
grid-auto-rows: minmax(120px, auto); /* wiersze min. 120 px, rosną z treścią */
}
Wskazówka:
1frma ukryte minimum równeauto, więc długie słowo lub szeroki obrazek potrafią rozepchnąć kolumnę i zepsuć proporcje. Jeśli kolumny mają być naprawdę równe, użyjrepeat(3, minmax(0, 1fr)).
Układ strony z grid-template-areas
Najbardziej czytelny sposób na układ całej strony to nazwane obszary. Opisujesz siatkę „obrazkiem” z nazw, a elementom przypisujesz obszar przez grid-area.
.strona {
display: grid;
grid-template-columns: 1fr 300px;
grid-template-rows: auto 1fr auto;
grid-template-areas:
"naglowek naglowek"
"tresc panel"
"stopka stopka";
gap: 24px;
min-height: 100vh;
}
.naglowek { grid-area: naglowek; }
.tresc { grid-area: tresc; }
.panel { grid-area: panel; }
.stopka { grid-area: stopka; }
@media (max-width: 768px) {
.strona {
grid-template-columns: 1fr;
grid-template-areas:
"naglowek"
"tresc"
"panel"
"stopka";
}
}
Na telefonie zmieniasz tylko definicję obszarów — HTML zostaje bez zmian. Kropka w szablonie ("naglowek .") oznacza pustą komórkę. Obszary muszą być prostokątne; kształt litery L nie jest dozwolony.

Umieszczanie elementów po liniach i span
Zamiast nazw możesz wskazać linie początkową i końcową:
.wyrozniony {
grid-column: 1 / 3; /* od linii 1 do linii 3 = 2 kolumny */
grid-row: 1 / span 2; /* od linii 1, przez 2 wiersze */
}
.pelna-szerokosc {
grid-column: 1 / -1; /* od pierwszej do ostatniej linii */
}
span N oznacza „rozciągnij na N ścieżek” i jest wygodne, gdy nie chcesz liczyć linii. Zapis 1 / -1 przydaje się do banerów i nagłówków sekcji, które mają zajmować całą szerokość niezależnie od liczby kolumn.
Elementy bez jawnej pozycji Grid układa automatycznie. Jeśli po rozciągniętych elementach zostają dziury, grid-auto-flow: dense każe przeglądarce wypełnić je mniejszymi elementami — pamiętaj jednak, że zmienia to kolejność wizualną względem kolejności w HTML, co utrudnia nawigację klawiaturą i czytnikom ekranu.
Responsywna siatka kart bez media queries
To najczęściej używany wzorzec CSS Grid — galeria, lista produktów, kafelki wpisów:
.karty {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(min(250px, 100%), 1fr));
gap: 20px;
}
Przeglądarka tworzy tyle kolumn o szerokości co najmniej 250 px, ile zmieści się w kontenerze, a pozostałe miejsce dzieli równo. Na szerokim ekranie zobaczysz cztery–pięć kolumn, na tablecie dwie–trzy, na telefonie jedną. min(250px, 100%) chroni przed poziomym przewijaniem na bardzo wąskich ekranach.
| Wariant | Zachowanie przy małej liczbie elementów |
|---|---|
auto-fill | Tworzy puste kolumny „na zapas”, elementy zachowują szerokość |
auto-fit | Zwija puste kolumny, elementy rozciągają się na całą szerokość |

Wyrównywanie elementów w siatce
Grid korzysta z tych samych właściwości wyrównania co Flexbox, ale w dwóch osiach:
| Właściwość | Na czym działa | Co wyrównuje |
|---|---|---|
justify-items / align-items | kontener | Wszystkie elementy wewnątrz ich komórek (poziomo / pionowo) |
justify-self / align-self | element | Pojedynczy element w jego komórce |
justify-content / align-content | kontener | Całą siatkę w kontenerze, gdy jest od niej większy |
place-items, place-self, place-content | skróty | Obie osie naraz |
Klasyczne wyśrodkowanie elementu w pionie i poziomie w CSS Grid to dwie linijki:
.srodek {
display: grid;
place-items: center;
}
Subgrid: wyrównanie zagnieżdżonych elementów
Typowy problem: karty w siatce mają tytuły różnej długości, przez co przyciski „Czytaj dalej” lądują na różnych wysokościach. Subgrid pozwala elementowi zagnieżdżonemu przejąć ścieżki siatki rodzica:
.karty {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
}
.karta {
display: grid;
grid-row: span 3; /* obrazek, tytuł, przycisk */
grid-template-rows: subgrid; /* wiersze wspólne dla kart w jednym rzędzie */
row-gap: 8px; /* nadpisuje odstęp odziedziczony z rodzica */
}
Teraz tytuły, opisy i przyciski w jednym rzędzie kart są wyrównane do tych samych linii. Subgrid jest obsługiwany przez Firefoksa, Safari, Chrome i Edge — od 2023 roku we wszystkich głównych przeglądarkach.
CSS Grid czy Flexbox — kiedy co wybrać
To nie są konkurencyjne technologie i w jednym projekcie używa się obu.
| Sytuacja | Lepszy wybór |
|---|---|
| Układ całej strony (nagłówek, treść, panel, stopka) | Grid |
| Galeria, siatka produktów, kafelki | Grid |
| Formularz z etykietami i polami w kolumnach | Grid |
| Pasek nawigacji, grupa przycisków, tagi | Flexbox |
| Elementy o różnej szerokości zawijane do nowej linii | Flexbox |
| Wyśrodkowanie jednego elementu | Oba (Grid krócej) |
Prosta zasada: jeśli myślisz o wierszach i kolumnach jednocześnie — Grid. Jeśli o jednym ciągu elementów, który ma się rozłożyć w linii — Flexbox.
Wsparcie przeglądarek i debugowanie
CSS Grid jest obsługiwany bez prefiksów przez wszystkie współczesne przeglądarki od 2017 roku. Jedyną przeglądarką z problemami był Internet Explorer 11 (stara, niekompatybilna składnia -ms-grid), który nie jest już wspierany przez Microsoft, więc w nowych projektach możesz go pominąć. Nowe funkcje, takie jak układ typu masonry (CSS Grid Level 3), są wciąż w trakcie standaryzacji — przed użyciem sprawdź ich obsługę.
Do debugowania używaj narzędzi deweloperskich:
- Otwórz DevTools (
F12) w Chrome, Edge lub Firefoksie. - W panelu Elements (Elementy) kliknij plakietkę
gridobok kontenera siatki. - Przeglądarka nałoży na stronę linie siatki z numerami i nazwami obszarów. W zakładce Layout (Układ) możesz włączyć wyświetlanie numerów linii i rozmiarów ścieżek.
Siatka to tylko narzędzie — o tym, czy układ jest wygodny, decydują zasady projektowania. Przeczytaj o nich w artykule o prawach UX i zasadach dobrego projektowania. Jeśli budujesz stronę na WordPressie, bloki „Siatka” (Grid) i „Kolumny” w edytorze opisuje poradnik Gutenberga, a stabilność układu podczas ładowania (wskaźnik CLS) zmierzysz narzędziem opisanym w tekście o WebPageTest.
Najczęściej zadawane pytania
Czym różni się CSS Grid od Flexboxa?
Flexbox układa elementy w jednym wymiarze — w wierszu albo w kolumnie — i dobrze sprawdza się w paskach nawigacji czy grupach przycisków. Grid kontroluje jednocześnie wiersze i kolumny, więc lepiej nadaje się do układów całych stron, galerii i siatek kart.
Co oznacza jednostka fr w CSS Grid?
fr (fraction) oznacza część wolnej przestrzeni kontenera. Zapis 2fr 1fr dzieli dostępne miejsce tak, że pierwsza kolumna dostaje dwie trzecie, a druga jedną trzecią.
Jaka jest różnica między auto-fit a auto-fill?
Oba tworzą tyle kolumn, ile zmieści się w kontenerze. Przy małej liczbie elementów auto-fill zostawia puste kolumny, a auto-fit je zwija, dzięki czemu istniejące elementy rozciągają się na całą szerokość.
Czy CSS Grid działa we wszystkich przeglądarkach?
Tak, wszystkie współczesne przeglądarki (Chrome, Edge, Firefox, Safari, Opera i przeglądarki mobilne) obsługują CSS Grid bez prefiksów od 2017 roku, a subgrid od 2023 roku. Problemem był tylko Internet Explorer, który nie jest już wspierany.
Autor
Założyciel i redaktor XAD.pl. Pisze o sieciach, bezpieczeństwie IT, administracji systemami Windows i Linux oraz o sprzęcie, który sprawia ludziom problemy na co dzień.


