
Единица vh в CSS обозначает 1% от высоты видимой области окна браузера. При использовании 100vh элемент растягивается на всю высоту экрана независимо от размера содержимого. Это особенно полезно для создания полноэкранных секций, лендингов и адаптивных блоков с фокусом на вертикальное пространство.
Практическое применение vh включает установку высоты заголовочных блоков, фонов и слайдеров. Например, header { height: 80vh; } позволяет задать пропорцию экрана для заголовка без зависимости от контента, сохраняя визуальный баланс на разных устройствах.
При использовании vh важно учитывать мобильные браузеры: на iOS и некоторых Android-браузерах 100vh может включать высоту панели инструментов, создавая лишний скролл. Решение – использовать CSS-переменные с динамическим значением window.innerHeight через JavaScript и обновлять —vh для корректной отрисовки элементов.
Кроме высоты секций, vh применим для вертикального центрирования элементов, адаптивных отступов и высоты модальных окон. Комбинация vh с другими единицами, например, em или %, позволяет создавать гибкие макеты, которые сохраняют пропорции при изменении размеров окна.
Использование vh на CSS 84 помогает оптимизировать визуальные блоки, минимизировать лишние медиа-запросы и повышает контроль над адаптивной версткой. Планирование высоты через vh особенно эффективно при проектировании интерфейсов с фиксированными или динамическими элементами, которые должны сохранять видимость на всех устройствах.
Определение высоты блока через vh

Единица измерения vh равна 1% от высоты видимой области браузера. Для установки блока на всю высоту экрана используют значение 100vh: height: 100vh;. Этот подход гарантирует, что блок займет весь экран независимо от разрешения устройства.
Для адаптивного дизайна часто применяют дробные значения. Например, height: 50vh; задает половину видимой области, что удобно для секций с половинной высотой экрана. Комбинация с min-height и max-height предотвращает чрезмерное уменьшение или увеличение блока на нестандартных экранах: min-height: 300px; max-height: 600px;.
При использовании vh важно учитывать мобильные браузеры с динамическими панелями. На iOS и Android высота экрана может изменяться при появлении клавиатуры или панели навигации. Для точного расчета рекомендуют применять CSS-переменные, обновляемые через JavaScript: --vh: 1vh * window.innerHeight / 100; и использовать height: calc(var(--vh) * 100);.
В случаях, когда блок должен занимать не весь экран, а фиксированную часть видимой области, значения ниже 100vh обеспечивают гибкость. Например, height: 75vh; позволяет выделить основное содержание и оставить пространство для шапки и подвала.
Для многосекционных макетов с прокруткой vh упрощает контроль вертикального пространства. Использование height: 100vh; для каждой секции создает эффект «экран за экраном» без дополнительных вычислений через JavaScript.
Создание полноэкранных секций с vh

Для создания секций, занимающих весь экран, в CSS используется единица измерения vh, где 1vh соответствует 1% высоты видимой области окна браузера. Например, значение height: 100vh; гарантирует, что элемент будет занимать всю высоту экрана вне зависимости от разрешения устройства.
При верстке нескольких полноэкранных секций рекомендуется задавать каждой отдельный height: 100vh; и контролировать переполнение контента через overflow: hidden или overflow-y: auto для вертикальной прокрутки внутри секции.
Чтобы избежать проблем на мобильных устройствах с динамическими панелями браузера, лучше использовать CSS-переменную --vh, вычисляемую через JavaScript: document.documentElement.style.setProperty('--vh', window.innerHeight * 0.01 + 'px'); и затем устанавливать высоту секции как height: calc(var(--vh, 1vh) * 100);.
Для плавного перехода между секциями можно использовать CSS-свойства scroll-snap-type и scroll-snap-align. Например, родительский контейнер получает scroll-snap-type: y mandatory;, а каждая секция – scroll-snap-align: start;. Это обеспечивает автоматическое выравнивание при прокрутке.
При адаптивной верстке стоит комбинировать vh с минимальной и максимальной высотой: min-height: 400px;, max-height: 100vh;. Это предотвращает чрезмерное растягивание контента на больших мониторах и сохраняет читаемость на малых экранах.
Для фоновых изображений или видео, занимающих всю секцию, используйте object-fit: cover; и width: 100%;, height: 100%;. Такой подход гарантирует, что контент масштабируется без искажений и полностью покрывает экранную область.
Использование vh для полноэкранных секций позволяет создавать интерфейсы с четкой визуальной структурой и контролируемой прокруткой, одновременно обеспечивая совместимость с различными разрешениями и ориентацией экранов.
Адаптация изображений и фоновых блоков к экрану

Для корректного отображения визуальных элементов на экранах разной высоты используют единицы vh. Один vh равен 1% высоты окна браузера, что позволяет задать гибкие размеры для изображений и фоновых блоков без потери пропорций.
Часто применяют сочетание height: 100vh; для фонового контейнера и свойства background-size: cover; для масштабирования изображения под всю доступную высоту. Такой подход исключает появление полос при изменении ориентации устройства и гарантирует заполнение экрана контентом.
При адаптивной верстке важно учитывать, что использование только vh без учёта ширины может исказить соотношение сторон. Для балансировки применяют min-height и max-height в комбинации с процентными значениями ширины или aspect-ratio.
Пример расчёта высоты блока через vh позволяет зафиксировать визуальное пространство и избежать скачков при загрузке изображений. Это особенно актуально для заставок, промо-блоков и лендингов с фоновыми видео.
| Задача | Решение с использованием vh |
|---|---|
| Фоновое изображение на весь экран | height: 100vh; background-size: cover; background-position: center; |
| Изображение внутри адаптивного блока | max-height: 80vh; width: auto; object-fit: contain; |
| Секция с фиксированной видимой областью | min-height: 60vh; overflow: hidden; |
Использование vh для фоновых блоков обеспечивает стабильность макета при любых разрешениях и предотвращает смещение контента при масштабировании окна. Это особенно важно при разработке интерфейсов для мобильных устройств, где высота окна часто меняется из-за панели навигации и клавиатуры.
Использование vh для вертикального центрирования элементов
Единица vh задаёт высоту элемента относительно видимой области окна браузера. 1vh равен 1% высоты вьюпорта, что позволяет точно выравнивать блоки по вертикали без зависимости от контента страницы.
Для вертикального центрирования часто применяют сочетание высоты контейнера в vh и свойств flexbox или grid:
- Установите контейнеру
height: 100vh;– он займёт всю высоту экрана. - Добавьте
display: flex;иalign-items: center;, чтобы содержимое выровнялось по центру вертикали. - При необходимости используйте
justify-content: center;для одновременного центрирования по горизонтали.
Пример:
.wrapper {
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}
Этот приём надёжен при создании приветственных экранов, форм входа, модальных окон и лендингов. В отличие от процентов, vh не зависит от высоты родителя, что исключает необходимость расчётов или дополнительных обёрток.
При работе на мобильных устройствах учитывайте динамическую высоту адресной строки. Для стабильного отображения используйте 100svh или 100dvh – эти единицы корректно учитывают изменяющуюся высоту экрана при прокрутке.
Комбинация vh с другими единицами для гибкой верстки

Единицы vh удобно сочетать с rem, %, px и vw для точной настройки адаптивного интерфейса. Например, использование calc() позволяет задавать размеры блоков с учетом высоты окна и фиксированных отступов: height: calc(100vh - 80px); – элемент займет всю высоту окна за вычетом шапки или панели навигации.
При работе с текстом и внутренними отступами эффективна комбинация vh и rem. Высота секции может задаваться через vh, а внутренние поля и шрифты – через rem, чтобы масштабирование происходило независимо от высоты окна, но сохранялось визуальное равновесие.
Процентные значения часто применяются вместе с vh для динамической ширины или вложенных контейнеров. Например, min-height: 50vh; и width: 80%; создают гибкий блок, сохраняющий пропорции при изменении размеров экрана.
Для фоновых изображений сочетание vh с vw позволяет добиться равномерного покрытия без искажений: background-size: 100vw 100vh;. Это обеспечивает корректное отображение независимо от ориентации устройства.
Использование нескольких единиц одновременно – ключ к созданию интерфейсов, одинаково устойчивых к изменениям масштаба, высоты и ширины окна браузера.
Учет мобильных браузеров при применении vh

На мобильных устройствах единица vh рассчитывается с учётом всей высоты экрана, включая области, скрывающиеся при прокрутке – адресную строку и панель навигации. Из-за этого элементы, заданные в 100vh, могут выходить за границы видимой части страницы.
Чтобы избежать сдвигов при прокрутке, рекомендуется использовать динамические единицы, поддерживаемые современными браузерами: dvh, lvh и svh. Например, height: 100dvh; учитывает текущую видимую высоту окна, а svh фиксирует минимальное значение при скрытых панелях. Это устраняет скачки макета при изменении состояния интерфейса браузера.
Для устройств без поддержки новых единиц можно применить JavaScript-решение. Например, вычислить актуальную высоту окна через window.innerHeight и задать переменную CSS:
const vh = window.innerHeight * 0.01;
document.documentElement.style.setProperty('--vh', `${vh}px`);
Затем использовать: height: calc(var(--vh) * 100);. Такой подход обеспечивает стабильную высоту элементов на iOS Safari и Android Chrome независимо от поведения панели адреса.
Исправление проблем с vh при динамическом изменении окна
При изменении размеров окна браузера, особенно на мобильных устройствах, значение vh может пересчитываться некорректно из-за появления или скрытия адресной строки. Это приводит к «скачкам» макета и некорректной высоте элементов.
Чтобы устранить эти искажения, стоит отказаться от прямого использования 100vh в критичных блоках и использовать вычисляемое значение через JavaScript.
- Создать переменную с точным значением высоты видимой области:
let vh = window.innerHeight * 0.01;
document.documentElement.style.setProperty('--vh', `${vh}px`);
- Заменить
height: 100vh;наheight: calc(var(--vh) * 100);. - Добавить обработчик события
resizeдля пересчета при изменении окна:
window.addEventListener('resize', () => {
let vh = window.innerHeight * 0.01;
document.documentElement.style.setProperty('--vh', `${vh}px`);
});
Такое решение обеспечивает стабильную высоту элементов независимо от динамических изменений интерфейса браузера.
Дополнительно можно оптимизировать обработку с помощью requestAnimationFrame или debounce-функции, чтобы исключить лишние вызовы при быстром ресайзе.
- Для iOS Safari – использовать
env(safe-area-inset-bottom)в сочетании с вычисляемым--vh, чтобы учесть нижние отступы. - Для Android Chrome – избегать фиксированных высот и применять
min-heightвместоheightпри адаптивных макетах.
Использование динамической переменной --vh делает верстку устойчивой к изменению высоты окна и исключает визуальные искажения при смене ориентации или появлении системных панелей.
