13.2. Definiowanie siatki: grid-template-columns
i grid-template-rows
grid-template-columns
i grid-template-rows
Tworzenie struktury siatki
Po aktywowaniu Grid Layout za pomocą display: grid
lub inline-grid
, następnym krokiem jest zdefiniowanie struktury siatki, czyli określenie, ile ma mieć kolumn i wierszy oraz jakie mają być ich rozmiary.
Służą do tego dwie podstawowe właściwości stosowane do **kontenera Grid**:
grid-template-columns
: Definiuje nazwy i rozmiary **kolumn** siatki.grid-template-rows
: Definiuje nazwy i rozmiary **wierszy** siatki.
Wartościami tych właściwości są listy rozmiarów ścieżek (track sizes), oddzielone spacjami. Każda wartość na liście odpowiada jednej kolumnie (dla grid-template-columns
) lub jednemu wierszowi (dla grid-template-rows
).
Podstawowe jednostki rozmiaru ścieżek
Możemy używać różnych jednostek do określania rozmiarów kolumn i wierszy:
- Jednostki długości (np.
px
,em
,rem
): Definiują stały rozmiar ścieżki..container { display: grid; grid-template-columns: 200px 100px 300px; /* Trzy kolumny o stałych szerokościach */ grid-template-rows: 100px 50px; /* Dwa wiersze o stałych wysokościach */ }
- Procenty (
%
): Definiują rozmiar ścieżki jako procent rozmiaru kontenera Grid..container { display: grid; width: 600px; /* Kontener musi mieć zdefiniowany rozmiar dla % */ grid-template-columns: 50% 25% 25%; /* 300px, 150px, 150px */ }
- Słowo kluczowe
auto
: Rozmiar ścieżki jest określany na podstawie rozmiaru zawartości największego elementu w tej ścieżce. Ścieżka będzie tak szeroka/wysoka, jak potrzeba, aby zmieścić zawartość..container { display: grid; grid-template-columns: 100px auto 100px; /* Środkowa kolumna dopasuje się do zawartości */ }
Jednostka fr
(Fraction Unit)
Jednostka fr
jest specyficzna dla Grid Layout i reprezentuje **ułamek dostępnej przestrzeni** w kontenerze Grid.
Jest niezwykle użyteczna do tworzenia elastycznych układów, ponieważ pozwala rozdzielić pozostałą przestrzeń proporcjonalnie między ścieżkami.
- Przeglądarka najpierw przydziela przestrzeń dla ścieżek o stałych rozmiarach (px, em, auto, %).
- Następnie pozostała dostępna przestrzeń jest dzielona między ścieżki zdefiniowane za pomocą jednostki
fr
, proporcjonalnie do ich wartościfr
.
.container {
display: grid;
grid-template-columns: 100px 1fr 2fr;
/* 1. kolumna: 100px */
/* Pozostała przestrzeń jest dzielona: */
/* 2. kolumna: 1 część (1fr) */
/* 3. kolumna: 2 części (2fr) */
}
W powyższym przykładzie, jeśli kontener ma 700px szerokości, 100px jest zajęte przez pierwszą kolumnę. Pozostaje 600px. Ta przestrzeń jest dzielona na 1 + 2 = 3 części. Druga kolumna dostaje 1/3 * 600px = 200px, a trzecia 2/3 * 600px = 400px. Końcowe szerokości: 100px, 200px, 400px.
Równe kolumny:
.container {
display: grid;
grid-template-columns: 1fr 1fr 1fr; /* Trzy równe, elastyczne kolumny */
}
Funkcja repeat()
Funkcja repeat()
pozwala na zwięzłe definiowanie powtarzających się wzorców ścieżek.
Składnia: repeat(<liczba powtórzeń>, <lista ścieżek>)
/* Zamiast: grid-template-columns: 1fr 1fr 1fr 1fr; */
grid-template-columns: repeat(4, 1fr); /* Cztery równe kolumny */
/* Zamiast: grid-template-columns: 100px 20px 100px 20px 100px 20px; */
grid-template-columns: repeat(3, 100px 20px); /* Powtórz wzorzec (100px 20px) trzy razy */
/* Można łączyć z innymi definicjami */
grid-template-columns: 50px repeat(2, 1fr auto) 50px;
Można również użyć słów kluczowych auto-fill
lub auto-fit
zamiast liczby powtórzeń, aby automatycznie wypełnić kontener tyloma ścieżkami danego rozmiaru, ile się zmieści. Jest to przydatne w responsywnych układach.
.container {
display: grid;
/* Stwórz tyle kolumn o minimalnej szerokości 150px, ile się zmieści, */
/* a pozostałą przestrzeń rozdziel równo między nimi (1fr) */
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
}
Funkcja minmax()
Funkcja minmax()
pozwala zdefiniować zakres rozmiarów dla ścieżki - minimalny i maksymalny rozmiar.
Składnia: minmax(<min>, <max>)
<min>
: Minimalny rozmiar ścieżki.<max>
: Maksymalny rozmiar ścieżki. Może to być również jednostkafr
.
.container {
display: grid;
/* Pierwsza kolumna: min 100px, max 200px */
/* Druga kolumna: min 150px, elastyczna (1fr), ale nie szersza niż 400px */
/* Trzecia kolumna: min dopasowany do zawartości (auto), max elastyczny (1fr) */
grid-template-columns: minmax(100px, 200px) minmax(150px, min(1fr, 400px)) minmax(auto, 1fr);
}
minmax()
jest często używane w połączeniu z repeat(auto-fit, ...)
do tworzenia responsywnych siatek, które dostosowują liczbę kolumn do dostępnej przestrzeni, jednocześnie zapewniając, że kolumny nie staną się zbyt wąskie.
Zadania praktyczne
Zadanie 1 (z rozwiązaniem)
Stwórz kontener Grid z siatką 3x2 (3 kolumny, 2 wiersze). Pierwsza kolumna ma mieć 100px, druga ma być elastyczna (1fr), a trzecia ma dopasować się do zawartości (auto). Pierwszy wiersz ma mieć 50px wysokości, a drugi 80px.
Rozwiązanie:
HTML (6 elementów):
<div class="container-task1">
<div class="item">1</div><div class="item">2</div><div class="item">Trzy</div>
<div class="item">4</div><div class="item">5</div><div class="item">Sześć</div>
</div>
CSS:
.container-task1 {
display: grid;
grid-template-columns: 100px 1fr auto; /* Definicja kolumn */
grid-template-rows: 50px 80px; /* Definicja wierszy */
border: 1px solid black;
width: 500px; /* Przykładowa szerokość kontenera */
}
.item {
border: 1px solid #ccc;
background-color: #eee;
padding: 5px;
}
Efekt: Elementy ułożą się w siatce 3x2 zgodnie ze zdefiniowanymi rozmiarami kolumn i wierszy.
Zadanie 2 (do samodzielnego wykonania)
Użyj funkcji repeat()
, aby stworzyć siatkę z 5 równymi, elastycznymi kolumnami.
Zadanie 3 (do samodzielnego wykonania)
Stwórz responsywną siatkę za pomocą repeat(auto-fit, minmax(120px, 1fr))
dla kolumn. Dodaj kilka elementów i zobacz, jak siatka dostosowuje się do szerokości okna przeglądarki.
FAQ - Najczęściej zadawane pytania
Co się stanie, jeśli mam więcej elementów niż zdefiniowanych komórek w siatce?
Grid automatycznie utworzy dodatkowe wiersze (lub kolumny, jeśli elementy są umieszczane wierszowo), aby pomieścić dodatkowe elementy. Rozmiar tych **niejawnych** ścieżek można kontrolować za pomocą właściwości grid-auto-rows
i grid-auto-columns
.
Czy mogę mieszać jednostki fr
z procentami?
Tak, można mieszać różne jednostki. Pamiętaj, że jednostki fr
działają na przestrzeni **pozostałej** po uwzględnieniu ścieżek o stałych rozmiarach i procentowych.
Jaka jest różnica między auto-fit
a auto-fill
w repeat()
?
Obie tworzą tyle ścieżek, ile się zmieści. Różnica pojawia się, gdy po umieszczeniu ścieżek zostaje wolne miejsce. auto-fill
pozostawi to miejsce puste (tworząc puste ścieżki), podczas gdy auto-fit
"zwinie" puste ścieżki i pozwoli istniejącym elastycznym ścieżkom (np. z 1fr
) zająć tę przestrzeń. W praktyce auto-fit
jest często bardziej pożądane.
Czy grid-template-rows
jest zawsze potrzebne?
Nie zawsze. Jeśli nie zdefiniujesz grid-template-rows
, wysokość wierszy domyślnie dopasuje się do zawartości (auto
). Definiowanie grid-template-rows
jest potrzebne, gdy chcesz mieć kontrolę nad wysokością wierszy lub stworzyć siatkę o określonej liczbie wierszy o konkretnych rozmiarach.