13.3. Odstępy w siatce: grid-gap, grid-column-gap, grid-row-gap
grid-gap, grid-column-gap, grid-row-gap
Definiowanie przestrzeni między ścieżkami (Rynny/Gutters)
Po zdefiniowaniu kolumn i wierszy siatki za pomocą grid-template-columns i grid-template-rows, często chcemy dodać przestrzeń **między** tymi ścieżkami, aby elementy siatki nie stykały się ze sobą. Te przestrzenie nazywane są **rynienkami** (gutters) lub po prostu odstępami.
CSS Grid Layout dostarcza dedykowanych właściwości do kontrolowania tych odstępów, stosowanych do **kontenera Grid**:
grid-column-gap: Definiuje rozmiar odstępu (rynny) **między kolumnami**.grid-row-gap: Definiuje rozmiar odstępu (rynny) **między wierszami**.grid-gap(lub nowsza, preferowana nazwagap): Skrócona właściwość do jednoczesnego ustawienia odstępów między wierszami i kolumnami.
Ważna uwaga: W nowszych specyfikacjach CSS nazwy tych właściwości zostały ujednolicone i uproszczone. Obecnie zaleca się używanie:
column-gapzamiastgrid-column-gaprow-gapzamiastgrid-row-gapgapzamiastgrid-gap
Te nowsze nazwy działają zarówno w Grid Layout, jak i we Flexboxie (dla odstępów między elementami flex w kontenerach wieloliniowych). Przeglądarki nadal wspierają stare nazwy (grid-*) dla kompatybilności wstecznej, ale w nowym kodzie lepiej używać column-gap, row-gap i gap.
column-gap (dawniej grid-column-gap)
Ustawia rozmiar odstępu wyłącznie między kolumnami siatki. Przyjmuje wartość długości (np. px, em, %).
.container {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
column-gap: 20px; /* Odstęp 20px tylko między kolumnami */
/* grid-row-gap: 0; (domyślnie) */
}
Odstęp pojawi się tylko między kolumną 1 a 2 oraz między kolumną 2 a 3. Nie będzie odstępu przed pierwszą ani za ostatnią kolumną.
row-gap (dawniej grid-row-gap)
Ustawia rozmiar odstępu wyłącznie między wierszami siatki. Przyjmuje wartość długości (np. px, em, %).
.container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-rows: 100px 100px;
row-gap: 1em; /* Odstęp 1em tylko między wierszami */
/* column-gap: 0; (domyślnie) */
}
Odstęp pojawi się tylko między wierszem 1 a 2. Nie będzie odstępu nad pierwszym ani pod ostatnim wierszem.
gap (dawniej grid-gap) - Skrót
Jest to skrócona właściwość, która pozwala ustawić row-gap i column-gap jednocześnie.
- Jedna wartość: Jeśli podasz jedną wartość (np.
gap: 15px;), zostanie ona zastosowana zarówno dorow-gap, jak icolumn-gap. - Dwie wartości: Jeśli podasz dwie wartości (np.
gap: 10px 20px;), pierwsza wartość ustawiarow-gap(odstęp między wierszami), a druga wartość ustawiacolumn-gap(odstęp między kolumnami).
/* Odstęp 15px między wierszami ORAZ między kolumnami */
.container-1 {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(2, 100px);
gap: 15px;
}
/* Odstęp 10px między wierszami i 20px między kolumnami */
.container-2 {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(2, 100px);
gap: 10px 20px;
}
Używanie skrótu gap jest zazwyczaj bardziej zwięzłe i czytelne.
Wizualizacja odstępów
Poniższy przykład pokazuje siatkę 2x2 z odstępami zdefiniowanymi za pomocą gap:
<div class="gap-example">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
</div>
.gap-example {
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-rows: 80px 80px;
gap: 10px 20px; /* 10px między wierszami, 20px między kolumnami */
border: 1px solid black;
padding: 10px; /* Padding kontenera, nie mylić z gap */
background-color: #f0f0f0; /* Tło kontenera, aby było widać odstępy */
}
.gap-example .item {
background-color: lightcoral;
border: 1px solid darkred;
display: flex; /* Dla wyśrodkowania tekstu */
justify-content: center;
align-items: center;
font-size: 1.5em;
}
Efekt wizualny:
Zwróć uwagę, że odstępy (szare tło kontenera) pojawiają się tylko **między** elementami siatki, a nie na krawędziach kontenera.
Zadania praktyczne
Zadanie 1 (z rozwiązaniem)
Stwórz siatkę 3x3 z równymi kolumnami i wierszami o wysokości 60px. Użyj właściwości gap, aby ustawić odstęp 10px zarówno między wierszami, jak i kolumnami.
Rozwiązanie:
HTML (9 elementów):
<div class="container-task1">
<div class="item">1</div><div class="item">2</div><div class="item">3</div>
<div class="item">4</div><div class="item">5</div><div class="item">6</div>
<div class="item">7</div><div class="item">8</div><div class="item">9</div>
</div>
CSS:
.container-task1 {
display: grid;
grid-template-columns: repeat(3, 1fr); /* 3 równe kolumny */
grid-template-rows: repeat(3, 60px); /* 3 wiersze po 60px */
gap: 10px; /* Odstęp 10px w obu kierunkach */
border: 1px solid black;
width: 300px; /* Przykładowa szerokość */
background-color: #f0f0f0;
}
.item {
background-color: lightblue;
border: 1px solid navy;
display: flex; justify-content: center; align-items: center;
}
Efekt: Siatka 3x3 z elementami oddzielonymi od siebie o 10px.
Zadanie 2 (do samodzielnego wykonania)
Stwórz siatkę 2x2. Użyj row-gap, aby ustawić odstęp 30px między wierszami, i column-gap, aby ustawić odstęp 5px między kolumnami.
Zadanie 3 (do samodzielnego wykonania)
Stwórz siatkę 4x2. Użyj skróconej właściwości gap, aby ustawić odstęp 0 między wierszami i 1em między kolumnami.
FAQ - Najczęściej zadawane pytania
Czy gap dodaje odstęp na krawędziach kontenera?
Nie, właściwości gap, column-gap i row-gap dodają odstępy **tylko między** ścieżkami (kolumnami lub wierszami) siatki. Nie tworzą one odstępu między krawędzią kontenera a pierwszą/ostatnią ścieżką. Do tego celu należy użyć właściwości padding na kontenerze Grid.
Czy mogę używać procentów w gap?
Tak, można używać wartości procentowych w gap, column-gap i row-gap. Procenty te odnoszą się do odpowiedniego wymiaru kontenera Grid (szerokości dla column-gap, wysokości dla row-gap).
Jakie są domyślne wartości odstępów?
Domyślną wartością dla gap, column-gap i row-gap jest 0. Oznacza to, że domyślnie nie ma żadnych odstępów między ścieżkami siatki.
Czy gap działa we Flexboxie?
Tak, nowsza właściwość gap (oraz row-gap i column-gap) działa również we Flexboxie dla kontenerów wieloliniowych (z flex-wrap: wrap lub flex-wrap: wrap-reverse), definiując odstępy między elementami flex. Jest to wygodniejsza alternatywa dla stosowania marginesów na elementach flex w celu uzyskania odstępów.