Grid-контейнер и grid-элементы
Grid-контейнер — элемент с
display: grid, его прямые потомки становятся grid-элементами, участвующими в двумерной раскладке.
Зачем нужно
Как и в Flexbox, в Grid важно разделять свойства контейнера и элементов. Контейнер задаёт структуру сетки (grid-template-columns, gap, align-items), элементы управляют своим положением (grid-column, grid-row, align-self). Знание всех свойств обоих уровней — основа работы с Grid.
Где используется
- Любой Grid-layout: галерея, дашборд, макет страницы
- Управление колонками и строками
- Позиционирование конкретных элементов
Основной контент
Свойства Grid-контейнера
.container {
display: grid; /* или inline-grid */
/* Определение колонок */
grid-template-columns: 1fr 2fr 1fr;
grid-template-columns: 200px 1fr;
grid-template-columns: repeat(3, 1fr);
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
/* Определение строк */
grid-template-rows: auto 1fr auto;
grid-template-rows: 64px 1fr 48px;
/* Именованные области */
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
/* Шортхенд */
grid-template: auto 1fr / 200px 1fr;
/* Отступы */
gap: 16px;
gap: 16px 24px; /* row-gap column-gap */
row-gap: 16px;
column-gap: 24px;
/* Выравнивание всех элементов */
justify-items: start; /* start | end | center | stretch */
align-items: stretch; /* start | end | center | stretch | baseline */
place-items: center; /* align-items + justify-items */
/* Выравнивание сетки в контейнере */
justify-content: start; /* start | end | center | stretch | space-between... */
align-content: start;
place-content: center;
/* Автоматические строки */
grid-auto-rows: 200px;
grid-auto-rows: minmax(100px, auto);
/* Направление авто-заполнения */
grid-auto-flow: row; /* row | column | dense */
}
Свойства Grid-элементов
.item {
/* Явное позиционирование по линиям */
grid-column-start: 1;
grid-column-end: 3;
grid-column: 1 / 3; /* шортхенд */
grid-column: 1 / span 2; /* начало + размах */
grid-column: span 2; /* только размах */
grid-row-start: 2;
grid-row-end: 4;
grid-row: 2 / 4;
/* Шортхенд row-start / col-start / row-end / col-end */
grid-area: 2 / 1 / 4 / 3;
/* Именованная область */
grid-area: header;
/* Переопределение выравнивания */
justify-self: center;
align-self: end;
place-self: center end;
/* Слой (z-index работает в grid) */
z-index: 2;
}
Пример сетки
.grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-auto-rows: 100px;
gap: 8px;
}
.item-a {
grid-column: 1 / 3; /* занимает 2 колонки */
grid-row: 1 / 3; /* занимает 2 строки */
}
.item-b { grid-column: 3; } /* автоматически в 1-ю строку */
.item-c { grid-column: 4; }
grid-auto-flow: dense
/* Автоматически заполняет дыры в сетке */
.packed-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-auto-flow: dense; /* Плотная упаковка */
}
Частые ошибки
grid-column: 2= вторая линия, не вторая ячейка — нумерация начинается с 1; линия 2 — это граница между 1-й и 2-й колонкамиgrid-template-areasтребует каждую ячейку — все ячейки в строке должны быть заполнены именем или точкой (.)align-itemsvsalign-content—align-itemsвыравнивает элементы в ячейках,align-content— строки сетки в контейнере