Как попасть в BigTech? Топовые разрабы делятся опытом —смотреть на YouTube

Что такое svh, lvh, dvh в CSS

Проблема с vh на мобильных

Классическая единица 100vh давно страдает от одной известной проблемы: мобильные браузеры (Chrome, Safari) динамически скрывают/показывают адресную строку при прокрутке. При этом vh не пересчитывается — он остаётся зафиксированным на одном из крайних значений, из-за чего контент либо обрезается, либо появляется скролл там, где его не должно быть.

CSS Level 4 ввёл три новые единицы для точного контроля над этим поведением.


Три новые единицы

ЕдиницаРасшифровкаЧто означает
svhSmall Viewport Height1% от наименьшего возможного viewport — когда UI браузера полностью видим
lvhLarge Viewport Height1% от наибольшего возможного viewport — когда UI браузера полностью скрыт
dvhDynamic Viewport Height1% от текущего размера 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.