Различия высоты 100% и 100vh в CSS: проблемы и решения

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Свойство CSS height: 100vh; обеспечивает заполнение всей высоты видимого экрана элементом, не зависимо от его родительских блоков. В свою очередь, height: 100%; работает на основе высоты родительского элемента и не гарантирует полное заполнение видимой области. Использование 100vh предпочтительнее для заполнения всего экрана, т.к. это исключает вероятность ошибок в расчётах.

CSS
Скопировать код
/* Элемент займёт всю видимую область экрана, вне зависимости от родительских элементов */
.full-screen {
  height: 100vh;
}

Однако, на мобильных устройствах значение 100vh может быть изменено при скрытии адресной строки. На десктопе полоса прокрутки может влиять на параметр vw, вызывая сдвиги в черновике вашего проекта.

Кинга Идем в IT: пошаговый план для смены профессии

Разъяснение различий

Единицы измерения видимой области и их зависимость от родительского элемента

Единицы измерения vw, vh, vmin, vmax основываются на величине видимой области экрана. Свойство height: 100% требует чтобы родительский элемент имел установленную высоту 100% на всех уровнях, вплоть до <html> и <body>.

Адаптивный дизайн

Единицы vw и vh прекрасно подходят для адаптивного дизайна, позволяя элементам корректно масштабироваться под разные размеры экрана:

CSS
Скопировать код
/* Размер текста масштабируется в зависимости от размеров окна просмотра */
.body-text {
  font-size: calc(.5vh + .5vw);
}

Но значение 100vh на мобильных устройствах может изменяться при изменении ориентации или появлении панели инструментов.

Учет содержимого, превышающего видимую область экрана

Использование height: 100vh может привести к невозможности прокрутки, если содержимое больше по размеру, чем видимая область экрана. В этом случае необходимо обеспечить контроль прокрутки с помощью CSS либо динамическую корректировку высоты через window.innerHeight в JavaScript.

Визуализация

Сравним каждый подход с картиной на мольберте: HTML это фиксированный эскиз, BODY – картина, адаптирующаяся под восприятие зрителя.

plaintext
Скопировать код
HTML (🖼️🎨): 
▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓    <-- Части картины остаются скрытыми, если стена (элемент <html>) не достаточно "высока".
▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓
plaintext
Скопировать код
BODY (🖼️🎨): 
▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓    <-- Пропорции элемента подстраиваются в пределах видимой области, позволяя увидеть полностью всю картину.
▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓

Свойство Height 100vh гарантирует отображение всей картины без прокрутки, будто это универсальный холст для всех ситуаций.

Практическое использование 100vh и 100%

Захватывающие пользователей секции на весь экран

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

Вложенные конструкции

Для вложенных элементов в сложных дизайнах более подходящим является использование height: 100%, что обеспечивает логическое наследование размеров и соответствие содержимого размерам родительских элементов.

Панели инструментов на мобильных устройствах

Изменения в видимой области экрана на мобильных устройствах требуют динамической коррекции высоты или использования специальных функций CSS, чтобы сохранить пропорции, с учетом особенностей и съемных панелей в операционной системе iOS.

Прокрутка допустима

При создании прокручиваемого контейнера в пределах элемента на весь экран использование 100vh в сочетании с overflow: auto решает проблемы с переполнением, сохраняя размеры контейнера в рамках видимой области.

Полезные материалы

  1. Использование единиц окна просмотра для создания отзывчивой типографики
  2. Анализ точности вычислений при работе с CSS и Sass
  3. Руководство по адаптации шрифтов под разные размеры экрана
  4. Решения для корректного соотношения сторон встроенного контента
  5. Руководство по использованию размерных параметров в CSS
  6. Обсуждение поведения 100vh на мобильных устройствах на Stack Overflow