ModalPage

Компонент реализующий модальное окно. Позволяет показать дополнительный контент, удерживая пользователя в текущем контексте страницы/приложения.

Загружается...
  • Формы для редактирования.
  • Детали профиля пользователя.
  • Разделы настроек, которые должны удерживать пользователя в текущем контексте приложения.

ModalPage состоит из композиции нескольких компонентов.

Опциональные компоненты, передающиеся пользователем:

  • ModalPageHeader – передаётся через параметр header;
  • ModalPageFooter – передаётся через параметр footer.

Обязательные компоненты, задающиеся библиотекой:

  • ModalOutlet – обёртка с фиксированной позицией для перекрытия других элементов в DOM;
  • ModalOverlay – интерактивный задний фон;
  • ModalPageInternal – инкапсулирует в себе всю логику поведения;
  • ModalPageContent – оборачивает переданный children в CustomScrollView.

Параметр open задает состояние показа/скрытия ModalPage. По умолчанию компонент скрыт.

При состоянии open={false} компонент размонтируется из DOM. Чтобы отключить это поведение, необходимо задать параметр keepMounted.

Смена состояния сопровождается анимацией содержимого ModalPage, а также ModalOverlay. За сменой состояния можно следить через события:

  • onOpen
  • onOpened
  • onClose – передаёт в аргумент причину закрытия (см. описание в таблице с API)
  • onClosed

Отличие onOpened/onClosed от onOpen/onClose в том, что они вызываются после завершения анимации.

Далее поведение зависит от разрешения экрана.

При разрешении >= 768px компонент ModalPage имеет вид диалогового окна.

При open={true}:

  • параметр size будет ограничивать максимальную ширину окна;
  • навигация через Tab и Shift + Tab будет зациклена на содержимом ModalPage.

По умолчанию, пользователь может закрыть диалоговое окно с помощью:

  • нажатия на кнопку закрытия, что вызовет событие onClose с аргументом click-close-button;
  • нажатия на ModalOverlay, что вызовет событие onClose с аргументом click-overlay;
  • нажатия на Esc, что вызовет событие onClose с аргументом escape-key.

При разрешении <= 767px компонент ModalPage имеет вид панели, выдвигающейся снизу вверх (далее bottom sheet).

При open={true} навигация через Tab и Shift + Tab будет зациклена на содержимом ModalPage (допустимо, т.к. к устройству может быть подключена клавиатура).

По умолчанию, пользователь может закрыть bottom sheet с помощью:

  • нажатия на ModalOverlay, что вызовет событие onClose с аргументом click-overlay;
  • нажатия на Esc, что вызовет событие onClose с аргументом escape-key (допустимо, т.к. к устройству может быть подключена клавиатура);
  • определенного взаимодействие через тач или указатель мыши, что вызовет событие onClose с аргументом swipe-down (см. Взаимодействие через тач или указатель мыши)

Для bottom sheet можно задавать на какой процент высоты экрана изначально должна открываться панель – этот процент задаётся через параметр settlingHeight. Минимальное значение 25, а максимальное 100. По умолчанию используется 50.

От settlingHeight зависит дальнейшее поведение bottom sheet:

  • при settlingHeight <= 90 у bottom sheet появляется возможность через перетаскивание раскрывать высоту до 100 и схлопывать обратно до переданного settlingHeight;
  • при settlingHeight > 90 значение приводится к 100 и, соответственно, bottom sheet всегда раскрывается на 100.

Если необходимо, чтобы высота bottom sheet зависела от его контента, то стоит использовать параметр dynamicContentHeight, вместо settlingHeight.

В обеих случаях перетаскивание bottom sheet изменяет прозрачность ModalOverlay – при перетаскивание вниз фон становится светлее. При settlingHeight процент прозрачности высчитывается относительно переданного значения в settlingHeight.

Пользователь через перетаскивание может вызвать закрытие bottom sheet по следующим условиям:

  • onClose('swipe-down') вызовется сразу же, если bottom sheet достиг высоты 0, независимо закончил ли пользователь взаимодействие с ним или нет;

  • onClose('swipe-down') вызовется, если после окончания взаимодействия с bottom sheet его высота будет:

    • при settlingHeight: меньше половины переданного значения в settlingHeight (пример, если settlingHeight={50}, то условием закрытие будет height < 50 / 2);
    • при dynamicContentHeight: меньше половины контента;
  • onClose('swipe-down') вызовется при сильном смахивании вниз;

    • при settlingHeight: добавляется условии, что bottom sheet должен находится на высоте равной переданному в settlingHeight;

При следующих условиях возможность перетаскивания замораживается, чтобы не блокировать пользователя:

  • при условии disableContentPanningGesture={false}, есть взаимодействие с контентом ModalPageContent при scrollTop !== 0;
  • есть взаимодействие с горизонтальным скроллом;
  • есть взаимодействие с текстовым полем;
  • есть взаимодействие с выделенным текстом;
  • есть взаимодействие с элементом вызвавшим event.stopPropagation() на onTouchStart или onMouseDown.
  • есть взаимодействие с элементом с data-атрибутом data-vkui-block-sheet-behavior (в частности, используется при disableContentPanningGesture={true});

ModalPage является модальным окном (role="dialog"), а значит у него обязательно должно быть имя — его краткое название. Благодаря этому пользователи вспомогательных технологий знают, что это за элемент и какое у него содержимое.

Задать имя можно с помощью следующих способов:

  • используя свойство title;
  • используя свойство aria-label;
  • используя свойство aria-labelledby;
  • используя внутри компонент ModalPageHeader. Этот компонент сам свяжется с ModalPage через контекст c помощью aria-labelledby.

Используйте параметр size.

Используйте параметр height. Высоту можно задать как числом (height={300}) так и в процентах (height={'80%'}).

К сожалению, из-за особенностей React, autoFocus ломает CSS анимацию.

Чтобы исправить проблему, следует отказаться от autoFocus и выставлять фокус вручную при событии onOpened.

Загружается...
СвойствоОписание
disableContentPanningGestureboolean

Отключает раскрытие и закрытие панели в мобильном виде.

По умолчанию: -
disableFocusTrapboolean

Позволяет отключить захват фокуса.

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

По умолчанию: -
dynamicContentHeightboolean

Если высота контента в модальной странице может поменяться, нужно установить это свойство.

По умолчанию: -
footerReactNode

Подвал модальной страницы, <ModalPageFooter />.

По умолчанию: -
getModalContentRefRef<HTMLDivElement>

Возвращает DOM-элемент содержимого модального окна.

По умолчанию: -
getRootRefRef<HTMLDivElement>
По умолчанию: -
headerReactNode

Шапка модальной страницы, <ModalPageHeader />.

По умолчанию: -
heightstring | number

Задаёт модальному окну фиксированную высоту. Можно передать числовое значение в пикселях, а можно строкой, в том числе и в процентах “50%”. В мобильной версии ‘settlingHeight’ будет считаться относительно заданного height.

По умолчанию: -
hideCloseButtonboolean

Скрывает кнопку закрытия (актуально для iOS, так как можно отрисовать кнопку закрытия внутри модалки).

По умолчанию: -
idstring
По умолчанию: -
keepMountedboolean

Сохранять ли компонент в DOM при open={false}.

По умолчанию: false
modalContentTestIdstring

data-testid для содержимого модального окна.

По умолчанию: -
modalDismissButtonLabelstring

Текст для скринридера.

По умолчанию: -
modalDismissButtonTestIdstring

data-testid для кнопки закрытия.

По умолчанию: -
modalOverlayTestIdstring

data-testid для оверлея.

По умолчанию: -
navstring

Уникальный идентификатор навигационного элемента (вместо id)

По умолчанию: -
noFocusToDialogboolean

Отключает фокус на интерактивный элемент после открытия модалки.

По умолчанию: -
onClose((reason: ModalPageCloseReason, event?: UIEvent<HTMLElement, UIEvent>) => void) | undefined

Будет вызвано при начале закрытия модалки.

По умолчанию: -
onClosedVoidFunction

Будет вызвано при окончательном закрытии модалки.

По умолчанию: -
onOpenVoidFunction

Будет вызвано при начале открытия модалки.

По умолчанию: -
onOpenedVoidFunction

Будет вызвано при окончательном открытии модалки.

По умолчанию: -
openboolean

Состояние видимости.

По умолчанию: false
outsideButtonsReactNode

Управляющие элементы под кнопкой закрытия.

Доступно только в compact-режиме. Рекомендуется размещать иконки размера 20, обернутые в ModalOutsideButton.

По умолчанию: -
preventCloseboolean

Позволяет отключить возможность закрытия модальной страницы (смахивание, клавиша ESC, нажатие на подложку).

⚠️ ВНИМАНИЕ: использование этой опции негативно сказывается на пользовательском опыте.

По умолчанию: -
restoreFocusboolean | (() => boolean | HTMLElement)
По умолчанию: true
settlingHeightnumber

Процент, на который изначально будет открыта модальная страница.

Игнорируется при включении dynamicContentHeight.

По умолчанию: 50
sizenumber | "s" | "m" | "l"

Задаёт контенту максимальную ширину на десктопе.

По умолчанию: s
styleOmit<CSSProperties, "height" | "maxHeight" | "maxWidth">

Дополнительные стили.

По умолчанию: -