13.7. Umieszczanie elementów: grid-template-areas
Wizualne definiowanie układu
Oprócz umieszczania elementów za pomocą numerów lub nazw linii, CSS Grid Layout oferuje jeszcze bardziej wizualny i często intuicyjny sposób definiowania układu za pomocą właściwości grid-template-areas
. Pozwala ona stworzyć "mapę" siatki, przypisując nazwy do poszczególnych komórek lub grup komórek, a następnie umieszczać elementy w tych nazwanych obszarach.
Ten sposób jest szczególnie przydatny do definiowania głównych sekcji layoutu strony (nagłówek, treść, sidebar, stopka).
Właściwość grid-template-areas
stosuje się do **kontenera Grid**.
Składnia grid-template-areas
Wartością grid-template-areas
jest seria ciągów znaków (stringów) ujętych w cudzysłowy, gdzie każdy ciąg reprezentuje jeden **wiersz** siatki. Wewnątrz każdego ciągu, nazwy obszarów (oddzielone spacjami) definiują, który obszar zajmuje daną **kolumnę** w tym wierszu.
- Nazwy obszarów: Dowolne identyfikatory (ciągi znaków bez spacji, np.
header
,main-content
,sidebar
). - Pusta komórka: Kropka (
.
) lub seria kropek (...
) oznacza pustą komórkę, która nie należy do żadnego nazwanego obszaru. - Struktura: Liczba nazw (lub kropek) w każdym ciągu musi odpowiadać liczbie kolumn zdefiniowanych w
grid-template-columns
. Liczba ciągów musi odpowiadać liczbie wierszy zdefiniowanych wgrid-template-rows
. - Obszar prostokątny: Aby utworzyć obszar obejmujący wiele komórek, należy użyć tej samej nazwy w sąsiadujących komórkach, tworząc prostokątny kształt.
.container {
display: grid;
grid-template-columns: 150px 1fr; /* Dwie kolumny */
grid-template-rows: auto 1fr auto; /* Trzy wiersze */
gap: 10px;
grid-template-areas:
"header header" /* Wiersz 1: Obszar 'header' zajmuje obie kolumny */
"sidebar main" /* Wiersz 2: Kolumna 1 to 'sidebar', kolumna 2 to 'main' */
"footer footer"; /* Wiersz 3: Obszar 'footer' zajmuje obie kolumny */
}
Ten kod definiuje typowy układ strony:
- Nagłówek (
header
) na górze, rozciągnięty na całą szerokość. - Poniżej, lewa kolumna to pasek boczny (
sidebar
), a prawa to treść główna (main
). - Na dole stopka (
footer
), rozciągnięta na całą szerokość.
Umieszczanie elementów w nazwanych obszarach: grid-area
Po zdefiniowaniu nazwanych obszarów za pomocą grid-template-areas
, umieszczamy w nich elementy Grid za pomocą właściwości grid-area
, stosowanej do **elementu Grid**. Wartością grid-area
jest po prostu nazwa obszaru zdefiniowana w grid-template-areas
.
<div class="container">
<header class="grid-item">Nagłówek</header>
<aside class="grid-item">Sidebar</aside>
<main class="grid-item">Treść główna</main>
<footer class="grid-item">Stopka</footer>
</div>
/* ... definicja .container z grid-template-areas jak wyżej ... */
.grid-item {
background-color: lightgrey;
border: 1px solid grey;
padding: 10px;
}
header {
grid-area: header; /* Umieść ten element w obszarze 'header' */
background-color: lightblue;
}
aside {
grid-area: sidebar; /* Umieść ten element w obszarze 'sidebar' */
background-color: lightgreen;
}
main {
grid-area: main; /* Umieść ten element w obszarze 'main' */
background-color: lightyellow;
}
footer {
grid-area: footer; /* Umieść ten element w obszarze 'footer' */
background-color: lightcoral;
}
To wszystko! Elementy zostaną automatycznie umieszczone w odpowiednich obszarach zdefiniowanych przez grid-template-areas
. Jest to bardzo czytelny i semantyczny sposób budowania layoutu.
Niejawne nazwy linii
Jak wspomniano wcześniej, gdy używasz grid-template-areas
, Grid automatycznie tworzy **niejawne nazwane linie** na podstawie nazw obszarów. Dla każdego obszaru o nazwie foo
tworzone są linie foo-start
i foo-end
zarówno w pionie, jak i w poziomie, które otaczają ten obszar.
Dzięki temu można mieszać podejścia: definiować główny układ za pomocą grid-template-areas
, a następnie precyzyjnie umieszczać inne elementy wewnątrz tych obszarów lub względem nich, używając niejawnych nazwanych linii.
.container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-rows: auto 1fr auto;
grid-template-areas:
"head head"
"cont cont"
"foot foot";
}
.special-item {
/* Umieść od początku obszaru 'cont' do końca obszaru 'cont' w pionie */
grid-column: cont-start / cont-end;
/* Umieść w pierwszym wierszu obszaru 'cont' */
grid-row: cont-start / span 1;
}
Zadania praktyczne
Zadanie 1 (z rozwiązaniem)
Stwórz siatkę 2x2. Zdefiniuj obszary: top-left
, top-right
, bottom-left
, bottom-right
za pomocą grid-template-areas
. Umieść cztery elementy, każdy w odpowiednim obszarze, używając grid-area
.
Rozwiązanie:
HTML:
<div class="container-task1">
<div class="item tl">TL</div>
<div class="item tr">TR</div>
<div class="item bl">BL</div>
<div class="item br">BR</div>
</div>
CSS:
.container-task1 {
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-rows: 100px 100px;
gap: 5px;
border: 1px solid black;
grid-template-areas:
"top-left top-right"
"bottom-left bottom-right";
}
.item {
border: 1px solid grey;
display: flex; justify-content: center; align-items: center; font-size: 1.2em;
}
.tl { grid-area: top-left; background-color: lightblue; }
.tr { grid-area: top-right; background-color: lightgreen; }
.bl { grid-area: bottom-left; background-color: lightyellow; }
.br { grid-area: bottom-right; background-color: lightcoral; }
Efekt: Siatka 2x2, gdzie każdy element zajmuje jedną komórkę zgodnie z przypisanym obszarem.
Zadanie 2 (do samodzielnego wykonania)
Stwórz siatkę 3x3. Zdefiniuj obszary: header
zajmujący cały górny wiersz, sidebar
zajmujący pierwszą kolumnę w drugim i trzecim wierszu, content
zajmujący drugą i trzecią kolumnę w drugim i trzecim wierszu. Użyj kropek (.
) dla pustych komórek, jeśli są potrzebne (w tym przypadku nie są). Umieść odpowiednie elementy w tych obszarach.
Zadanie 3 (do samodzielnego wykonania)
Stwórz siatkę 4x3. Zdefiniuj obszar advert
zajmujący drugą kolumnę i wszystkie trzy wiersze. Pozostałe komórki oznacz jako puste (.
). Umieść jeden element w obszarze advert
.
FAQ - Najczęściej zadawane pytania
Czy nazwy obszarów w grid-template-areas
muszą być unikalne?
Nazwy używane do definiowania obszarów (np. header
, main
) muszą być unikalne w obrębie definicji grid-template-areas
. Ta sama nazwa jest używana wielokrotnie, aby zdefiniować prostokątny kształt obszaru.
Co się stanie, jeśli obszar zdefiniowany w grid-template-areas
nie jest prostokątny?
Definicja grid-template-areas
jest nieprawidłowa, jeśli ta sama nazwa obszaru jest użyta do zdefiniowania nieprostokątnego kształtu (np. w kształcie litery L). Przeglądarka zignoruje taką definicję. Wszystkie komórki należące do danego obszaru muszą tworzyć spójny prostokąt.
Czy muszę zdefiniować grid-template-columns
i grid-template-rows
, używając grid-template-areas
?
Tak, właściwość grid-template-areas
sama w sobie nie definiuje rozmiarów ani liczby kolumn/wierszy. Musisz nadal użyć grid-template-columns
i grid-template-rows
, aby określić strukturę siatki, a grid-template-areas
jedynie przypisuje nazwy do komórek w tej strukturze.
Czy mogę umieścić element poza nazwanym obszarem, używając grid-area
?
Nie, właściwość grid-area
z nazwą obszaru służy do umieszczania elementu **wewnątrz** obszaru zdefiniowanego w grid-template-areas
. Jeśli chcesz umieścić element poza tymi obszarami lub w sposób niezależny od nich, musisz użyć umieszczania opartego na liniach (grid-column
, grid-row
).