В этом макете происходит много .
Но, по сути, основная проблема заключается в отсутствии дополнительной высоты в контейнере.
Вот что происходит :
Явные и неявные строки
Вот что у вас есть:
.container {
display: grid;
grid-template-columns: repeat(5, 1fr);
grid-gap: 10px;
background: black;
}
.item {
display: grid;
border-radius: 2px;
border: 1px solid red;
background-color: var(--yellow);
}
.item3 {
grid-column: 1 / -1;
grid-row: span 3;
}
Правило .item
не оказывает влияния на проблему, поэтому давайте просто оставьте границы для иллюстрации.
.container {
display: grid;
grid-template-columns: repeat(5, 1fr);
grid-gap: 10px;
background: black;
}
.item3 {
grid-column: 1 / -1;
grid-row: span 3;
}
.item {
border: 1px solid red;
}
Поскольку вы не определили grid-template-rows
или grid-template-areas
, явных строк нет. Все строки неявные (создаются по необходимости).
Размер неявных строк регулируется grid-auto-rows
, значение по умолчанию которого auto
(размер содержимого).
Таким образом, высота каждой строки в настоящее время определяется размером текста - цифрами - в вашем HTML.
Числа невидимы, поскольку фон и текст черные. Чтобы лучше понять источник высоты строки, изменим цвет текста на белый.
.container {
display: grid;
grid-template-columns: repeat(5, 1fr);
grid-gap: 10px;
background: black;
color: white; /* new */
}
Вот полный код:
.container {
display: grid;
grid-template-columns: repeat(5, 1fr);
grid-gap: 10px;
background: black;
color: white;
}
.item3 {
grid-column: 1 / -1;
grid-row: span 3;
}
.item {
border: 1px solid red;
}
<div class="container">
<div class="item item3">3</div>
<div class="item item4">4</div>
<div class="item item5">5</div>
<div class="item item6">6</div>
<div class="item item7">7</div>
<div class="item item8">8</div>
<div class="item item9">9</div>
<div class="item item10">10</div>
</div>
Как указано выше, высота неявных строк по умолчанию равна auto
. Это означает, что если grid-auto-rows
не указано и в элементах сетки нет содержимого, строки будут свернуты:
.container {
display: grid;
grid-template-columns: repeat(5, 1fr);
grid-gap: 10px;
background: black;
color: white;
}
.item3 {
grid-column: 1 / -1;
grid-row: span 3;
}
.item {
border: 1px solid red;
}
<div class="container">
<div class="item item3"></div>
<div class="item item4"></div>
<div class="item item5"></div>
<div class="item item6"></div>
<div class="item item7"></div>
<div class="item item8"></div>
<div class="item item9"></div>
<div class="item item10"></div>
</div>
Оставшаяся высота в контейнере определяется толщиной границы и зазорами сетки 10px. Удалите их для полного коллапса (сетка исчезает).
.container {
display: grid;
grid-template-columns: repeat(5, 1fr);
/* grid-gap: 10px; */
background: black;
color: white;
}
.item3 {
grid-column: 1 / -1;
grid-row: span 3;
}
.item {
/* border: 1px solid red; */
}
<div class="container">
<div class="item item3"></div>
<div class="item item4"></div>
<div class="item item5"></div>
<div class="item item6"></div>
<div class="item item7"></div>
<div class="item item8"></div>
<div class="item item9"></div>
<div class="item item10"></div>
</div>
Проблема пункта 3
.item3 {
grid-column: 1 / -1;
grid-row: span 3;
}
Когда вы даете команду item3
охватить три строки, это не охватывают три существующих ряда, потому что эти дорожки уже заняты. Однако если вы удалите команду grid-column
, то span 3
будет работать.
.container {
display: grid;
grid-template-columns: repeat(5, 1fr);
grid-gap: 10px;
background: black;
color: white;
}
.item3 {
/* grid-column: 1 / -1; */
grid-row: span 3;
}
.item {
border: 1px solid red;
}
<div class="container">
<div class="item item3">3</div>
<div class="item item4">4</div>
<div class="item item5">5</div>
<div class="item item6">6</div>
<div class="item item7">7</div>
<div class="item item8">8</div>
<div class="item item9">9</div>
<div class="item item10">10</div>
</div>
Давайте go вернемся к моей первой строке на минуту: "Когда вы командуете item3
, чтобы охватить три строки, это не так" пересекают две другие строки, потому что эти дорожки уже заняты. "
Это правда. Но также верно, что две новые строки созданы . Сетка просто подразделяет первый ряд на три.
Вот как это выглядит с помощью Firefox Инспектора сетки :
Обратите внимание, как первая строка была разделена на три, и теперь сетка имеет в общей сложности пять строк (потому что span 3
= существующая строка + 2).
Давайте сделаем это grid-row: span 10
для лучшего взгляда:
Высота подразделенного первого ряда целиком исходит от grid-gap
, который добавляет 10px между каждым новый ряд
Кстати, вот объяснение этой части вашего вопроса:
Если я увеличу значение диапазона строки до 4, это сработает , Однако охват составляет всего 2 строки вместо 4.
На самом деле вы просто видите эффект наложения разрыва строк в 10 пикселей.
Если если вы удалите разрыв сетки, span
все равно будет генерировать разделенные строки, но эти новые строки не изменят высоту первой строки.
Вот тот же макет с span 10
снова и без grid-gap
:
Решения
Вот три способа решения проблемы.
1. Дайте контейнеру некоторую высоту.
Если вы предоставите контейнеру дополнительную высоту - то есть большую высоту, чем необходимо для содержимого - у grid-row: span 3
будет достаточно места для работы.
.container {
display: grid;
grid-template-columns: repeat(5, 1fr);
grid-gap: 10px;
background: black;
color: white;
height: 250px; /* new */
}
.item3 {
grid-column: 1 / -1;
grid-row: span 3;
}
.item {
border: 1px solid red;
}
<div class="container">
<div class="item item3">3</div>
<div class="item item4">4</div>
<div class="item item5">5</div>
<div class="item item6">6</div>
<div class="item item7">7</div>
<div class="item item8">8</div>
<div class="item item9">9</div>
<div class="item item10">10</div>
</div>
2. Определите grid-auto-rows
.
Если вы установите высоту grid-auto-rows
, которая контролирует высоту неявных строк, то grid-row: span 3
также будет работать.
.container {
display: grid;
grid-template-columns: repeat(5, 1fr);
grid-auto-rows: 50px; /* new */
grid-gap: 10px;
background: black;
color: white;
}
.item3 {
grid-column: 1 / -1;
grid-row: span 3;
}
.item {
border: 1px solid red;
}
<div class="container">
<div class="item item3">3</div>
<div class="item item4">4</div>
<div class="item item5">5</div>
<div class="item item6">6</div>
<div class="item item7">7</div>
<div class="item item8">8</div>
<div class="item item9">9</div>
<div class="item item10">10</div>
</div>
3. Определите grid-template-rows
.
Если вы знаете, сколько строк вы хотите в контейнере, установите число и высоту равными grid-template-rows
, которые управляют высотой явных строк.
.container {
display: grid;
grid-template-columns: repeat(5, 1fr);
grid-template-rows: repeat(5, 50px); /* new */
grid-gap: 10px;
background: black;
color: white;
}
.item3 {
grid-column: 1 / -1;
grid-row: span 3;
}
.item {
border: 1px solid red;
}
<div class="container">
<div class="item item3">3</div>
<div class="item item4">4</div>
<div class="item item5">5</div>
<div class="item item6">6</div>
<div class="item item7">7</div>
<div class="item item8">8</div>
<div class="item item9">9</div>
<div class="item item10">10</div>
</div>