Ответ - да.Удалить grid-template-areas
и связанные с ним grid-area
правила.
.main {
display: grid;
grid-template-columns: 1fr 1fr;
width: 500px;
}
.container {
display: grid;
grid-template-columns: 1fr;
/* grid-template-areas: 'a' 'b' 'c' 'd'; */
width: 200px;
grid-gap: 10px;
}
.a, .b, .c, .d {
border: 1px solid black;
width: 200px;
}
/*
.a { grid-area: a; }
.b { grid-area: b; }
.c { grid-area: c; }
.d { grid-area: d; }
*/
<div class="main">
<div class="container">
<div class="a">A box</div>
<div class="b">B box</div>
<div class="d">D box</div>
</div>
<div class="container">
<div class="a">A box</div>
<div class="b">B box</div>
<div class="c">C box</div>
<div class="d">D box</div>
</div>
</div>
Когда вы создаете сетку, используя grid-template-areas
, помните следующее:
grid-template-areas
создает явная сетка . - Строка создается для каждого строкового значения.Поскольку у вас есть четыре строки (
"a"
, "b"
, "c"
, "d"
), создается четыре явных строки.Эти строки существуют с элементами сетки или без них. - Объяснение: Поскольку контейнер создает явную сетку, он не учитывает существование элементов сетки.Контейнер создает строки и столбцы.Когда эти строки и столбцы пересекаются, они создают ячейки.Ячейки могут быть заняты или незаняты.
- Подумайте об этом следующим образом: Соотношение между рядами сетки и элементами аналогично трекам и поездам.Следы существуют с или без поездов.Фактически, на языке Grid столбцы и строки известны как "дорожки" .Треки - это просто инфраструктура.
Поэтому лучше всего переключаться с явных строк, которые определены с использованием grid-template-areas
и / или grid-template-rows
, на неявных строк, которыеразрешите алгоритму сетки создавать дорожки строк по мере необходимости для размещения элементов.
Если вы удалите grid-template-areas
и grid-area
из своего набора правил, сетка автоматически расположит элементы сетки в одном столбце (так как выопределили), и у него нет оснований пропускать строки / оставлять пробелы.Вот снова код сверху:
.main {
display: grid;
grid-template-columns: 1fr 1fr;
width: 500px;
}
.container {
display: grid;
grid-template-columns: 1fr;
/* grid-template-areas: 'a' 'b' 'c' 'd'; */
width: 200px;
grid-gap: 10px;
}
.a, .b, .c, .d {
border: 1px solid black;
width: 200px;
}
/*
.a { grid-area: a; }
.b { grid-area: b; }
.c { grid-area: c; }
.d { grid-area: d; }
*/
<div class="main">
<div class="container">
<div class="a">A box</div>
<div class="b">B box</div>
<div class="d">D box</div>
</div>
<div class="container">
<div class="a">A box</div>
<div class="b">B box</div>
<div class="c">C box</div>
<div class="d">D box</div>
</div>
</div>
Если вы не хотите, чтобы элементы сетки занимали все свободное пространство, используйте align-content: start
, который переопределяет значение по умолчанию align-content: stretch
:
.main {
display: grid;
grid-template-columns: 1fr 1fr;
width: 500px;
}
.container {
display: grid;
grid-template-columns: 1fr;
/* grid-template-areas: 'a' 'b' 'c' 'd'; */
align-content: start; /* new */
width: 200px;
grid-gap: 10px;
}
.a, .b, .c, .d {
border: 1px solid black;
width: 200px;
}
/*
.a { grid-area: a; }
.b { grid-area: b; }
.c { grid-area: c; }
.d { grid-area: d; }
*/
<div class="main">
<div class="container">
<div class="a">A box</div>
<div class="b">B box</div>
<div class="d">D box</div>
</div>
<div class="container">
<div class="a">A box</div>
<div class="b">B box</div>
<div class="c">C box</div>
<div class="d">D box</div>
</div>
</div>
Наконец, если вы хотите, чтобы каждая неявная строка имела определенную высоту, используйте grid-auto-rows
:
.main {
display: grid;
grid-template-columns: 1fr 1fr;
width: 500px;
}
.container {
display: grid;
grid-template-columns: 1fr;
/* grid-template-areas: 'a' 'b' 'c' 'd'; */
align-content: start; /* new */
grid-auto-rows: 40px; /* new */
width: 200px;
grid-gap: 10px;
}
.a, .b, .c, .d {
border: 1px solid black;
width: 200px;
}
/*
.a { grid-area: a; }
.b { grid-area: b; }
.c { grid-area: c; }
.d { grid-area: d; }
*/
<div class="main">
<div class="container">
<div class="a">A box</div>
<div class="b">B box</div>
<div class="d">D box</div>
</div>
<div class="container">
<div class="a">A box</div>
<div class="b">B box</div>
<div class="c">C box</div>
<div class="d">D box</div>
</div>
</div>