← Назад к вопросам
Как должен вести себя Popup в разрезе доступности?
2.2 Middle🔥 161 комментариев
#HTML и CSS
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Как должен вести себя Popup в разрезе доступности?
Основные требования доступности для Popup
1. ARIA атрибуты
const Popup = ({ isOpen, onClose, title, children }) => (
<div
role="dialog"
aria-modal="true"
aria-labelledby="popup-title"
aria-describedby="popup-desc"
>
<h2 id="popup-title">{title}</h2>
<div id="popup-desc">{children}</div>
<button onClick={onClose}>Close</button>
</div>
);
2. Keyboard Navigation
- ESC закрывает popup
- TAB циклит через элементы внутри
- Фокус не выходит за границы popup
const handleKeyDown = (e) => {
if (e.key === "Escape") onClose();
// Focus trap для TAB
if (e.key === "Tab") {
const focusable = ref.current?.querySelectorAll(
"button, input, textarea, select"
);
// Логика циклического перемещения фокуса
}
};
3. Focus Management
- При открытии popup фокус переходит внутрь
- При закрытии фокус возвращается на кнопку открытия
- Focus должен быть виден (outline или border)
const firstFocusable = ref.current?.querySelector("button");
firstFocusable?.focus();
4. Правильная разметка
<div role="dialog" aria-modal="true">
<h2 id="title">Title</h2>
<p id="description">Description</p>
<button>OK</button>
<button>Cancel</button>
</div>
5. Backdrop
Бэкдроп не должен быть фокусируемым и должен быть невидим для скринридеров:
<div
className="backdrop"
onClick={onClose}
role="presentation"
aria-hidden="true"
/>
Использование Radix UI
Для production рекомендуется готовый компонент:
import * as Dialog from "@radix-ui/react-dialog";
<Dialog.Root>
<Dialog.Trigger>Open</Dialog.Trigger>
<Dialog.Content>
<Dialog.Title>Title</Dialog.Title>
<Dialog.Description>Description</Dialog.Description>
</Dialog.Content>
</Dialog.Root>
Чеклист доступности
- role="dialog" и aria-modal="true"
- aria-labelledby на заголовок
- aria-describedby на описание
- ESC закрывает
- Focus trapped внутри
- TAB работает правильно
- Backdrop невидим для экрана (aria-hidden)
- Контрастность текста WCAG AA
- Кнопки 44x44px минимум
- Правильная структура заголовков
Основное правило
Popup должен быть полностью управляем с клавиатуры и видим для скринридеров.