Kurs HTML

13.2. Definiowanie siatki: grid-template-columns i grid-template-rows

Strona główna > Kurs CSS > Rozdział 13: Grid Layout > Definiowanie siatki: 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ści fr.
.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ż jednostka fr.
.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.