https://i.imgur.com/KAX60tb.png

Сегодня мы с вами рассмотрим свойства CSS Grid (далее также — Грид), позволяющие создавать адаптивные или отзывчивые макеты веб-страниц. Я постараюсь кратко, но полно объяснить, как работает каждое свойство.
[think=http://www.kolobok.us/smiles/standart/help.gif]Что такое CSS Grid?[/think]
Грид — это макет для сайта (его схема, проект).

Грид-модель позволяет размещать контент сайта (располагать его определенным образом, позиционировать). Она позволяет создавать структуры, необходимые для обеспечения отзывчивости сайтов на различных устройствах. Это означает, что сайт будет одинаково хорошо смотреться на компьютере, телефоне и планшете.

Вот простой пример макета сайта, созданного с помощью Грида.

Компьютер

https://i.imgur.com/F6ESxBr.png

Телефон

https://i.imgur.com/7lb2Htx.png

[think=http://www.kolobok.us/smiles/standart/help.gif]Архитектура CSS Grid[/think]
Как же Грид работает? Элементы Грида (grid items) располагаются вдоль главной или основной (main) и поперечной (cross) оси (axis). При помощи различных свойств мы можем манипулировать элементами для создания макетов.

https://i.imgur.com/IAFs8yx.png

Помимо прочего, у нас имеется возможность объединять строки и колонки подобно тому, как мы это делаем в Excel, что предоставляет нам большую гибкость, чем Флекс (Flexbox).
[think=http://www.kolobok.us/smiles/standart/help.gif]Схема CSS Grid[/think]
Схема содержит все возможные свойства, предоставляемые Гридом. Эти свойства делятся на:

https://i.imgur.com/YKmhxo7.png

родительские (свойства грид-контейнера) и
дочерние (свойства грид-элементов)

Обратите внимание: красным цветом отмечены сокращения для свойств:

https://i.imgur.com/b2UCDCl.png
https://i.imgur.com/vXSySEz.png

К концу настоящей статьи у вас будет полное понимание того, как работает каждое из них.
[think=http://www.kolobok.us/smiles/standart/help.gif]Настройка проекта[/think]

https://i.imgur.com/tQcteqx.png

Для данного проекта требуются начальные знания HTML, CSS и умение работать с VSCode (или другим редактором по вашему вкусу). Делаем следующее:

1. Создаем директорию для проекта, например, Project1 и открываем ее в редакторе (cd Project1, code .)
2. Создаем файлы index.html и style.css
3. Устанавливаем в VSCode сервер для разработки (Live Server, расширение) и запускаем его.

Или вы можете просто открыть Codepen (или любую другую песочницу) и начать писать код.

https://i.imgur.com/dtIWqAT.png

Все готово, можно приступать к делу.

HTML:
Создаем 3 контейнера внутри body:

Код:
<div class="container">
  <div class="box-1"> A </div>
  <div class="box-2"> B </div>
  <div class="box-3"> C </div>
</div>

CSS:
Шаг 1
Сбрасываем стили:

Код:
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

Шаг 2
Немного стилизуем body:

Код:
body {
  font-family: sans-serif;
  font-size: 40px;
  width: 100%;
  min-height: 100vh;
}

Шаг 3
Стилизуем все контейнеры:

Код:
[class^="box-"] {
  background-color: skyblue;
  /* Размещаем контейнеры по центру */
  display: grid;
  place-items: center;
}

Не волнуйтесь, мы рассмотрим каждое из указанных свойств Грида.

Шаг 4
Добавим небольшой отступ между контейнерами:

Код:
.container {
  display: grid;
  gap: 20px;
}

Погодите-ка
Давайте разберемся с отношениями между родительским и дочерними элементами.

https://i.imgur.com/Gv11oDr.png

Свойства родительского элемента определяются в .container, а свойства дочерних элементов — в .box-*.
[think=http://www.kolobok.us/smiles/standart/help.gif]Свойства грид-контейнера[/think]

https://i.imgur.com/K4JYhjW.png

Начнем со свойств родительского элемента.

grid-template-columns

Данное свойство используется для определения количества и ширины колонок. При этом, можно определять как свойства для каждой колонки в отдельности, так и устанавливать ширину всех колонок с помощью функции repeat().

https://i.imgur.com/LhI1agc.png
https://i.imgur.com/EprtMYq.png

Добавим строку в style.css:

Код:
.container {
  display: grid;
  gap: 20px;

  /* ! */
  grid-template-columns: 200px auto 100px;
}

Обратите внимание:
• значения в пикселях будут точными. Ключевое слово auto означает заполнение элементом всего доступного пространства
• использование единицы fr (фракция) в repeat() означает, что все контейнеры будут иметь одинаковую ширину

grid-template-rows

Данное свойство используется для определения количества и высоты строк. При этом, можно определять как высоту каждой колонки в отдельности, так и устанавливать высоту всех строк с помощью функции repeat().

https://i.imgur.com/OUIeUv0.png
https://i.imgur.com/tvBrZAo.png

Изменим строку в style.css:

Код:
.container {
  display: grid;
  gap: 20px;
  height: 100vh;

  /* ! */
  grid-template-rows: 200px auto 100px;
}

grid-template-areas

Данное свойство используется для определения количества пространства, занимаемого ячейкой Грида (grid cell), в терминах колонок и строк, в родительском контейнере.

https://i.imgur.com/oMlljLd.png

Для получения результата требуется не только родительское, но и хотя бы одно дочернее свойство:

https://i.imgur.com/bpGNIFk.png

• grid-template-areas: родительское свойство, создающее схему
• grid-area: дочернее свойство, которое использует схему

Создаём схему

Код:
.container {
  display: grid;
  gap: 20px;
  height: 100vh;

  /* ! */
  grid-template-areas:
    "A A A A   A A A A   A A A A"
    "B B B B   B B B B   B B C C"
    "B B B B   B B B B   B B C C";
}

Применяем схему

Код:
.box-1 {
  grid-area: A;
}
.box-2 {
  grid-area: B;
}
.box-3 {
  grid-area: C;
}

Обратите внимание: мы вернемся к свойству grid-area, когда будем говорить о дочерних свойствах.

column-gap
Данное свойство используется для добавления отступа между колонками.

https://i.imgur.com/NYFxMth.png

style.css:

Код:
.container {
  display: grid;
  height: 100vh;
  grid-template-columns: 100px 100px 100px;

  /* ! */
  column-gap:  50px;
}

Обратите внимание: свойство column-gap используется совместно со свойством grid-template-columns.

row-gap
Данное свойство используется для добавления отступов между строками.

https://i.imgur.com/A0MUTqd.png

style.css:

Код:
.container {
  display: grid;
  height: 100vh;
  grid-template-rows: 100px 100px 100px;

  /* ! */
  row-gap:  50px;
}

Обратите внимание: свойство row-gap используется совместно со свойством grid-template-rows.

justify-items
Данное свойство используется для позиционирования грид-элементов внутри грид-контейнера вдоль главной оси. Оно принимает 4 возможных значения

https://i.imgur.com/ckJseLE.png
https://i.imgur.com/ptVhpRt.png

Добавим еще один контейнер в HTML:

Код:
<div class="container">

  <!-- Здесь находятся контейнеры A, B, C -->

  <div class="box-4"> D </div>
</div>

И немного изменим CSS:

Код:
.container {
  display: grid;
  gap: 50px;
  height: 100vh;

  /* Каждый контейнер имеет размер 200px на 200px */
  grid-template-rows: 200px 200px;
  grid-template-columns: 200px 200px;

  /* ! */
  justify-items : end;
}

align-items
Данное свойство используется для позиционирования грид-элементов внутри грид-контейера вдоль поперечной оси. Оно принимает 4 возможных значения:

https://i.imgur.com/V5116qb.png

style.css:

Код:
.container {
  display: grid;
  gap: 50px;
  height: 100vh;
  grid-template-rows: 200px 200px;
  grid-template-columns: 200px 200px;

  /* ! */
  align-items: center;
}

justify-content
Данное свойство используется для позиционирования самого грида внутри грид-контейнера вдоль основной оси. Оно принимает 7 возможных значений:

https://i.imgur.com/zieRywt.png
https://i.imgur.com/tOd84ta.png

style.css:

Код:
.container {
  display: grid;
  gap: 50px;
  height: 100vh;
  grid-template-rows: 200px 200px;
  grid-template-columns: 200px 200px;

  /* ! */
  justify-content: center;
}

align-content

Данное свойство используется для позиционирования самого грида внутри грид-контейнера вдоль поперечной оси. Оно принимает 7 возможных значений:

https://i.imgur.com/K2CMPZp.png
https://i.imgur.com/PdceoHo.png

style.css:

Код:
.container {
  display: grid;
  gap: 50px;
  height: 100vh;
  grid-template-rows: 200px 200px;
  grid-template-columns: 200px 200px;

  /* ! */
  align-content : center;
}

[think=http://www.kolobok.us/smiles/standart/help.gif]Свойства грид элементов[/think]

https://i.imgur.com/yJgbBn8.png

Шкала CSS Grid

https://i.imgur.com/NhCGhf9.png

Данная шкала показывает, как вычисляются строки и колонки при их объединении. Для этого используется два вида единиц:
• целые числа (1, 2, 3 и т.д.)
• ключевое слово span

На представленной ниже иллюстрации показаны начальные и конечные точки строк и колонок в одной ячейке:

https://i.imgur.com/HWSpMTL.png

index.html:

Код:
<div class="container">
  <div class="box-1"> A </div>
  <div class="box-2"> B </div>
  <div class="box-3"> C </div>
  <div class="box-4"> D </div>
</div>

При использовании функции repeat() мы может установить одинаковую ширину/высоту для колонок/строк. Пример с колонками:
• grid-template-columns : repeat(4, 1fr);

Это аналогично следующему:
• grid-template-columns : 1fr 1fr 1fr 1fr;
[mod]Небольшая заметка:
При использовании единицы измерения fr, доступное пространство делится на равные части.

grid-template-columns : repeat(4, 1fr);

В данном случае доступное пространство делится на 4 равные части.
Продолжаем веселиться![/mod]
grid-columns: start/end
Данное свойство позволяет объединять колонки. Оно является сокращением для:
• grid-column-start
• grid-column-end

style.css:

Код:
.container {
  display: grid;
  gap: 20px;
  height: 100vh;

  grid-template-columns: repeat(12, 1fr);
  grid-template-rows: repeat(12, 1fr);
}

Результат:

https://i.imgur.com/34UiX0I.png

Мы разделили доступное пространство на 12 равных частей как по ширине, так и по высоте. 1 контейнер занимает 1 часть или фракцию. В данном случае 8 фракций остались невостребованными.

Поскольку мы говорим о свойствах дочерних элементов, имеет смысл разделить их стили:
.box-1 {}
.box-2 {}
.box-3 {}
.box-4 {}

Вернемся к шкале. Мы разбираемся с колонками — поэтому пока не обращайте внимания на строки.

https://i.imgur.com/HYHxEgp.png

Каждый класс .box-* по умолчанию имеет такой масштаб (scale):
grid-column-start: 1;
grid-column-end: 2;

/* Сокращение */
grid-column: 1 / 2

Это можно переписать с помощью ключевого слова span:
grid-column : span 1;

Давайте "присвоим" 8 фракций .box-1:
.box-1 {
  grid-column: 1 / 10
}

Результат:

https://i.imgur.com/JaTYboN.png

[mod]Небольшая заметка:
Как мы производим вычисления? box-1 занимает 1 часть. Кроме этого, к ней добавляется еще 8 частей. И еще 1 в конце. Получается: 8 + 1 + 1 = 10.[/mod]

Как использовать ключевое слово span
Считается, что использование span делает код более читаемым.

В этом случае нам просто нужно добавить к box-1 8 частей:

Код:
.box-1 {
  grid-column: span 9;
}

Это даст такой же результат.

grid-row: start/end

Данное свойство позволяет объединять строки. Оно является сокращением для:
• grid-row-start
• grid-row-end

Теперь сосредоточимся на строках:

https://i.imgur.com/ezSAd7u.png

Давайте добавим к box-1 9 частей:

.box-1 {
  grid-row : 1 / 11;
}

Расчет выглядит так: box-1 занимает 1 часть + 9 частей + 1 часть в конце, получается 9 + 1 + 1 = 11.

Вот вариант со span:
.box-1 {
  grid-row: span 10;
}

Результат:

https://i.imgur.com/BSqpza1.png

grid-area
Сначала нам нужно настроить grid-temlate-areas, о чем мы говорили выше. После этого в дочерних классах определяются названия областей, которые используются в родительском классе:

https://i.imgur.com/2HSE4tL.png

Определяем grid-template-areas в родительском классе

style.css:

Код:
.container {
  display: grid;
  gap: 20px;
  height: 100vh;

  grid-template-areas:
    "A A A A   A A A A   A A A A"
    "B B B B   B B B B   B B C C"
    "B B B B   B B B B   B B C C";
}

Затем определяем grid-area в дочерних классах:

style.css:

Код:
.box-1 {
  grid-area: A;
}
.box-2 {
  grid-area: B;
}
.box-3 {
  grid-area: C;
}

justify-self
Данное свойство используется для позиционирования отдельного грид-элемента вдоль основной оси. Оно принимает 4 возможных значения:

https://i.imgur.com/N7h1UPu.png

style.css:

Код:
.container {
  display: grid;
  gap :25px;
  height: 100vh;
  grid-template-rows: 1fr 1fr;
  grid-template-columns: 1fr 1fr;
}

.box-1 {
  /* ! */
  justify-self : start;
}

align-self
Данное свойство используется для позиционирования отдельного грид-элемента вдоль поперечной оси. Оно принимает 4 возможных значения:

https://i.imgur.com/PJUcgaU.png

style.css:

Код:
.container {
  display: grid;
  gap :25px;
  height: 100vh;
  grid-template-rows: 1fr 1fr;
  grid-template-columns: 1fr 1fr;
}
.box-1 {
  /* ! */
  align-self : start;
}

[think=http://www.kolobok.us/smiles/standart/help.gif]Сокращения для свойств CSS Grid[/think]

• place-content
• place-items
• place-self
• grid-template
• gap / grid-gap

place-content

https://i.imgur.com/iSBvwAw.png

Данное свойство является сокращением для:
• align-content
• justify-content

Пример:

Код:
align-content: center;
justify-content: end;

/* ! */
place-content: center / end;

place-items

https://i.imgur.com/E1U7IWr.png

Данное свойство является сокращением для:
• align-items
• justify-items

Пример:

Код:
align-items: end;
justify-items: center;

/* ! */
place-items: end / center;

place-self

https://i.imgur.com/xd2KkKO.png

Данное свойство является сокращением для:
• align-self
• justify-self

Пример:

Код:
align-self: start;
justify-self: end;

/* ! */
place-self: start / end;

gap/grid-gap

https://i.imgur.com/9o7W36d.png

Данное свойство является сокращением для:
• row-gap
• columns-gap

Пример:

Код:
row-gap: 20px ;
column-gap: 30px ;

/* ! */
gap: 20px  30px;

[think=http://www.kolobok.us/smiles/standart/yahoo.gif]Заключение![/think]
Теперь в ваших руках имеется мощное средство для создания адаптивных макетов веб-страниц.

Подпись автора

[marquee=left]«МФ»   smalimg Мы такие разные и всё-таки мы вместе smalimg По любым вопросам касающимся форума, обращайтесь ко мне в л/с. [/marquee]