Что такое svh, lvh, dvh в CSS
Проблема с vh на мобильных
Классическая единица 100vh давно страдает от одной известной проблемы: мобильные браузеры (Chrome, Safari) динамически скрывают/показывают адресную строку при прокрутке. При этом vh не пересчитывается — он остаётся зафиксированным на одном из крайних значений, из-за чего контент либо обрезается, либо появляется скролл там, где его не должно быть.
CSS Level 4 ввёл три новые единицы для точного контроля над этим поведением.
Три новые единицы
| Единица | Расшифровка | Что означает |
|---|---|---|
svh | Small Viewport Height | 1% от наименьшего возможного viewport — когда UI браузера полностью видим |
lvh | Large Viewport Height | 1% от наибольшего возможного viewport — когда UI браузера полностью скрыт |
dvh | Dynamic Viewport Height | 1% от текущего размера viewport — обновляется в реальном времени при скролле |
Визуализация
┌────────────────────────┐ ← lvh (адресная строка скрыта)
│ │
│ Контент │
│ │
├────────────────────────┤ ← svh (адресная строка видна)
│ [адресная строка] │
└────────────────────────┘
100svh— высота с учётом, что адресная строка всегда занимает место100lvh— высота при полностью скрытом UI браузера100dvh— живая высота, меняется при скролле
Когда что использовать
svh — безопасная высота
Подходит для фиксированных элементов, которые должны быть всегда видны без скролла — например, модальные окна, полноэкранные карточки:
.modal {
height: 100svh; /* гарантированно влезет, даже с адресной строкой */
}
lvh — максимальная высота
Используется когда хочется занять всё доступное пространство при скрытой навигации — hero-секции, полноэкранные баннеры:
.hero {
min-height: 100lvh;
}
dvh — динамическая высота
Реагирует на реальное состояние браузера в данный момент. Удобно для sticky-элементов и интерактивных лейаутов, но вызывает repaint при скролле:
.sticky-panel {
height: 100dvh; /* обновляется при изменении размера viewport */
}
Сравнение с классическим vh
| Единица | Поведение при прокрутке | Проблема на мобильных |
|---|---|---|
vh | Фиксирован (LVH в большинстве браузеров) | Контент может быть обрезан |
svh | Фиксирован (минимум) | Нет |
lvh | Фиксирован (максимум) | Нет |
dvh | Динамический | Вызывает repaint |
Аналогичные единицы для ширины
Те же три варианта существуют для ширины и комбинированных единиц:
svw, lvw, dvw — ширина
svi, lvi, dvi — inline (горизонталь в LTR)
svb, lvb, dvb — block (вертикаль в LTR)
svmin, lvmin, dvmin
svmax, lvmax, dvmax
Поддержка браузерами
Все три единицы поддерживаются во всех современных браузерах начиная с 2022–2023 года:
- Chrome 108+
- Safari 15.4+
- Firefox 101+
Важно:
dvh вызывает layout/repaint при каждом изменении viewport (прокрутка, появление клавиатуры). Используйте его только там, где динамическое поведение действительно нужно. Для статичных лейаутов предпочтительнее svh или lvh.
Рекомендация:
Для большинства мобильных full-screen секций оптимальный выбор — 100svh: контент гарантированно не обрежется, и нет накладных расходов на repaint.