Управление фокусом и клавиатурные ловушки в модальных окнах
Удерживайте фокус внутри открытых модальных окон для доступности с помощью useRef и обработчиков событий
«Управление фокусом и клавиатурные ловушки в модальных окнах» — бесплатный урок React Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.
Добро пожаловать
Зачем нужны ловушки фокуса
Что такое ловушка фокуса
Поиск элементов, доступных для фокуса
const FOCUSABLE = [
'a[href]', 'button:not([disabled])',
'input:not([disabled])', 'select', 'textarea',
'[tabindex]:not([tabindex="-1"])'
].join(',');
const focusable = Array.from(
modalRef.current.querySelectorAll(FOCUSABLE)
);Реализация ловушки
function handleTab(e) {
const focusable = /* array of focusable elements */;
const first = focusable[0];
const last = focusable[focusable.length - 1];
if (e.key !== 'Tab') return;
if (e.shiftKey) {
if (document.activeElement === first) {
e.preventDefault(); last.focus();
}
} else {
if (document.activeElement === last) {
e.preventDefault(); first.focus();
}
}
}Перемещение фокуса при открытии
useEffect(() => {
if (isOpen) {
const first = modalRef.current?.querySelector(FOCUSABLE);
first?.focus();
}
}, [isOpen]);Восстановление фокуса при закрытии
const previousFocus = useRef(null);
useEffect(() => {
if (isOpen) {
previousFocus.current = document.activeElement;
} else {
previousFocus.current?.focus();
}
}, [isOpen]);Использование библиотеки focus-trap-react
import FocusTrap from 'focus-trap-react';
{isOpen && (
<FocusTrap>
<div role="dialog" aria-modal="true">
{children}
</div>
</FocusTrap>
)}Атрибуты ARIA для модальных окон
<div
role="dialog"
aria-modal="true"
aria-labelledby="modal-title"
>
<h2 id="modal-title">Confirm Delete</h2>
...
</div>Атрибут inert для фона
useEffect(() => {
const root = document.getElementById('root');
if (isOpen) root.setAttribute('inert', '');
else root.removeAttribute('inert');
}, [isOpen]);Быстрая проверка
Итоги
Далее
Часто задаваемые вопросы
Урок «Управление фокусом и клавиатурные ловушки в модальных окнах» бесплатный?
Да — полный текст урока «Управление фокусом и клавиатурные ловушки в модальных окнах» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.
Чему я научусь в уроке «Управление фокусом и клавиатурные ловушки в модальных окнах»?
Удерживайте фокус внутри открытых модальных окон для доступности с помощью useRef и обработчиков событий Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать React Academy?
Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Управление фокусом и клавиатурные ловушки в модальных окнах»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке React Academy?
Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Что такое React Portals
- Создание модального компонента с порталами
- Управление фокусом и клавиатурные ловушки в модальных окнах
- Всплывающие подсказки и раскрывающиеся меню с порталами