Библиотека ally.js предназначена для работы с доступностью (accessibility) веб-приложений, предоставляя инструменты для обнаружения и управления фокусом, проверки доступности элементов и взаимодействия с пользователем через клавиатуру. Она поддерживает работу с DOM на низком уровне, обеспечивая корректное управление фокусом и предотвращение ошибок при взаимодействии с элементами.
Основной подход ally.js заключается в предоставлении низкоуровневых утилит, которые можно использовать для создания собственных компонентов или проверки доступности существующих элементов. Она не ограничивает разработчика готовыми компонентами, но обеспечивает инструментарий для их построения.
Для работы с библиотекой используется пакет npm:
npm install ally.js
Подключение в модульном проекте:
import * as ally from 'ally.js';
Для проектов без сборщика можно использовать CDN:
<script src="https://cdn.jsdelivr.net/npm/ally.js/dist/ally.min.js"></script>
После подключения становится доступен глобальный объект
ally, предоставляющий все функции библиотеки.
1. Проверка видимости элементов
ally.query.focusable({ context: document.body });
Функция query.focusable возвращает все элементы, которые
могут получить фокус в указанном контексте. Важные параметры:
context — область DOM для поиска (по умолчанию
document).includeOnlyTabbable — если true, возвращаются только
элементы, доступные через клавишу Tab.strategy — алгоритм поиска (например,
'strict' или 'loose').2. Определение текущего фокуса
const focused = ally.query.focused();
Функция возвращает элемент, который в данный момент имеет фокус. Если
фокуса нет, возвращается null.
3. Перенос фокуса на элемент
ally.focus.focus({
context: document.getElementById('target'),
ignoreAutofocus: false,
});
Параметры метода позволяют гибко управлять фокусом:
context — целевой элемент.ignoreAutofocus — если true, пропускает элементы с
атрибутом autofocus.preventScroll — предотвращает прокрутку страницы при
установке фокуса.Фокусные зоны (focus zones) позволяют ограничить область, где пользователь может перемещать фокус с помощью клавиатуры. Это особенно важно для модальных окон, диалогов и всплывающих меню.
const container = document.getElementById('modal');
ally.maintain.tabFocus({
context: container
});
Параметры:
context — область, где фокус будет зацикливаться.cycle — если true, фокус после последнего элемента
возвращается к первому.handleKeydown — функция для перехвата событий
клавиатуры внутри зоны.Функция maintain.tabFocus гарантирует, что фокус не
покинет указанную область, предотвращая случайное взаимодействие с
элементами вне модального окна.
Ally.js предоставляет средства для выявления проблем с доступностью:
const violations = ally.query.not.focusable({ context: document.body });
Метод not.focusable возвращает элементы, которые должны
быть фокусируемыми, но по каким-то причинам не могут получить фокус. Это
может быть полезно для проверки форм, кнопок или интерактивных
компонентов.
Проверка видимости и доступности через функции:
is.focusable(element) — проверяет, может ли элемент
получить фокус.is.focused(element) — проверяет, находится ли элемент в
фокусе.is.tabbable(element) — проверяет, доступен ли элемент
через клавишу Tab.Библиотека позволяет строить собственные абстракции и утилиты, используя предоставленные функции. Пример: создание функции для установки фокуса на первый доступный элемент в модальном окне.
function focusFirstModalElement(modal) {
const focusableElements = ally.query.focusable({ context: modal });
if (focusableElements.length > 0) {
ally.focus.focus({ context: focusableElements[0] });
}
}
Можно создавать более сложные утилиты, объединяя проверку доступности, управление фокусом и обработку клавиатурных событий:
function trapFocusInContainer(container) {
ally.maintain.tabFocus({ context: container, cycle: true });
container.addEventListener('keydown', (event) => {
if (event.key === 'Escape') {
container.style.display = 'none';
}
});
}
Для сложных интерфейсов можно комбинировать ally.js с другими инструментами, например, с библиотеками для рендеринга компонентов или управления состоянием. Основные паттерны расширения:
context, чтобы функции не сканировали весь документ без
необходимости.cycle: true.keydown и
focus для создания логики навигации и закрытия модальных
элементов.Эти подходы позволяют создавать гибкие и расширяемые утилиты для управления доступностью и фокусом, используя низкоуровневые возможности ally.js без ограничений стандартных компонентов.