Перейти к содержимому

Адаптивность

В зависимости от ширины и высоты экрана и наличия точного указателя (мышь, стилус) компоненты VKUI автоматически адаптируют внешний вид одним из двух способов:

  1. Меняют размеры на компактные или базовые (далее — compact и regular).
  2. Изменяют вёрстку и поведение.

В этой документации вы узнаете:

  • какие бывают параметры адаптивности;
  • как переопределить адаптивность глобально и локально;
  • как создавать собственные адаптивные интерфейсы.

Библиотека использует несколько подходов.

ПодходРеализация в коде
Изменение размеров интерфейсаdensity
Изменение вёрсткиviewWidth и viewHeight
Изменение поведенияhasPointer

Чтобы интерфейс был удобен и на десктопе, и на мобильных, у большинства компонентов два режима размера: compact и regular.

  • compact — включается при большом экране и точном указателе (например, мышь). Используются меньшие размеры, чтобы на экране помещалось больше элементов — их не нужно прятать за меню.
  • regular — включается при ограниченной области экрана и отсутствии точного указателя (сенсорный экран). Элементы крупнее, чтобы по ним удобно было попадать пальцем.

За это отвечает свойство density, которое принимает compact или regular.

Если значение не задано, оно зависит от @media ↗ в CSS и matchMedia() ↗ в JS — от ширины, высоты экрана и наличия точного указателя.

ЗначениеУсловие
compactвысота < 415px,
или
мышь / стилус и ширина >= 768px
regularвысота >= 415px и сенсорный экран,
или
высота >= 415px и нет указателя,
или
высота >= 415px и ширина < 768px

От размера экрана может полностью меняться вёрстка компонента, чтобы сохранить привычный пользователю интерфейс. Например, ModalPage на мобильном — выезжающая снизу панель, а на десктопе — диалоговое окно по центру.

Размер экрана описывают два свойства с брейкпоинтами: viewWidth и viewHeight. В CSS они реализованы через @media ↗, в JS — через matchMedia() ↗.

БрейкпоинтУсловие
DESKTOPширина >= 1280px
TABLETширина >= 1024px
SMALL_TABLETширина >= 768px
MOBILEширина >= 320px
SMALL_MOBILEширина < 320px
БрейкпоинтУсловие
MEDIUMвысота >= 720px
SMALLвысота >= 415px
EXTRA_SMALLвысота < 415px

Помимо вёрстки по размеру экрана, важно сохранить привычное взаимодействие с интерфейсом.

Возьмём элемент, который появляется при наведении. С мышью или стилусом это оправданно, на сенсорном экране — антипаттерн. Поэтому Avatar.Overlay при точном указателе показывается по наведению, без него — всегда.

Наличие точного указателя определяет свойство hasPointer.

В CSS — через @media (pointer: fine) ↗, в JS — через hasMouse из @vkontakte/vkjs ↗.

Если нужно зафиксировать конкретные размеры, вёрстку или поведение, используйте провайдер AdaptivityProvider.

Утилиты в порядке приоритета использования:

  1. Хук useAdaptivityConditionalRender — показать или скрыть элемент по брейкпоинту.
  2. Компонент AdaptiveIconRenderer — заменить иконку на другой размер по условию compact или regular.
  3. Хук useAdaptivityWithJSMediaQueries — показать или скрыть элемент во всплывающих окнах (см. Серверный рендер | Примечание к адаптивности).

Подробнее — в отдельных документациях по каждой утилите.