← Lekcje
CSS · lekcja 13

Układ w HTML5: CSS Grid

Na poprzedniej lekcji nazwaliście kawałki strony znacznikami <header>, <nav>, <main>, <aside>, <footer> - ale strona nadal wygląda jak jedna kolumna pod drugą, bo to normalny przepływ blokowy. display: grid rozkłada te same znaczniki po siatce wierszy i kolumn.

  1. display: grid i grid-template-columns - jak podzielić kontener na kolumny, jednostka fr
  2. gap - odstępy między kratkami siatki
  3. grid-template-areas i grid-area - nazwane pola siatki dla header/nav/main/aside/footer
Rozgrzewka · 3 minuty

Trzy pytania z poprzedniej lekcji

  1. Ile razy może wystąpić <main> na jednej stronie i gdzie ma się znajdować?
  2. Czym różni się <article> od <section>?
  3. Dlaczego zamiana <div> na <header>/<nav>/<main>/<footer> nie zmienia wyglądu strony?
Część 1 · kolumny i jednostka fr

Kontener na kolumny: grid-template-columns

display: grid zamienia bezpośrednie dzieci kontenera w elementy siatki (grid items) - podobnie jak display: flex z lekcji 10. Różnica: sama siatka na start ma jedną kolumnę, więc nic się nie zmienia, dopóki nie dodacie kolumn właściwością grid-template-columns. Zamiast sztywnych pikseli lepiej użyć jednostki fr (fraction, „ułamek”) - to fragment wolnego miejsca w kontenerze. grid-template-columns: 1fr 3fr daje dwie kolumny w proporcji 1 do 3, niezależnie od tego, jak szerokie jest okno.

grid-template-columns: 1fr 3fr wąskie okno 1fr 3fr szerokie okno 1fr 3fr ta sama proporcja 1:3 przy każdej szerokości kontenera

Ciekawostka z Wikipedii: pierwszy pełny szkic CSS Grid napisali w 2011 roku inżynierowie Microsoftu (Phil Cupp, Markus Mielke i Alex Mogilevsky) i trafił od razu do przeglądarki Internet Explorer 10, ukryty pod przedrostkiem -ms-. Dzisiejszą, dopracowaną składnię z tej lekcji grupa robocza CSS opisała dopiero kilka lat później.

MDN: „the display: grid property transforms all the direct children of the container into grid items” · „Declaring display: grid gives you a one column grid, so your items will continue to display one below the other as they do in normal flow” · „The fr unit represents one fraction of the available space in the grid container to flexibly size grid rows and columns” · developer.mozilla.org/docs/Learn_web_development/Core/CSS_layout/Grids · ciekawostka: en.wikipedia.org/wiki/CSS_grid_layout
Część 2 · odstępy między kratkami

Odstępy w siatce: gap

Bez odstępu kratki siatki stykają się krawędziami. column-gap ustawia odstęp między kolumnami, row-gap między wierszami, a gap to skrót na oba naraz. Odstępy podaje się w dowolnej jednostce długości albo w procentach - nie w fr.

column-gap row-gap gap: 20px (skrót na row-gap i column-gap naraz)
MDN: „To create gaps between tracks, we use the properties: column-gap for gaps between columns, row-gap for gaps between rows, gap as a shorthand for both” · „These gaps can be any length unit or percentage, but not an fr unit” · developer.mozilla.org/docs/Learn_web_development/Core/CSS_layout/Grids
Część 3 · nazwane pola: grid-template-areas

Nazwij pola siatki: grid-template-areas

Zamiast liczyć numery kolumn i wierszy, można nazwać pola siatki wprost - tym samym słowem, którego użyliście w znacznikach sekcji na poprzedniej lekcji. Każdy wiersz w cudzysłowie to jeden rząd siatki, a powtórzenie nazwy scala sąsiednie kratki w jedno pole.

RegułaCo to znaczy
Każda kratka wypełnionaNie można zostawić kratki bez nazwy - każda musi coś dostać
Powtórzenie nazwyTa sama nazwa w sąsiednich kratkach scala je w jedno, większe pole
Kropka .Zostawia kratkę pustą (bez nazwy pola)
Pole musi być prostokątemNie można ułożyć nazwy w kształcie litery L
Nazwa razTa sama nazwa nie może się pojawić w dwóch osobnych, niesąsiadujących miejscach
MDN: „An alternative way to arrange items on your grid is to use the grid-template-areas property and give the various elements of your design a name” · „You need to have every cell of the grid filled. To span across two cells, repeat the name. To leave a cell empty, use a . (period). Areas must be rectangular, for example you can't have an L-shaped area. Areas can't be repeated in different locations” · developer.mozilla.org/docs/Learn_web_development/Core/CSS_layout/Grids
Część 3 · przypisanie znaczników: grid-area

Znacznik trafia do pola: grid-area

Kontener dostaje grid-template-areas z pięcioma nazwami znanymi z poprzedniej lekcji. Każdy znacznik dostaje grid-area z pasującą nazwą, żeby przeglądarka wiedziała, do którego pola go wstawić.

.container {
  display: grid;
  grid-template-columns: 1fr 3fr 1fr;
  grid-template-areas:
    "header header header"
    "nav    main    aside"
    "footer footer footer";
  gap: 20px;
}
header { grid-area: header; }
nav    { grid-area: nav; }
main   { grid-area: main; }
aside  { grid-area: aside; }
footer { grid-area: footer; }
MDN: „We are then using the grid-area property to define where elements are placed in the grid-template-areas” · developer.mozilla.org/docs/Learn_web_development/Core/CSS_layout/Grids
Część 3 · efekt na stronie

Ta sama strona, teraz siatką

To ta sama makieta co na poprzedniej lekcji - header na całą szerokość u góry, nav/main/aside obok siebie w środkowym rzędzie, footer na całą szerokość na dole. Różnica: wcześniej znaczniki tylko się nazywały, teraz siatka faktycznie układa je w te pola, z odstępem gap między kratkami.

header nav main aside footer grid-template-columns: 1fr 3fr 1fr · gap: 20px
developer.mozilla.org/docs/Learn_web_development/Core/CSS_layout/Grids
CSS Grid · moje pytanie

Sprawdźmy zrozumienie: grid-template-areas

Który zapis grid-template-areas ułoży header na całą szerokość u góry, nav/main/aside obok siebie w jednym rzędzie poniżej i footer na całą szerokość na dole - bez łamania żadnej reguły z tej lekcji?

A.

"header header header"
"nav    main    aside"
"footer footer footer"

B.

"header nav main"
"aside footer footer"

C.

"header header nav"
"nav    main    aside"
"footer footer footer"

D.

"header header header"
"nav    main    aside"
"footer footer .    "
MDN: „Unless the values form a rectangle the declaration is invalid” · developer.mozilla.org/docs/Web/CSS/grid-template-areas
Ćwiczenie · przy komputerze · 25 minut

Ćwiczenie: układ siatką CSS Grid

  1. Otwórz style.css i index.html (oraz pozostałe podstrony) swojej witryny.
  2. Do głównego kontenera strony (albo wprost do body) dodaj display: grid, grid-template-columns (np. 1fr 3fr 1fr) i grid-template-areas z pięcioma polami: header, nav, main, aside, footer - tak jak przy znacznikach sekcji.
  3. Znacznikom header, nav, main, aside, footer przypisz grid-area z pasującą nazwą. Dodaj gap, żeby pola nie stykały się krawędziami.
  4. Zapisz, F5, sprawdź w przeglądarce - strona ma teraz układ kolumnowy zamiast jednej kolumny pod drugą.

Pamiętajcie: liczba nazw w każdym wierszu grid-template-areas musi być taka sama (kropka . zostawia pustą kratkę) - inaczej przeglądarka zignoruje całą właściwość.

Pytania kontrolne

Trzy pytania na koniec

  1. Co się stanie, gdy w grid-template-areas powtórzycie tę samą nazwę w dwóch sąsiednich kratkach?
  2. Czym różni się jednostka fr od pikseli przy zmianie szerokości okna?
  3. Dlaczego kropka . w grid-template-areas nie jest nazwą pola?

To tyle: cały kurs CSS zamknięty, od pierwszej reguły po układ całej strony siatką.

Z realnych wdrożeń

A jak to wygląda w produkcji?

Na lekcjiW produkcjiStatus
grid-template-areas z nazwami header/nav/main/aside/footerTen sam mechanizm w panelach administracyjnych i sklepach internetowych - nazwane pola czytelne w kodzie bez liczenia numerów kolumn i wierszynadal w użyciu
float do układania całej strony kolumnami (lekcja 10)CSS Grid razem z flexboksem zastąpił float w układaniu całych stron - float wrócił do swojej pierwotnej roli: obrazek otoczony tekstemzastąpione
Stałe piksele w grid-template-columnsW realnych witrynach kolumny częściej mają jednostkę fr albo funkcję minmax(), żeby siatka reagowała na szerokość ekranu bez dodatkowych reguł (poza zakresem tej lekcji)nadal w użyciu
MDN: „Using floats [for whole-page layouts] should be regarded as a legacy technique” · developer.mozilla.org/docs/Learn_web_development/Core/CSS_layout/Floats