Библиотека ally.js предназначена для управления доступностью элементов интерфейса в веб-приложениях. Основная цель — упрощение работы с фокусом и навигацией с клавиатуры, что особенно важно для модальных окон, всплывающих панелей и диалогов. Ally.js обеспечивает контроль над траппингом фокуса, управлением tabindex, а также предоставляет утилиты для проверки видимости и доступности элементов.
Библиотека строится на принципах ARIA (Accessible Rich Internet Applications), что позволяет создавать интерфейсы, полностью совместимые со вспомогательными технологиями.
В модальных окнах критически важно удерживать фокус внутри диалога.
Ally.js предоставляет функцию trapFocus, которая
позволяет:
Пример использования:
import { trapFocus } from 'ally.js';
const modal = document.querySelector('#modal');
const returnFocus = trapFocus(modal);
// Открытие модального окна
modal.style.display = 'block';
returnFocus.activate(); // Начало траппинга фокуса
// Закрытие модального окна
modal.style.display = 'none';
returnFocus.deactivate(); // Возврат фокуса
Особенности:
activate() активирует траппинг.deactivate() снимает траппинг и возвращает фокус на
исходный элемент.Ally.js предоставляет утилиты для работы с атрибутом
tabindex, позволяя динамически включать и отключать
элементы из табуляции. В модальных окнах это важно для предотвращения
случайного перемещения фокуса на скрытые элементы страницы.
Пример блокировки элементов вне модального окна:
import { hideOutside } from 'ally.js';
const modal = document.querySelector('#modal');
const outsideHider = hideOutside(modal);
// Активируем скрытие элементов вне модалки
outsideHider.activate();
// Деактивация при закрытии окна
outsideHider.deactivate();
Ключевые моменты:
hideOutside скрывает интерактивные элементы вне
указанного контейнера.aria-hidden и
tabindex, чтобы восстановить их при закрытии модального
окна.Ally.js позволяет проверять, какие элементы доступны для взаимодействия:
Эти функции помогают динамически определять интерактивные элементы модального окна и управлять порядком их фокусировки.
Библиотека поддерживает конфигурацию модальных окон через параметры траппинга фокуса:
const trap = trapFocus(modal, {
escapeDeactivates: true, // закрытие по клавише Escape
clickOutsideDeactivates: true, // закрытие при клике вне модалки
initialFocus: '#modal input:first-child', // первый фокус
returnFocus: true // возврат на вызвавший элемент
});
Пояснения параметров:
escapeDeactivates — позволяет закрывать окно клавишей
Escape.clickOutsideDeactivates — делает клик вне модалки
триггером закрытия.initialFocus — элемент, который получает фокус при
открытии.returnFocus — автоматически возвращает фокус
пользователю после закрытия.Модальные окна часто содержат элементы, добавляемые после открытия. Ally.js корректно обрабатывает динамический DOM, обновляя список фокусируемых элементов. Для этого используются методы:
const focusableElements = query.focusable(modal); // обновление списка интерактивных элементов
trap.update(); // обновление траппинга после изменения DOM
Это позволяет модальным окнам оставаться доступными даже при асинхронной загрузке контента.
Ally.js облегчает соблюдение стандартов ARIA:
aria-hidden для скрытых
элементов.role="dialog",
role="alertdialog") и заголовков
(aria-labelledby, aria-describedby).Пример установки ARIA для модального окна:
modal.setAttribute('role', 'dialog');
modal.setAttribute('aria-modal', 'true');
modal.setAttribute('aria-labelledby', 'modalTitle');
modal.setAttribute('aria-describedby', 'modalDescription');
Ally.js легко интегрируется с фреймворками вроде
React, Vue, или
Angular, поскольку предоставляет простые функции для
управления фокусом и табуляцией, не вмешиваясь в жизненный цикл
компонентов. Для React часто используют хуки, оборачивая методы
trapFocus и hideOutside в эффекты
useEffect для корректной работы с виртуальным DOM.
trapFocus для модальных окон, чтобы
исключить случайное взаимодействие с фоном страницы.hideOutside, чтобы скрыть все интерактивные
элементы вне окна.initialFocus для лучшего UX и соответствия
стандартам доступности.Эта комбинация инструментов и практик позволяет создавать полностью доступные, управляемые клавиатурой модальные окна, соответствующие современным стандартам веб-разработки.