FocusTrap

Компонент для управления фокусом, который зацикливает навигацию через Tab и Shift + Tab внутри определённой области. Используется для обеспечения доступности модальных окон, диалогов, всплывающих меню и других интерактивных элементов.

Загружается...

FocusTrap — это вспомогательный компонент, который:

  • Зацикливает фокус — при нажатии Tab на последнем интерактивном элементе фокус переходит на первый, а при Shift + Tab на первом — на последний;
  • Автоматически устанавливает фокус — при появлении области может автоматически установить фокус на первый интерактивный элемент или на корневой элемент;
  • Восстанавливает фокус — при закрытии области возвращает фокус на элемент, который был в фокусе до открытия.

FocusTrap широко используется внутри VKUI для компонентов модальных окон и всплывающих элементов:

Для использования FocusTrap необходимо:

  1. Создать ref для корневого элемента области;
  2. Передать этот ref в свойство rootRef компонента FocusTrap;
  3. Передать этот же ref на корневой элемент контента;
  4. Добавить tabIndex={-1} на корневой элемент для возможности программной фокусировки.
Загружается...

Свойство autoFocus управляет поведением автоматической установки фокуса при появлении области.

Фокус автоматически устанавливается на первый интерактивный элемент внутри области.

Фокус устанавливается на корневой элемент области. Это полезно, когда нужно анонсировать содержимое области для скринридеров, но не переключать фокус на конкретный элемент.

Загружается...

Автофокус отключён. Используйте, когда фокус уже находится внутри области или управляется вручную.

Свойство restoreFocus управляет возвратом фокуса на предыдущий элемент при закрытии области.

  • true (по умолчанию) — фокус возвращается на элемент, который был в фокусе до открытия области;
  • false — фокус не возвращается;
  • () => boolean | HTMLElement — функция, которая возвращает boolean или конкретный элемент для фокуса.
Загружается...

Свойство disabled позволяет временно отключить захват фокуса.

Загружается...

Свойство autoFocusDelay позволяет задать задержку в миллисекундах перед автофокусом. Это полезно при использовании с анимациями, когда нужно дождаться завершения анимации появления.

<FocusTrap rootRef={focusTrapRef} autoFocusDelay={300}>
  {/* ... */}
</FocusTrap>
  • Модальные окна и диалоги — фокус должен оставаться внутри модального окна, пока оно открыто;
  • Всплывающие меню — пользователь должен иметь возможность навигироваться по пунктам меню с помощью клавиатуры;
  • Формы в выпадающих панелях — например, календарь в DateInput.
  • Для обычных секций страницы — захват фокуса не нужен для стандартной навигации;
  • Для тултипов с текстовым содержимым — если тултип не содержит интерактивных элементов, используйте свойство disableFocusTrap в компонентах типа Tooltip.

При использовании FocusTrap для модальных окон не забывайте:

  1. Добавлять role="dialog" и aria-modal="true" на корневой элемент;
  2. Указывать aria-label или aria-labelledby для описания содержимого;
  3. Обеспечивать закрытие по клавише Escape.
<FocusTrap rootRef={focusTrapRef}>
  <div
    ref={focusTrapRef}
    tabIndex={-1}
    role="dialog"
    aria-modal="true"
    aria-label="Название диалога"
  >
    {/* Содержимое */}
  </div>
</FocusTrap>
СвойствоОписание
autoFocusboolean | "root"

Управление поведением автофокуса при появлении всплывающего окна. При прокидывании true фокус будет установлен на первый элемент. При прокидывании root фокус будет установлен в корень.

По умолчанию: true
autoFocusDelaynumber

Время в миллисекундах после которого срабатывает автофокус при появлении всплывающего окна.

По умолчанию: 0
disabledboolean

Форсированное отключение захвата фокуса

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

Управление поведением возврата фокуса при закрытии всплывающего окна.

По умолчанию: true
rootRefRefObject<HTMLElement | null>

Ref на корневой элемент.

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