display grid и inline-grid
display: gridсоздаёт блочный Grid-контейнер (занимает всю ширину), аdisplay: inline-grid— строчный Grid-контейнер (ширина по содержимому); оба активируют двумерную сетку для прямых потомков.
Зачем нужно
Как и в случае с flex/inline-flex, выбор определяет поведение во внешнем потоке. grid — для страничных лейаутов, секций, карточных сеток, где контейнер должен занять всю строку. inline-grid — редкий сценарий для небольших сеточных компонентов в тексте или в потоке других элементов.
Где используется
grid— страничная раскладка, карточные сетки, дашбордыinline-grid— таблица данных в строке, пиктограммы в тексте (редко)
display: grid — блочный контейнер
.page {
display: grid;
grid-template-columns: 240px 1fr;
grid-template-rows: 64px 1fr 48px;
min-height: 100vh;
grid-template-areas:
"header header"
"sidebar content"
"footer footer";
}
<div class="page">
<header style="grid-area: header">Шапка</header>
<aside style="grid-area: sidebar">Меню</aside>
<main style="grid-area: content">Контент</main>
<footer style="grid-area: footer">Подвал</footer>
</div>
Карточная сетка
.cards {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 24px;
}
display: inline-grid — строчный контейнер
.matrix {
display: inline-grid;
grid-template-columns: repeat(3, 32px);
gap: 4px;
}
.matrix__cell {
width: 32px;
height: 32px;
display: flex;
align-items: center;
justify-content: center;
border: 1px solid #e2e8f0;
}
<p>
Матрица
<span class="matrix">
<span class="matrix__cell">1</span>
<span class="matrix__cell">2</span>
<span class="matrix__cell">3</span>
<span class="matrix__cell">4</span>
<span class="matrix__cell">5</span>
<span class="matrix__cell">6</span>
<span class="matrix__cell">7</span>
<span class="matrix__cell">8</span>
<span class="matrix__cell">9</span>
</span>
в тексте.
</p>
Что происходит при display: grid
- Контейнер становится Grid-контейнером
- Прямые потомки становятся Grid-элементами
- По умолчанию: одна колонка, строки создаются автоматически
- Без
grid-template-columns— вся ширина = одна колонка
/* Без настройки — одна колонка */
.container {
display: grid;
gap: 16px;
/* элементы стекают вертикально */
}
/* С настройкой */
.container {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 16px;
}
Частые ошибки
- Grid-свойства на не-Grid элементе —
grid-column,grid-rowработают только на прямых потомках Grid-контейнера display: gridбезgrid-template-columns— все элементы складываются в одну колонку; нужно явно задать колонкиinline-gridдля больших сеток — строчный контейнер занимает ширину по содержимому, что редко нужно для полноценных лейаутов
Связанные темы
- display -- block, inline, inline-block, none
- display flex и inline-flex
- grid-template-areas -- именованные области
- auto-fill и auto-fit
- _MOC Grid