
Растяжение контейнера на всю высоту экрана – частая задача при создании адаптивных макетов. Проблема возникает из-за того, что свойство height: 100% не работает без чётко заданной высоты у родительских элементов. Без этой зависимости браузер не может вычислить итоговое значение в процентах, и контейнер занимает только высоту своего содержимого.
Для надёжного результата важно задать высоту html и body в 100%, а затем применить это значение к основному контейнеру. Ещё один подход – использование единиц vh, позволяющих задать высоту в долях от видимой области окна. Например, height: 100vh гарантирует растяжение блока на всю высоту экрана без учёта родительских элементов.
Кроме процентов и vh, подходящими инструментами являются flexbox и CSS Grid. Они позволяют распределять пространство вертикально и автоматически выравнивать дочерние элементы по высоте. Такой способ особенно удобен для макетов с динамическим содержимым или при работе с вложенными контейнерами.
Далее рассмотрим конкретные CSS-приёмы, которые позволяют достичь нужной высоты в разных сценариях: от простых статичных страниц до сложных адаптивных интерфейсов.
Использование height: 100% и условия для корректной работы

Свойство height: 100% задаёт элементу высоту, равную высоте его родителя. Чтобы оно сработало, необходимо, чтобы все родительские контейнеры до html и body имели явно заданную высоту. Без этого браузер не сможет вычислить процентное значение, и элемент примет высоту содержимого.
Минимальный набор правил для корректной работы выглядит так:
html, body { height: 100%; margin: 0; }
.container { height: 100%; }
Если внутри документа используются вложенные секции или обёртки, каждая из них также должна иметь высоту 100%, иначе цепочка расчёта прервётся. Это особенно важно при использовании фреймворков или сложных шаблонов, где структура документа глубже одного уровня.
При необходимости учитывать фиксированные элементы, например шапку сайта, можно задать контейнеру height: calc(100% — 60px), где 60 пикселей – высота шапки. Такой способ позволяет сохранить гибкость верстки без потери адаптивности.
Для отладки удобно использовать временные рамки или фоновый цвет, чтобы визуально убедиться, что высота передаётся по всей иерархии элементов. Это помогает быстро выявить контейнер, нарушающий цепочку наследования высоты.
Применение единиц измерения vh для растяжения контейнера

Единицы vh задают высоту элемента относительно видимой области окна браузера. Один vh равен одному проценту высоты окна. В отличие от процентов, значение не зависит от высоты родительских элементов и позволяет сразу растянуть контейнер на всю высоту экрана.
Пример базового использования:
.container { height: 100vh; }
Такой способ подходит для полноэкранных секций, лендингов и стартовых блоков. Однако при работе с мобильными устройствами стоит учитывать изменение высоты окна при появлении и скрытии адресной строки, что может вызвать смещение контента.
Для стабильного результата можно использовать вычисляемые значения через calc() или адаптивные единицы dvh (dynamic viewport height), которые корректируются при изменении высоты окна.
| Единица | Описание | Особенности |
|---|---|---|
| vh | Процент от текущей высоты окна | Может меняться при прокрутке на мобильных устройствах |
| lvh | Фиксируется по минимальной высоте окна | Избегает скачков при появлении панели браузера |
| dvh | Адаптируется под динамические изменения окна | Рекомендуется для адаптивной верстки |
Если требуется учитывать фиксированную шапку, можно применить выражение height: calc(100vh — 70px). Такой подход сохраняет растяжение контейнера при любых изменениях размеров окна.
Разница между min-height и height при создании полноэкранных блоков

Свойство height фиксирует высоту элемента и не позволяет контенту выходить за пределы заданного значения. Если содержимое превышает высоту блока, оно будет обрезано или вызовет прокрутку. Такой подход применим, когда необходимо точно задать размер, например, при разработке статичных секций.
Свойство min-height задаёт минимальную высоту, при этом блок может увеличиваться, если контент занимает больше места. Это удобно для адаптивных макетов, где объём текста или изображений может меняться в зависимости от устройства.
Для полноэкранных секций рекомендуется использовать min-height: 100vh, чтобы блок занимал не меньше высоты окна, но при этом мог растягиваться при переполнении. В отличие от height: 100vh, такой вариант предотвращает наложение элементов и сохраняет читаемость при увеличении контента.
Если используется flexbox или grid, высоту лучше задавать через min-height, чтобы контейнер мог адаптироваться к изменению размеров родительского блока без нарушения структуры. Это особенно важно при комбинировании фиксированных и динамических элементов на одной странице.
Для секций с фоновыми изображениями допустимо применять height, чтобы сохранить стабильные пропорции, но при этом следует добавить внутренние отступы и ограничение переполнения через overflow, чтобы избежать сдвига контента.
Как задать высоту контейнера через flex-контейнер

Механизм flexbox позволяет распределять пространство по вертикали без указания фиксированной высоты. Для этого родительскому элементу достаточно задать display: flex и направление оси flex-direction: column. Дочерние элементы могут автоматически растягиваться на всю доступную высоту при использовании свойства flex: 1.
Пример базовой структуры:
html, body { height: 100%; margin: 0; }
.wrapper { display: flex; flex-direction: column; height: 100%; }
.main { flex: 1; }
В этом примере блок .main занимает всё оставшееся пространство между шапкой и подвалом независимо от размера экрана. Такой метод особенно полезен при построении макетов с фиксированными элементами сверху и снизу страницы.
| Свойство | Назначение | Комментарий |
|---|---|---|
| display: flex | Включает режим гибкого контейнера | Определяет поведение дочерних блоков |
| flex-direction: column | Выстраивает элементы по вертикали | Позволяет распределять высоту между блоками |
| flex: 1 | Растягивает элемент на оставшееся пространство | Полезно для создания центральных секций фиксированной высоты |
| align-items | Управляет выравниванием по поперечной оси | Помогает центрировать или прижать элементы к краям |
Если требуется, чтобы весь макет занимал высоту окна, необходимо установить height: 100% для html и body, иначе flex-контейнер не сможет корректно распределить пространство. Такой подход обеспечивает точное управление вертикальным масштабом без применения абсолютного позиционирования или расчётов через calc().
Использование CSS Grid для растяжения элементов по высоте

CSS Grid позволяет задать структуру, при которой элементы автоматически занимают всю доступную высоту контейнера без дополнительных ухищрений. Для этого достаточно использовать свойства, управляющие распределением строк и выравниванием по осям.
Базовый пример:
html, body {
height: 100%;
margin: 0;
}
.container {
display: grid;
grid-template-rows: 1fr 2fr 1fr;
height: 100vh;
}
.item {
background: lightgray;
border: 1px solid #ccc;
}
В этом примере контейнер распределяет высоту окна браузера между тремя строками. Каждая строка растягивается пропорционально указанным долям.
Чтобы все элементы внутри сетки заполняли ячейку по высоте, используется свойство align-items:
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
align-items: stretch;
height: 100vh;
}
align-items: stretch; заставляет каждый элемент занимать всю высоту своей строки. Это особенно полезно при работе с динамическим контентом, где размеры элементов неизвестны заранее.
align-itemsуправляет вертикальным выравниванием внутри строк.justify-itemsзадаёт горизонтальное выравнивание в пределах столбцов.grid-auto-rows: 1fr;делает все автоматически созданные строки одинаковой высоты, что помогает при неопределённом количестве элементов.
Пример с равной высотой строк при неизвестном количестве элементов:
.container {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
grid-auto-rows: 1fr;
gap: 10px;
height: 100vh;
}
Такой подход обеспечивает равномерное распределение элементов и их растяжение по высоте без использования flexbox или JavaScript. Grid остаётся оптимальным решением для сложных макетов с предсказуемым поведением по вертикали.
Как сделать контейнер на всю высоту при вложенной структуре
При вложенной структуре блоков высота родительского контейнера не всегда передается дочерним элементам. Чтобы контейнер корректно растягивался по высоте, нужно обеспечить вычисляемую высоту всех уровней иерархии.
- Задайте корневым элементам
htmlиbodyвысоту100%:html, body { height: 100%; margin: 0; } - Родительскому контейнеру установите
height: 100%илиmin-height: 100vh– в зависимости от того, требуется ли учитывать высоту окна браузера:.wrapper { min-height: 100vh; display: flex; flex-direction: column; } - Если дочерний блок должен занимать всё доступное пространство, используйте
flex: 1:.content { flex: 1; } - При использовании Grid достаточно задать родителю
display: gridи высоту100%, а дочерним элементам –align-self: stretchилиheight: 100%. - Если высота вычисляется от содержимого, примените каскадное наследование через
height: inherit:.inner { height: inherit; }
Для корректной работы во всех браузерах рекомендуется избегать смешивания абсолютного и относительного позиционирования без необходимости и проверять, что у каждого родителя есть заданная высота, от которой можно рассчитывать процентные значения.
Способы учесть отступы и фиксированные элементы при расчёте высоты

При задании высоты контейнера важно учитывать фиксированные заголовки, подвал и внутренние отступы, чтобы элементы не перекрывались и не выходили за пределы видимой области.
- Если на странице есть фиксированный хедер или футер, используйте функцию
calc():.main { min-height: calc(100vh - 60px - 40px); /* вычитаем высоту хедера и футера */ } - При наличии внутренних отступов применяйте
box-sizing: border-box, чтобы паддинги входили в общую высоту:* { box-sizing: border-box; } - Если контейнер ограничен по высоте и нужно учитывать только верхний отступ, задайте высоту через
calc():.content { height: calc(100vh - 80px); /* фиксированный верхний блок */ } - Для гибкой вёрстки с переменными размерами шапки используйте CSS-переменные:
:root { --header-height: 70px; } .main { min-height: calc(100vh - var(--header-height)); } - Если элемент фиксирован снизу, задайте контейнеру нижний внутренний отступ, равный высоте этого блока, чтобы содержимое не перекрывалось:
.page { padding-bottom: 50px; /* высота фиксированного блока */ }
При адаптивной вёрстке рекомендуется использовать относительные единицы и вычисления с calc(), чтобы высота корректно пересчитывалась при изменении размеров окна.
Типичные ошибки при использовании процентов и vh для высоты

Использование процентов и единиц vh для задания высоты часто вызывает проблемы, если не учтены особенности вычисления и контекст родительских элементов.
- Проценты не работают без заданной высоты у родителя. Если у контейнера нет вычисляемой высоты, дочерний блок с
height: 100%не растянется:html, body { height: 100%; }Без этих правил элемент с процентной высотой примет значение
auto. - При использовании
100vhна мобильных устройствах контейнер может выходить за экран из-за изменения размеров области просмотра при прокрутке. Решение – использовать100dvhили переменные, зависящие от видимой высоты окна:.section { min-height: 100dvh; /* динамическая единица, учитывающая адресную строку */ } - Частая ошибка – смешивание процентов и
vhбез понимания их зависимости. Проценты вычисляются относительно родителя, аvh– относительно окна браузера. Их комбинация должна быть осознанной:.wrapper { height: calc(100vh - 100%); }Такое выражение часто даёт неверный результат, если родитель не имеет фиксированной высоты.
- При использовании
vhбез учёта фиксированных элементов страница может иметь прокрутку. Для устранения этого вычитайте их высоту с помощьюcalc():.content { min-height: calc(100vh - 60px); }
Для стабильной работы макета всегда проверяйте, от чего рассчитываются процентные значения, и тестируйте единицы vh на разных устройствах и браузерах.
Вопрос-ответ:
Почему контейнер с высотой 100% не растягивается на весь экран?
Процентная высота работает только при наличии вычисляемой высоты у родителя. Если у html и body не задано height: 100%, дочерний элемент не сможет рассчитать свою высоту. Добавьте это свойство к корневым элементам, чтобы контейнер корректно растягивался.
Чем отличается использование процентов от единиц vh при указании высоты?
Проценты вычисляются относительно высоты родительского блока, а vh — относительно окна браузера. Если контейнер должен всегда занимать видимую часть экрана, удобнее применять 100vh. Если требуется подстраиваться под высоту родителя, используйте проценты при условии, что высота всех родительских элементов определена.
Почему при использовании 100vh на мобильных устройствах появляется прокрутка?
На мобильных браузерах значение 100vh часто включает область под адресной строкой, из-за чего высота контейнера превышает видимую часть экрана. Чтобы избежать этого, используйте 100dvh — единицу, которая учитывает динамическое изменение области просмотра при прокрутке.
Можно ли совместить CSS Grid и flex для растяжения контейнера по высоте?
Да. Grid и Flexbox могут использоваться вместе. Например, внешний контейнер можно сделать сеткой с высотой 100vh, а внутри разместить flex-элементы, один из которых растягивается с помощью flex: 1. Такой подход обеспечивает точное управление распределением пространства между секциями.
