PassFront
  1. PassFront
  2. База знаний
  3. Продвинутые темы

В чем нюанс vh на мобильных устройствах?

Продвинутые темы

Нюанс `vh` на мобильных в том, что `100vh` не учитывает динамические панели браузера (адресную строку), из-за чего элемент оказывается выше видимой области и появляется прокрутка или обрезка.

Проблема

100vh = 100% высоты viewport, но на мобильных браузерах адресная строка и панели появляются и скрываются при скролле. Браузер считает vh относительно полной высоты (без учёта видимых панелей), поэтому height: 100vh часто больше реально видимой области:

.hero { height: 100vh; } /* на мобильном "вылезает" под адресную строку */

В результате — лишняя прокрутка или обрезанный контент внизу.

Решения

Новые единицы viewport (dvh/svh/lvh)

.hero { height: 100dvh; } /* dynamic viewport height — учитывает панели */
  • dvh — динамическая (подстраивается под панели).
  • svh — small (минимальная видимая, с панелями).
  • lvh — large (максимальная, без панелей).

JS-переменная (старый способ)

const setVh = () => document.documentElement.style
  .setProperty('--vh', `${window.innerHeight * 0.01}px`);
setVh();
window.addEventListener('resize', setVh);
.hero { height: calc(var(--vh, 1vh) * 100); }

Коротко для собеседования

Нюанс: 100vh на мобильных не учитывает динамическую адресную строку — считается от полной высоты, поэтому элемент выше видимой области (прокрутка/обрезка). Решают новыми единицами dvh/svh/lvh (динамический viewport) или JS-переменной на window.innerHeight.

Другие вопросы раздела