Menu

CSS Grid: kolumny, wiersze, fr, gap i obszary

CSS grid układa elementy jednocześnie w wierszach i kolumnach. Poznaj display: grid, grid-template-columns, jednostkę fr, repeat() i minmax(), auto-fill kontra auto-fit, umieszczanie elementów przez grid-column oraz grid-template-areas, na żywej siatce, którą edytujesz i mierzysz.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

Siatka w trzech linijkach

Ustaw display: grid na kontenerze i wypisz jego kolumny w grid-template-columns. Dzieci wypełniają komórki po kolei, w języku polskim od lewej do prawej, a nowy wiersz zaczyna się, gdy kolumny są pełne:

Siedem elementów, trzy kolumny: dwa pełne wiersze i trzeci wiersz z elementem 7 w pierwszej kolumnie. Każda kolumna ma tę samą szerokość, a każdy element w wierszu tę samą wysokość, więc krawędzie wyrównują się w obu kierunkach. To właśnie grid dodaje w porównaniu z flexboxem.

Edytor online siatki

Wpisz dowolną wartość grid-template-columns albo kliknij gotowe ustawienie. Odczyt pokazuje szerokości kolumn obliczone przez przeglądarkę (z getComputedStyle) i liczbę wierszy potrzebnych dla elementów:

Na co zwrócić uwagę: 1fr 2fr sprawia, że druga kolumna jest dokładnie dwa razy szersza od pierwszej. 200px 1fr zachowuje 200px, a resztę oddaje drugiej kolumnie. auto 1fr auto dopasowuje zewnętrzne kolumny do ich treści. repeat(4, 100px) zostawia na końcu puste miejsce, bo nic nie jest elastyczne. Nieprawidłowa wartość, na przykład 1fr 2, jest ignorowana, a siatka zachowuje ostatnią poprawną wartość.

Jednostka fr

fr oznacza "jeden udział w wolnej przestrzeni". Przeglądarka najpierw odejmuje stałe kolumny (px, rem, %, treść auto) i odstępy, a potem dzieli resztę między kolumny fr według ich liczb.

grid-template-columns w kontenerze 600px, bez odstępuSzerokości kolumn
1fr 1fr 1fr200, 200, 200
1fr 2fr200, 400
100px 1fr 1fr100, 250, 250
1fr 50%300, 300

fr to nie to samo co %: procenty razem z odstępami mogą dać więcej niż 100% i wylać się poza kontener, a kolumny fr zawsze dzielą tylko to, co zostaje po odstępach.

repeat(), minmax() i responsywna siatka bez media queries

repeat(4, 1fr) to 1fr 1fr 1fr 1fr. minmax(120px, 1fr) to kolumna, która nigdy nie jest węższa niż 120px i rośnie, żeby zająć swój udział. Połącz je z auto-fill lub auto-fit zamiast liczby, a siatka utworzy tyle kolumn, ile się zmieści:

.cards {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: 16px;
}

Ta jedna deklaracja daje tyle kolumn o szerokości co najmniej 180px, ile zmieści kontener: kilka na szerokim ekranie, jedną na telefonie, bez żadnego media query. Różnicę między auto-fill a auto-fit widać, gdy elementów jest mniej niż kolumn:

Kontener mieści pięć kolumn po 100px. auto-fill zachowuje wszystkie pięć, więc A, B i C mają po 112px, a dwie kolumny zostają puste. auto-fit zwija puste kolumny, więc trzy elementy rozciągają się do około 187px każdy.

Umieszczanie elementów: grid-column i grid-row

Linie siatki są numerowane od 1 przy krawędzi początkowej. grid-column: 1 / 3 oznacza "od linii 1 do linii 3", czyli dwie kolumny. span 2 oznacza "dwie kolumny od miejsca, w którym element wyląduje", a -1 to ostatnia linia:

Ciemny element wypełnia cały pierwszy wiersz. Niebieski zajmuje blok 2 na 2, bursztynowy dwa wiersze. Elementy a i b same wypełniają pozostałe komórki: grid umieszcza każdy element, jaki może, w następnej wolnej komórce. grid-auto-rows: 60px ustawia wysokość wierszy, których nie zadeklarowano w grid-template-rows.

grid-template-areas: nazwij części układu

W układzie strony nazwij obszary i narysuj je jako tekst. Każdy ciąg znaków to wiersz, każde słowo to komórka, a element dołącza do obszaru przez grid-area:

Nagłówek i stopka zajmują obie kolumny, bo ich nazwy wypełniają obie komórki swoich wierszy. Środkowy wiersz ma 1fr, więc zajmuje całą wysokość, jaka zostaje z 280px. Żeby na telefonie ułożyć wszystko jedno pod drugim, media query musi tylko narysować obszary na nowo jako jedną kolumnę: grid-template-areas: "header" "side" "main" "footer" z grid-template-columns: 1fr. Strona o media queries pokazuje ten wzorzec.

Wyrównanie wewnątrz komórek

Elementy grid domyślnie rozciągają się na całą komórkę. Te właściwości przesuwają je w jej obrębie:

WłaściwośćNaPrzesuwa
justify-itemskontenerzekażdy element wzdłuż wiersza (oś inline)
align-itemskontenerzekażdy element w górę i w dół (oś blokowa)
place-itemskontenerzeskrót: place-items: center wyśrodkowuje w obu osiach
justify-self / align-selfelemenciejeden element
justify-content / align-contentkontenerzecały zestaw ścieżek, gdy siatka jest mniejsza niż kontener

display: grid; place-items: center; to najkrótszy sposób na wyśrodkowanie jednego dziecka w pudełku.

Grid czy flexbox

Grid jest dwuwymiarowy: ty decydujesz o kolumnach (i wierszach), a treść je wypełnia, więc każda karta w galerii ma tę samą szerokość, nawet w ostatnim wierszu. Flexbox jest jednowymiarowy: elementy dobierają rozmiar do treści wzdłuż jednej linii. Dobrze się łączą: grid dla strony i galerii kart, flexbox wewnątrz każdej karty dla jej wiersza nagłówka. Strona o flexboxie omawia drugą połowę.

Kolejność i dostępność

grid-template-areas, grid-row, grid-column i order mogą umieścić element w dowolnym miejscu, ale czytniki ekranu i klawisz Tab nadal podążają za kolejnością w HTML. Zadbaj o sensowną kolejność w kodzie źródłowym (nagłówek, nawigacja, treść główna, stopka) i używaj grid do jej rozmieszczenia, a nie do naprawiania kolejności HTML, która nie ma sensu.

Częste błędy

  • Ustawianie display: grid na elementach. Należy do rodzica; tylko bezpośrednie dzieci są elementami grid.
  • Procenty razem z odstępami. grid-template-columns: 50% 50% plus gap: 16px wylewa się o 16px. Użyj 1fr 1fr.
  • auto-fill, gdy chodziło o auto-fit. Przy niewielu elementach auto-fill zostawia puste kolumny. Przełącz na auto-fit, żeby rozciągnąć elementy.
  • Kolumna 1fr, która rośnie ponad swój udział. Kolumna 1fr nie zwęzi się poniżej swojej najdłuższej treści (długiego adresu URL, szerokiego obrazka). Użyj minmax(0, 1fr), żeby mogła się zwężać.
  • Ciągi obszarów, które nie są prostokątami. Każdy nazwany obszar musi tworzyć prostokąt, a każdy ciąg wiersza musi mieć tyle samo komórek, inaczej cała deklaracja grid-template-areas zostaje zignorowana.
  • Zapominanie, że numeracja linii zaczyna się od 1. Trzy kolumny mają cztery linie: 1 / 4 lub 1 / -1 obejmuje wszystkie trzy.

Najczęściej zadawane pytania

Czym jest CSS grid?

To system układu, który umieszcza elementy jednocześnie w wierszach i kolumnach. Ustawiasz display: grid na kontenerze, opisujesz jego kolumny przez grid-template-columns (i opcjonalnie wiersze), a jego bezpośrednie dzieci wypełniają komórki po kolei.

Co oznacza 1fr w CSS grid?

fr to ułamek wolnej przestrzeni w kontenerze grid. grid-template-columns: 1fr 1fr 1fr daje trzy równe kolumny, a 1fr 2fr sprawia, że druga kolumna jest dwa razy szersza od pierwszej. Najpierw odejmowane są stałe rozmiary i odstępy; kolumny fr dzielą się tym, co zostało.

Czym różni się auto-fill od auto-fit?

Oba tworzą tyle kolumn, ile się zmieści. auto-fill zachowuje puste kolumny, więc kilka elementów pozostaje wąskich i na końcu wiersza zostaje puste miejsce. auto-fit zwija puste kolumny, więc elementy rozciągają się na cały wiersz. Gdy elementów wystarczy, żeby wypełnić wiersz, oba wyglądają tak samo.

Jak sprawić, żeby element grid zajmował dwie kolumny?

Użyj na elemencie grid-column: span 2 albo podaj linię początkową i końcową: grid-column: 1 / 3 obejmuje kolumny 1 i 2. grid-column: 1 / -1 zajmuje całą szerokość, bo -1 to ostatnia linia.

Kiedy używać grid zamiast flexboxa?

Używaj grid, gdy wiersze i kolumny muszą się ze sobą wyrównywać: galerie kart, formularze z wyrównanymi etykietami, strona z nagłówkiem, panelem bocznym i stopką. Używaj flexboxa dla pojedynczego wiersza lub kolumny, których elementy dopasowują rozmiar do treści, na przykład paska nawigacji.

Czy grid-gap to to samo co gap?

Tak. grid-gap, grid-row-gap i grid-column-gap to stare nazwy. Przeglądarki nadal akceptują je jako aliasy, ale pisz gap, row-gap i column-gap, które działają też we flexboxie.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ