Адаптивность
В зависимости от ширины и высоты экрана, а также от наличия устройства с точным указателем (например, мышь или стилус), компоненты VKUI автоматически адаптируют свой внешний вид одним из двух способов:
- Меняют размеры на компактные или базовые (далее –
compactиregular). - Изменяют свою вёрстку и поведение.
В этой документации вы узнаете:
- Какие существуют параметры адаптивности?
- Как переопределить адаптивность — глобально и локально?
- Как создавать собственные адаптивные интерфейсы?
Параметры адаптивности
Для адаптивности мы используем несколько подходов.
| Подход | Реализация в коде |
|---|---|
| ↓ Изменение размеров интерфейса | sizeX и sizeY |
| ↓ Изменение вёрстки | viewWidth и viewHeight |
| ↓ Изменение поведения | hasPointer |
Размеры элементов интерфейса
Чтобы сделать интерфейс удобным как на настольных устройствах, так и на мобильных, большинство компонентов имеют два режима размера:
compact и regular.
compactактивируется, когда у пользователя большой экран и есть точный указатель (например, мышь). В этом режиме используются меньшие соотношения размеров, чтобы на экране помещалось больше элементов интерфейса — их не нужно прятать за меню или скрывать.regularвключается, если у пользователя ограниченная область экрана и отсутствует точный указатель (используется сенсорный экран). В этом случае элементы становятся крупнее, чтобы по ним было удобно попадать пальцем.
Для реализации этого подхода в библиотеке созданы два свойства sizeX и sizeY, каждый из которых принимает compact или
regular. В CSS они реализованы через @media ↗, в JS через
matchMedia() ↗.
sizeX
Ориентирован на изменение ширины экрана.
| Значение | Условие |
|---|---|
compact | ширина >= 768px |
regular | ширина < 768px |
sizeY
Зачастую ориентирован на изменение высоты экрана, но также зависит от наличия точного указателя и ширины.
| Значение | Условие |
|---|---|
compact | высота < 415px,или мышь / стилус и ширина >= 768px |
regular | высота >= 415px и сенсорный экран,или высота >= 415px и нет указателя,или высота >= 415px и ширина < 768px |
Размеры экрана
От размера экрана может полностью меняться вёрстка компонента, чтобы обеспечить для пользователя привычный для него интерфейс.
Например, ModalPage на мобильном экране будет выезжающей снизу верх панелью, а на настольном – диалоговым
окном по центру экрана.
Под определение размеров экрана есть два свойства viewWidth и viewHeight, значения которых являются брейкпоинтами. В CSS они
реализованы через @media ↗, в JS через
matchMedia() ↗.
viewWidth
| Брейкпоинт | Условие |
|---|---|
| DESKTOP | ширина >= 1280px |
| TABLET | ширина >= 1024px |
| SMALL_TABLET | ширина >= 768px |
| MOBILE | ширина >= 320px |
| SMALL_MOBILE | ширина < 320px |
viewHeight
| Брейкпоинт | Условие |
|---|---|
| MEDIUM | высота >= 720px |
| SMALL | высота >= 415px |
| EXTRA_SMALL | высота < 415px |
Наличие точного указателя
Помимо изменение вёрстки в зависимости от размеров экрана, важно сохранить и привычное взаимодействие с интерфейсом.
Возьмём поведение, когда элемент интерфейса должен появляться на момент наведения. Если при подключенной мышке или стилусе это поведение оправдано, то на сенсорном экране это уже антипаттерн. Поэтому, например, подкомпонент Avatar.Overlay, в зависимости от наличия устройства с точным указателем, будет показываться либо всегда, либо только по наведению.
Наличие точного указателя определяет свойство hasPointer.
hasPointer
В CSS реализовано через @media (pointer: fine) ↗, а в JS через
hasMouse из @vkontakte/vkjs ↗
Переопределение адаптивности
Если есть необходимость всегда иметь конкретные размеры, вёрстку или поведение, то есть возможность зафиксировать параметры на
конкретных условиях. Это можно сделать с помощью провайдера AdaptivityProvider.
- см. AdaptivityProvider | Глобальное переопределение
- см. AdaptivityProvider | Локальное переопределение
Утилиты для создания адаптивных интерфейсов
Есть следующие утилиты, перечисленные по приоритету использования:
- Хук
useAdaptivityConditionalRender– используйте, когда нужно показать или скрыть элемент интерфейса по брейкпоинту. - Компонент
AdaptiveIconRenderer– используйте когда нужно заменить иконку на другой размер по условиюcompactилиregular. - Хук
useAdaptivityWithJSMediaQueries– используйте, когда нужно показать или скрыть элемент во всплывающих окнах (см. Серверный рендер | Примечание к адаптивности).
Подробнее читайте в отдельных документациях по каждой из утилит.