Holy Grail Layout
Классический макет «шапка — три колонки (nav + контент + aside) — футер» на CSS Grid за минимум кода.
Задача
Реализовать устойчивый трёхколоночный макет с фиксированными боковыми колонками и растягивающимся центральным контентом, при этом футер всегда прижат к низу страницы.
Решение
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8" />
<title>Holy Grail Layout</title>
<link rel="stylesheet" href="style.css" />
</head>
<body>
<div class="layout">
<header class="layout__header">Шапка</header>
<nav class="layout__nav">Навигация</nav>
<main class="layout__main">Основной контент</main>
<aside class="layout__aside">Сайдбар</aside>
<footer class="layout__footer">Футер</footer>
</div>
</body>
</html>
/* style.css */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body {
min-height: 100vh;
}
.layout {
display: grid;
grid-template-areas:
"header header header"
"nav main aside"
"footer footer footer";
grid-template-columns: 220px 1fr 200px;
grid-template-rows: auto 1fr auto;
min-height: 100vh;
}
.layout__header { grid-area: header; background: #1e40af; color: #fff; padding: 16px 24px; }
.layout__nav { grid-area: nav; background: #f1f5f9; padding: 24px 16px; }
.layout__main { grid-area: main; padding: 24px; }
.layout__aside { grid-area: aside; background: #f8fafc; padding: 24px 16px; }
.layout__footer { grid-area: footer; background: #1e293b; color: #fff; padding: 16px 24px; text-align: center; }
/* Адаптив: одна колонка на мобильном */
@media (max-width: 768px) {
.layout {
grid-template-areas:
"header"
"nav"
"main"
"aside"
"footer";
grid-template-columns: 1fr;
grid-template-rows: auto;
}
}
Ключевые моменты
grid-template-areasделает разметку читаемой — видно структуру прямо в CSS.grid-template-rows: auto 1fr auto— средняя строка (main) растягивается, шапка и футер прижаты к краям.min-height: 100vhна.layout— футер всегда внизу экрана, даже при малом контенте.- Адаптив реализуется переопределением
grid-template-areasв media query — логика не меняется.
Варианты
- Flexbox-вариант: внешний контейнер —
flex-direction: column, центральная часть —display: flexс тремя колонками. - Если не нужен
aside— убери колонку, оставь две:"nav main".