Вы не определили ни одной строки в сетке:
.main-container {
display: grid;
grid-gap: 20px;
grid-template-columns: 40px 80px 40px;
justify-content: center;
}
Таким образом, все строки неявные , что означает, что они создаются автоматически для размещения элементов.
Функция определения размера для неявных строк - grid-auto-rows
, а ее значение по умолчанию - auto
.Это означает, что строки принимают размер содержимого.
Вы установили размер элементов своей сетки:
.side-menu {
height: 50px;
}
.main-content {
height: 300px;
}
То есть .main-content
, являющийся выше элементов сеткиустанавливает высоту строки:
Как видите, у вас есть контейнер сетки с одной строкой.
ТогдаВаш медиа-запрос включается для небольших экранов:
@media ( max-width: 400px ) {
.main-container {
grid-template-columns: 40px 80px;
}
}
Новое правило grid-template-columns
изменяет сетку от трех до двух столбцов.
Это заставляет сетку создавать вторую неявную строку дляразместите второй .side-menu
, столбец которого был удален.
Короче говоря, под первым рядом существует второй ряд.Первый ряд высотой 300 пикселей.Это приводит к большому вертикальному разрыву между первым и вторым меню.
Одно возможное решение
Используйте несколько меньших рядов и заставьте свои элементы проходить через них.
Код ниже выглядит следующим образом:
.main-container {
display: grid;
grid-template-columns: 40px 80px 40px;
grid-auto-rows: 10px; /* new */
grid-column-gap: 20px; /* adjusted */
}
.side-menu:first-child {
/* height: 50px; */
grid-column: 1;
grid-row: span 5;
}
.side-menu:last-child {
/* height: 50px; */
grid-column: 3;
grid-row: span 5;
}
.main-content {
/* height: 300px; */
grid-column: 2;
grid-row: span 30;
}
@media ( max-width: 400px ) {
.main-container {
grid-template-columns: 40px 80px;
}
.side-menu:last-child {
grid-column: 1;
grid-row: 7 / span 5;
}
}
.main-content { background-color: blue; }
.side-menu { background-color: red; }
<div class="main-container">
<div class="side-menu"></div>
<div class="main-content"></div>
<div class="side-menu"></div>
</div>