Как растянуть блок на весь экран (на всю высоту окна)?
Хочу сделать первый экран (hero) во всю высоту окна браузера, но height: 100% почему-то не растягивает блок. Как заставить секцию занять весь экран по высоте?
2 ответа
Самый простой способ растянуть блок на всю высоту окна — единица vh (viewport height), где 100vh = вся высота видимой области браузера:
.hero {
min-height: 100vh; /* минимум во весь экран */
}
Почему height: 100% не сработал: проценты высоты считаются от высоты родителя, а у родителя (вплоть до body и html) высота обычно не задана — она равна содержимому. Получается цепочка «100% от неопределённого = ничего». Чтобы проценты заработали, высоту надо протянуть сверху:
html, body { height: 100%; margin: 0; }
.hero { height: 100%; }
Но с vh эта возня не нужна — он меряется прямо от окна.
Советы:
- берите
min-height: 100vh, а неheight: 100vh: если контента окажется больше экрана, блок вырастет, а не обрежет содержимое; - на всю ширину аналогично есть
100vw, но чаще достаточноwidth: 100%(vw иногда даёт горизонтальный скролл из-за полосы прокрутки); - на мобильных классический
100vhможет «прыгать» из-за адресной строки — в современных браузерах для этого есть100dvh(dynamic viewport height), он учитывает сворачивание панелей.
Часто этот блок ещё центрируют по содержимому: display: flex; align-items: center; justify-content: center; вместе с min-height: 100vh.
Если задача — растянуть блок не на весь экран, а на всю высоту родителя-флекс-контейнера (например, колонку в карточке), то vh не нужен: сделайте родителя display: flex и дайте ребёнку flex: 1 или align-self: stretch. vh — это именно про окно браузера, а внутри гибких контейнеров высота тянется их собственными средствами.