Wyobraź sobie wielką piramidę w Gizie. Jej konstrukcja opiera się na precyzyjnej siatce kamiennych bloków, która przenika przez wszystkie warstwy budowli - od fundamentów, przez komory, aż po szczyt. Każda wewnętrzna komora jest idealnie wyrównana z zewnętrzną strukturą. Dokładnie tak działa CSS Subgrid - pozwala elementom potomnym dziedziczyć i współdzielić siatkę rodzica, zapewniając idealne wyrównanie na wszystkich poziomach zagnieżdżenia.
Bez subgridu, kiedy tworzysz zagnieżdżony grid, element potomny tworzy swoją własną, niezależną siatkę. To tak, jakby budować mniejszą piramidkę wewnątrz wielkiej piramidy, ale bez zachowania wyrównania z głównymi blokami.
Rozważmy typowy przykład - siatka kart, gdzie każda karta ma nagłówek, treść i stopkę. Chcemy, aby nagłówki wszystkich kart były wyrównane, treści wyrównane i stopki wyrównane - niezależnie od ilości tekstu w każdej sekcji.
1.grid {
2 display: grid;
3 grid-template-columns: repeat(3, 1fr);
4 gap: 1.5rem;
5}
6
7/* Każda karta ma WŁASNY grid - brak wyrównania między kartami! */
8.card {
9 display: grid;
10 grid-template-rows: auto 1fr auto;
11}W tym przypadku nagłówek jednej karty może być wyższy niż w innej, przez co treści i stopki nie są wyrównane w jednej linii. To tak, jakby wewnętrzne komnaty piramidy nie pasowały do zewnętrznej siatki bloków.
1.grid {
2 display: grid;
3 grid-template-columns: repeat(3, 1fr);
4 /* Definiujemy wspolne wiersze dla WSZYSTKICH kart */
5 grid-template-rows: subgrid;
6 gap: 1.5rem;
7}
8
9.card {
10 display: grid;
11 /* Karta DZIEDZICZY wiersze od rodzica */
12 grid-template-rows: subgrid;
13 /* Karta zajmuje 3 wiersze rodzica */
14 grid-row: span 3;
15}Teraz nagłówki, treści i stopki wszystkich kart są idealnie wyrównane - ponieważ wszystkie korzystają z tej samej siatki wierszy.
Subgrid stosuje się jako wartość
grid-template-columns lub grid-template-rows (albo obu naraz):1/* Subgrid tylko dla kolumn */
2.child {
3 display: grid;
4 grid-template-columns: subgrid;
5}
6
7/* Subgrid tylko dla wierszy */
8.child {
9 display: grid;
10 grid-template-rows: subgrid;
11}
12
13/* Subgrid dla obu osi */
14.child {
15 display: grid;
16 grid-template-columns: subgrid;
17 grid-template-rows: subgrid;
18}Element potomny musi:
display: grid1.gallery {
2 display: grid;
3 grid-template-columns: repeat(3, 1fr);
4 gap: 1rem;
5}
6
7.card {
8 display: grid;
9 /* Dziedzicz kolumny rodzica - tu niepotrzebne, bo karta zajmuje 1 kolumne */
10 /* Dziedzicz WIERSZE - tu uzyteczne */
11 grid-row: span 3;
12 grid-template-rows: subgrid;
13 border: 2px solid #d4af37;
14 border-radius: 8px;
15 overflow: hidden;
16}
17
18.card-header {
19 background: #8b6914;
20 color: white;
21 padding: 1rem;
22}
23
24.card-body {
25 padding: 1rem;
26}
27
28.card-footer {
29 padding: 1rem;
30 background: #f5f1e3;
31 border-top: 1px solid #d4af37;
32 align-self: end;
33}Kluczowa różnica polega na współdzieleniu ścieżek:
1/* Zwykly zagniezdz. grid - NIEZALEZNA siatka */
2.parent {
3 display: grid;
4 grid-template-columns: 200px 1fr 200px;
5}
6
7.child-normal {
8 grid-column: 1 / -1;
9 display: grid;
10 /* Tworzy własną siatkę 3-kolumnową, ale ROZMIARY mogą się różnić */
11 grid-template-columns: 200px 1fr 200px;
12}
13
14/* Subgrid - WSPOLDZIELONA siatka */
15.child-subgrid {
16 grid-column: 1 / -1;
17 display: grid;
18 /* Uzywa DOKLADNIE tych samych kolumn co rodzic */
19 grid-template-columns: subgrid;
20}Przy zwykłym zagnieżdżeniu, wartości
200px w dziecku i rodzicu mogą się różnić (np. przez gap). Subgrid gwarantuje dokładne dopasowanie, bo dziecko dosłownie używa tych samych linii siatki co rodzic.1.form {
2 display: grid;
3 grid-template-columns: 150px 1fr;
4 gap: 0.75rem 1rem;
5}
6
7.form-row {
8 display: grid;
9 grid-column: 1 / -1;
10 grid-template-columns: subgrid;
11 align-items: center;
12}
13
14.form-row label {
15 text-align: right;
16 color: #8b6914;
17}1.mosaic {
2 display: grid;
3 grid-template-columns: repeat(4, 1fr);
4 grid-template-rows: repeat(3, 200px);
5 gap: 0.5rem;
6}
7
8.mosaic-item-large {
9 grid-column: span 2;
10 grid-row: span 2;
11 display: grid;
12 grid-template-columns: subgrid;
13 grid-template-rows: subgrid;
14}Subgrid uzyskał pełne wsparcie we wszystkich głównych przeglądarkach w 2023 roku (Chrome 117, Firefox 71, Safari 16). Możesz bezpiecznie stosować go w nowoczesnych projektach, opcjonalnie z fallbackiem:
1.card {
2 display: grid;
3 /* Fallback - własny grid */
4 grid-template-rows: auto 1fr auto;
5}
6
7@supports (grid-template-rows: subgrid) {
8 .card {
9 grid-row: span 3;
10 grid-template-rows: subgrid;
11 }
12}Subgrid to jedna z najważniejszych nowości w CSS Grid, która rozwiązuje realne problemy z wyrównaniem elementów w zagnieżdżonych siatkach. Jak precyzyjna siatka kamiennych bloków w piramidzie Cheopsa - zapewnia idealne dopasowanie na każdym poziomie konstrukcji.