Библиотека Focus-trap предназначена для управления
фокусом внутри заданного контейнера. Основная задача — удерживать
клавиатурный фокус в пределах определённой области, например, модальных
окон, всплывающих меню или интерактивных компонентов. В некоторых
случаях требуется, чтобы отдельные элементы внутри контейнера
игнорировались при циклировании фокуса. Для этого
используется возможность работы с data-атрибутами.
data-focus-trap-ignoreFocus-trap поддерживает специальный атрибут:
<button data-focus-trap-ignore>Игнорируемая кнопка</button>
Элементы с этим атрибутом не будут включены в цикл фокуса. Это означает:
Tab при переходе не остановится на этом
элементе.Shift + Tab также пропустит элемент.Важно: атрибут работает только внутри контейнера, на который активирован trap.
<div id="modal" class="modal">
<button class="modal-close" data-focus-trap-ignore>×</button>
<input type="text" placeholder="Имя">
<input type="text" placeholder="Email">
<button>Отправить</button>
</div>
import { createFocusTrap } from 'focus-trap';
const modal = document.getElementById('modal');
const trap = createFocusTrap(modal, {
escapeDeactivates: true
});
trap.activate();
В этом примере кнопка закрытия не участвует в цикле
фокуса, что позволяет пользователю использовать клавиши Tab
исключительно для полей формы и кнопки отправки.
Можно назначить data-focus-trap-ignore сразу нескольким
элементам:
<input type="checkbox" data-focus-trap-ignore>
<a href="#" data-focus-trap-ignore>Ссылка вне фокуса</a>
Focus-trap корректно обрабатывает список всех игнорируемых элементов, обеспечивая непрерывность фокусировки остальных интерактивных компонентов.
Помимо прямого data-focus-trap-ignore, Focus-trap
позволяет задать селектор для игнорирования элементов в
конфигурации:
const trap = createFocusTrap(modal, {
escapeDeactivates: true,
allowOutsideClick: true,
tabbableOptions: {
displayCheck: 'none', // игнорировать скрытые элементы
},
initialFocus: '#modal input:first-child',
ignoreSelector: '[data-focus-trap-ignore]' // кастомный селектор
});
Преимущества такого подхода:
data-focus-trap-ignore.autofocus, Focus-trap не активирует его
автоматически.data-focus-trap-ignore корректно сочетается с:
initialFocus — игнорируемые элементы
не будут автоматически получать фокус.clickOutsideDeactivates — клик по
игнорируемому элементу можно обработать отдельно, не нарушая trap.returnFocusOnDeactivate — после
деактивации trap фокус вернётся к исходному элементу, минуя игнорируемые
элементы.Использование data-focus-trap-ignore обеспечивает
точное управление фокусом, улучшая UX интерактивных
компонентов и предотвращая случайные остановки на ненужных элементах.
Такой подход особенно полезен для сложных интерфейсов с модальными
окнами, всплывающими подсказками и кастомными формами.