Возможное решение
Ниже не единственный правильный вариант, но он показывает рабочую идею урока без лишних зависимостей: одна разметка, раскладку меняет только CSS.
🖥️ десктоп (база): 3 колонки
nav
область
aside
📱 телефон (≤ 48rem): 1 колонка
nav
область
aside
📄 lesson-35/solution.html
<main class="admin-layout">
<nav>Меню</nav>
<section>Рабочая область</section>
<aside>Сводка</aside>
</main>
📄 lesson-35/solution.css
.admin-layout {
display: grid;
grid-template-columns: 16rem minmax(0, 1fr) 18rem;
gap: 1.5rem;
}
@media (max-width: 64rem) {
.admin-layout {
grid-template-columns: 14rem minmax(0, 1fr);
}
.admin-layout aside {
grid-column: 1 / -1;
}
}
@media (max-width: 47.99rem) {
.admin-layout {
display: block;
}
.admin-layout > * + * {
margin-top: 1rem;
}
}
Разбор логики
- База без
@mediaописывает десктоп: три колонки черезgrid-template-columns. Боковые задают ширину, центр (minmax(0, 1fr)) тянется и сжимается. - Первый
max-width: 64remубирает третью колонку и кладётasideна всю ширину (grid-column: 1 / -1) — это первый «откус» при сужении. - Второй
max-width: 47.99remотключает grid (display: block) и складывает блоки в стопку, добавляя вертикальные отступы между ними. - Breakpoints идут от большего к меньшему — каскад читается сверху вниз.
Самопроверка: если при изменении ширины появляется горизонтальный скролл, вернитесь к ограничениям контейнера и ширине дочерних элементов — скорее всего где-то осталась фиксированная пиксельная ширина.