Загрузка...
Загрузка...
Сравнение Flexbox и CSS Grid: сильные стороны каждой технологии, типичные сценарии использования и рекомендации по выбору для разных задач вёрстки.
CSS & ДизайнПодробное руководство по CSS Flexbox: свойства контейнера и элементов, оси, выравнивание, практические примеры и типичные паттерны вёрстки.
CSS & ДизайнПрактическое руководство по созданию адаптивных макетов с CSS Grid: брейкпоинты, auto-fill, auto-fit, медиа-запросы и готовые паттерны.
CSS & ДизайнПолное руководство по центрированию элементов с помощью CSS Flexbox: по горизонтали, вертикали, по обеим осям, а также центрирование с учётом отступов.
Поделитесь с коллегами или изучите другие материалы блога
CSS Grid — модуль макетирования для создания двумерных сеток. В отличие от Flexbox, Grid позволяет управлять строками и столбцами одновременно, что упрощает сложные раскладки. В этой статье рассмотрены все основные свойства CSS Grid с практическими примерами.
Grid работает по принципу сетки: контейнер определяет треки (строки и столбцы), элементы размещаются в ячейках. Создание grid-контейнера:
.container {
display: grid;
}
Прямые потомки становятся grid-элементами. По умолчанию создаётся одна колонка, элементы выстраиваются в столбик.
Определяют размеры столбцов и строк:
.container {
display: grid;
grid-template-columns: 200px 1fr 200px;
grid-template-rows: auto 1fr auto;
}
Единицы: px, %, fr, em, rem, auto. fr — доля свободного пространства.
Повторение паттерна:
.container {
grid-template-columns: repeat(3, 1fr); /* три равных столбца */
grid-template-columns: repeat(4, 100px); /* четыре столбца по 100px */
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); /* адаптивная сетка */
}
Минимальный и максимальный размер трека:
.container {
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
}
Столбцы не меньше 250px, при наличии места растягиваются равномерно.
Расстояние между ячейками:
.container {
display: grid;
gap: 1rem;
/* или раздельно: */
column-gap: 1rem;
row-gap: 0.5rem;
}
Выравнивание содержимого внутри ячеек:
| Свойство | Ось | Значения |
|---|---|---|
justify-items | По строкам (горизонталь) | start, end, center, stretch |
align-items | По столбцам (вертикаль) | start, end, center, stretch |
.container {
justify-items: center;
align-items: center;
}
Краткая запись: align-items justify-items:
.container {
place-items: center;
}
Выравнивание всей сетки внутри контейнера, когда сетка меньше контейнера:
.container {
display: grid;
grid-template-columns: repeat(3, 100px);
justify-content: center;
align-content: center;
min-height: 100vh;
}
Размеры неявно создаваемых строк и столбцов:
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-auto-rows: 100px;
}
Направление авторазмещения элементов: row (по умолчанию), column, row dense, column dense:
.container {
grid-auto-flow: dense;
}
dense заполняет пустые ячейки более мелкими элементами.
Размещение элемента в ячейках:
.item {
grid-column: 1 / 3; /* с 1 по 3 линию */
grid-row: 2 / 4;
}
.item-span {
grid-column: span 2; /* на 2 столбца */
grid-row: span 1;
}
Краткая запись для grid-row-start / grid-column-start / grid-row-end / grid-column-end. Также используется с именованными областями.
Выравнивание отдельного элемента внутри ячейки:
.item {
justify-self: end;
align-self: center;
}
Удобный способ задать макет без явных номеров линий:
.layout {
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;
}
.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main { grid-area: main; }
.footer { grid-area: footer; }
Точка (.) обозначает пустую ячейку.
.cards {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 1.5rem;
}
.page {
display: grid;
grid-template-areas:
"nav nav"
"aside content"
"footer footer";
grid-template-columns: 200px 1fr;
grid-template-rows: 60px 1fr auto;
min-height: 100vh;
}
.gallery {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-auto-rows: 150px;
gap: 1rem;
}
.featured {
grid-column: span 2;
grid-row: span 2;
}
.equal-columns {
display: grid;
grid-template-columns: repeat(3, 1fr);
}
.grid {
display: grid;
gap: 1rem;
}
@media (min-width: 600px) {
.grid {
grid-template-columns: repeat(2, 1fr);
}
}
@media (min-width: 900px) {
.grid {
grid-template-columns: repeat(3, 1fr);
}
}
Для быстрого создания и настройки Grid используйте CSS Grid Generator на rechecker.ru. Для конвертации Grid-стилей в Tailwind — CSS в Tailwind.
Grid оптимален для двумерных раскладок. Flexbox — для одномерных (ряд или колонка). Подробнее — в Flexbox vs CSS Grid: когда что использовать.
Grid использует нумерацию линий: границы между ячейками. При 3 столбцах есть 4 вертикальные линии (1–4). Отрицательные индексы считаются с конца: -1 — последняя линия.
.item {
grid-column: 1 / -1; /* от первой до последней линии — вся строка */
}
Ограничивает размер трека по содержимому:
.container {
grid-template-columns: fit-content(300px) 1fr fit-content(300px);
}
Боковые колонки не шире 300px и подстраиваются под контент.
CSS Grid поддерживается во всех современных браузерах. В IE10–11 не поддерживается. Для fallback можно использовать @supports:
@supports (display: grid) {
.container {
display: grid;
grid-template-columns: 1fr 1fr;
}
}
@supports not (display: grid) {
.container {
display: flex;
flex-wrap: wrap;
}
.container > * {
flex: 1 1 50%;
}
}
Grid эффективен при типичном количестве ячеек (до сотен). При тысячах ячеек возможны задержки. Рекомендуется ограничивать размер сетки и использовать виртуализацию для длинных списков.
Практические примеры адаптивных макетов на Grid — в Адаптивные макеты на CSS Grid: практические примеры. Сравнение с Flexbox — в Flexbox vs CSS Grid: когда что использовать.