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).