🔲 Полное руководство по CSS Grid

⏱️ 20 мин чтения 📊 Средний 👁️ 30 просмотров 📑 10 разделов

CSS Grid Layout — это двумерная система раскладки, которая революционизировала создание сложных макетов в CSS.

Что такое CSS Grid?

CSS Grid Layout — это двумерная система раскладки, которая позволяет создавать сложные макеты с контролем над колонками и строками одновременно.

Основные концепции

  • Grid-контейнер — родительский элемент с display: grid
  • Grid-элементы — дочерние элементы контейнера
  • Grid-линии — линии, разделяющие строки и колонки
  • Grid-треки — строки или колонки между двумя линиями
  • Grid-ячейки — наименьшая единица сетки
  • Grid-области — прямоугольные области, охватывающие несколько ячеек
👁️ Базовая структура Grid
1
2
3
4
5
6
Базовая структура Grid CSS
/* Grid-контейнер */
.container {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  grid-template-rows: 100px 100px;
  gap: 10px;
}

/* Grid-элементы */
.item {
  background: #667eea;
  color: white;
  padding: 20px;
}

display: grid

Чтобы начать использовать Grid, нужно применить display: grid или display: inline-grid к родительскому элементу.

Пример

Простая сетка 3×3:

.container {
  display: grid;
  grid-template-columns: 200px 200px 200px;
  grid-template-rows: 100px 100px 100px;
  gap: 10px;
}
👁️ display: grid vs display: inline-grid
display: grid (блочный):
1
2
display: inline-grid (строчный):
1
2
display: grid vs display: inline-grid CSS
/* Блочный grid-контейнер */
.grid-container {
  display: grid;
}

/* Строчный grid-контейнер */
.inline-grid-container {
  display: inline-grid;
}

grid-template-columns и grid-template-rows

Эти свойства определяют размеры колонок и строк сетки.

Единицы измерения

  • px — фиксированный размер
  • % — процент от контейнера
  • em/rem — относительно размера шрифта
  • fr — доля свободного пространства (fraction)
  • auto — автоматический размер
  • minmax(min, max) — диапазон размеров

Примеры

/* Три равные колонки */
grid-template-columns: 1fr 1fr 1fr;

/* Сокращённая запись */
grid-template-columns: repeat(3, 1fr);

/* Фиксированная + гибкие */
grid-template-columns: 200px 1fr 1fr;

/* С использованием minmax */
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
🎮

Интерактивное демо: grid-template-columns

LIVE
👁️ Предпросмотр:
1
2
3
4
5
6
📋 Сгенерированный CSS:
display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 10px;
👁️ Три равные колонки
1fr
1fr
1fr
Три равные колонки CSS
.container {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
}
👁️ Фиксированная + гибкие колонки
200px
1fr
1fr
Фиксированная + гибкие колонки CSS
.container {
  display: grid;
  grid-template-columns: 200px 1fr 1fr;
}
👁️ Использование minmax()
1
2
3
4
Использование minmax() CSS
.container {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
}

Функция repeat()

Функция repeat() позволяет сократить запись повторяющихся треков.

Синтаксис

repeat(количество, размер)

Примеры

/* 3 колонки по 1fr */
grid-template-columns: repeat(3, 1fr);

/* Альтернативный паттерн */
grid-template-columns: repeat(2, 100px 1fr);

/* auto-fit — автоматическое заполнение */
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));

/* auto-fill — заполняет пустое пространство */
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));

auto-fit vs auto-fill

  • auto-fit — сжимает пустые треки до 0
  • auto-fill — сохраняет пустые треки
👁️ repeat(3, 1fr)
1
2
3
repeat(3, 1fr) CSS
.container {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
}
👁️ repeat(auto-fit, minmax(200px, 1fr))
1
2
3
4
5
repeat(auto-fit, minmax(200px, 1fr)) CSS
.container {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}

gap (grid-gap)

Свойство gap устанавливает отступы между строками и колонками.

Синтаксис

gap: <row-gap> <column-gap>;
gap: 20px;              /* одинаковые отступы */
gap: 20px 10px;         /* row-gap column-gap */
row-gap: 20px;          /* только между строками */
column-gap: 10px;       /* только между колонками */
🎮

Интерактивное демо: gap

LIVE
10px
👁️ Предпросмотр:
1
2
3
4
5
6
📋 Сгенерированный CSS:
display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 10px;
👁️ gap: 20px
1
2
3
gap: 20px CSS
.container {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  gap: 20px;
}
👁️ gap: 30px 10px (row column)
1
2
3
4
5
6
gap: 30px 10px (row column) CSS
.container {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  gap: 30px 10px;
}

grid-column и grid-row

Эти свойства управляют размещением элементов в сетке.

Синтаксис

grid-column: <start-line> / <end-line>;
grid-row: <start-line> / <end-line>;

/* Или сокращённо */
grid-area: <row-start> / <column-start> / <row-end> / <column-end>;

Примеры

/* Элемент занимает колонки 1-3 */
.item {
  grid-column: 1 / 4;
}

/* Элемент занимает 2 колонки */
.item {
  grid-column: span 2;
}

/* Полная запись */
.item {
  grid-area: 1 / 1 / 3 / 4;
}
🎮

Интерактивное демо: grid-column / grid-row

LIVE
👁️ Предпросмотр:
1
2
3
4
5
6
📋 Сгенерированный CSS:
.item-1 { grid-area: auto / auto / auto / auto; }
👁️ grid-column: span 2
span 2
2
3
4
grid-column: span 2 CSS
.item {
  grid-column: span 2;
}
👁️ grid-area: 1 / 1 / 3 / 3
2×2
2
3
4
grid-area: 1 / 1 / 3 / 3 CSS
.item {
  grid-area: 1 / 1 / 3 / 3;
}

grid-template-areas

Свойство grid-template-areas позволяет создавать макеты с помощью именованных областей.

Синтаксис

.container {
  display: grid;
  grid-template-areas:
    "header header header"
    "sidebar main main"
    "footer footer footer";
  grid-template-columns: 200px 1fr 1fr;
  grid-template-rows: 100px 1fr 50px;
}

.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main { grid-area: main; }
.footer { grid-area: footer; }

Пустые ячейки

Используйте точку . для пустых ячеек:

grid-template-areas:
  "header header header"
  ". main .";
👁️ Макет страницы с именованными областями
Header
Sidebar
Main Content
Footer
Макет страницы с именованными областями CSS
.container {
  display: grid;
  grid-template-areas:
    "header header header"
    "sidebar main main"
    "footer footer footer";
  grid-template-columns: 200px 1fr 1fr;
  grid-template-rows: 80px 1fr 60px;
  gap: 10px;
}

.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main { grid-area: main; }
.footer { grid-area: footer; }

justify-items и align-items

Эти свойства выравнивают содержимое внутри ячеек сетки.

justify-items (горизонтальное выравнивание)

  • start — по левому краю
  • end — по правому краю
  • center — по центру
  • stretch — растянуть (по умолчанию)

align-items (вертикальное выравнивание)

  • start — по верху
  • end — по низу
  • center — по центру
  • stretch — растянуть (по умолчанию)

Сокращённая запись

place-items: center;  /* align-items + justify-items */
👁️ place-items: center
Центр
place-items: center CSS
.container {
  display: grid;
  place-items: center;
  min-height: 200px;
}

justify-content и align-content

Эти свойства выравнивают всю сетку внутри контейнера, если есть свободное пространство.

justify-content (горизонтальное выравнивание сетки)

  • start — по левому краю
  • end — по правому краю
  • center — по центру
  • stretch — растянуть треки
  • space-around — равные промежутки
  • space-between — промежутки между
  • space-evenly — абсолютно равные промежутки

align-content (вертикальное выравнивание сетки)

Аналогичные значения для вертикали.

Сокращённая запись

place-content: center;  /* align-content + justify-content */
👁️ place-content: center
1
2
3
place-content: center CSS
.container {
  display: grid;
  grid-template-columns: 100px 100px 100px;
  place-content: center;
  min-height: 200px;
}

Практические примеры

Рассмотрим несколько практических примеров использования CSS Grid.

Адаптивная сетка карточек

.cards {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  gap: 1.5rem;
}

Макет страницы

.page {
  display: grid;
  grid-template-areas:
    "header header"
    "sidebar main"
    "footer footer";
  grid-template-columns: 250px 1fr;
  grid-template-rows: auto 1fr auto;
  min-height: 100vh;
}

Центрирование элемента

.container {
  display: grid;
  place-items: center;
  min-height: 100vh;
}
👁️ Адаптивная сетка карточек
Карточка 1
Карточка 2
Карточка 3
Карточка 4
Адаптивная сетка карточек CSS
.cards {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  gap: 1.5rem;
}
👁️ Центрирование элемента
Центрированный элемент
Центрирование элемента CSS
.container {
  display: grid;
  place-items: center;
  min-height: 200px;
}
👁️ Сложный макет с наложением
Featured (2×2)
3
6
Сложный макет с наложением CSS
.container {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  grid-template-rows: 100px 100px;
  gap: 10px;
}

.featured {
  grid-column: 1 / 3;
  grid-row: 1 / 3;
}