Sticky footer
Футер всегда прижат к нижнему краю экрана — даже если контента мало; при большом контенте уходит вниз вместе со страницей.
Задача
На страницах с малым количеством контента (404, логин) футер «плавает» посередине экрана. Нужно, чтобы он всегда был внизу, но не перекрывал контент при скролле.
Решение
Способ 1 — Flexbox (рекомендуемый)
<body>
<header>Шапка</header>
<main>Контент</main>
<footer>Футер</footer>
</body>
* { box-sizing: border-box; margin: 0; }
body {
display: flex;
flex-direction: column;
min-height: 100vh;
}
main {
flex: 1; /* растягивается и заполняет пространство между header и footer */
}
header { background: #1e40af; color: #fff; padding: 16px 24px; }
main { padding: 24px; }
footer { background: #1e293b; color: #fff; padding: 16px 24px; text-align: center; }
Способ 2 — CSS Grid
body {
display: grid;
grid-template-rows: auto 1fr auto;
min-height: 100vh;
}
Разметка та же: header, main, footer. Средняя строка 1fr растягивается.
Способ 3 — position: sticky (для sticky внутри scroll)
Этот вариант подходит, если футер должен прилипать внутри контейнера во время скролла:
footer {
position: sticky;
bottom: 0;
}
Ключевые моменты
min-height: 100vhнаbody— ключевое; без негоflex/gridне даст нужного эффекта.flex: 1наmain— делает контентную область резиновой; footer остаётся внизу.- Flexbox-способ проще и достаточен в 99% случаев.
position: sticky; bottom: 0— другой паттерн: футер всегда виден при скролле внутри контейнера (footer bar).
Варианты
- Если в проекте уже используется
dvh(dynamic viewport height): замени100vhна100dvh— корректно работает с адресной строкой мобильного браузера.