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

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

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

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

  • Какие существуют параметры адаптивности?
  • Как переопределить адаптивность — глобально и локально?
  • Как создавать собственные адаптивные интерфейсы?

Для адаптивности мы используем несколько подходов.

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

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

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

Для реализации этого подхода в библиотеке созданы два свойства sizeX и sizeY, каждый из которых принимает compact или regular. В CSS они реализованы через @media ↗, в JS через matchMedia() ↗.

Ориентирован на изменение ширины экрана.

ЗначениеУсловие
compactширина >= 768px
regularширина < 768px

Зачастую ориентирован на изменение высоты экрана, но также зависит от наличия точного указателя и ширины.

ЗначениеУсловие
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 – используйте, когда нужно показать или скрыть элемент во всплывающих окнах (см. Серверный рендер | Примечание к адаптивности).

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