Библиотека ally.js предоставляет набор инструментов для управления доступностью и фокусом элементов на веб-странице, что особенно важно при работе с динамическим содержимым и сложными интерфейсами. Она помогает обеспечить совместимость с принципами доступности (ARIA) и управлять навигацией с клавиатуры, упрощая разработку интерактивных компонентов.
Фокус — это элемент интерфейса, который в данный момент активен для взаимодействия. В стандартном HTML фокус перемещается по элементам при использовании клавиши Tab. Однако в современных SPA (Single Page Application) и динамических интерфейсах стандартное поведение часто недостаточно для обеспечения удобства и доступности.
ally.js решает следующие задачи:
1. focus() Позволяет программно
установить фокус на элемент. Может использоваться для:
ally.focus(el, { preventScroll: true });
Параметр preventScroll предотвращает прокрутку страницы
к элементу.
2. nextTabbable() и
previousTabbable() Определяют следующий или
предыдущий элемент, доступный для фокусировки с клавиатуры.
const next = ally.query.nextTabbable(currentElement);
Это полезно для кастомной навигации внутри сложных интерфейсов, например, при реализации каруселей или кастомных форм.
3. tabOrder() Возвращает массив всех
элементов в порядке их табуляции, включая скрытые, заблокированные или
disabled элементы, что позволяет анализировать доступность страницы.
const order = ally.query.tabOrder(document.body);
Механизм focus trap позволяет удерживать фокус внутри контейнера, например, внутри модального окна, предотвращая переход на элементы, находящиеся вне него. ally.js реализует это через комбинацию функций:
tabScope() — определяет, какие элементы входят в
область навигации.focusTrap() — устанавливает ловушку для фокуса:const trap = ally.trap.focus({
context: modalElement,
escapeDeactivates: true,
returnFocus: true
});
Параметры:
escapeDeactivates — возможность выхода из ловушки
клавишей Esc.returnFocus — возвращение фокуса на элемент, который
был активен до активации ловушки.ally.js предоставляет универсальный способ работы с клавиатурной навигацией:
tabbable().isFocusable() и isTabbable():if (ally.is.focusable(element)) {
ally.focus(element);
}
Динамически добавляемые элементы, такие как новые кнопки или формы, часто не учитываются стандартной навигацией. ally.js позволяет автоматически пересчитывать доступные элементы и корректно управлять фокусом после изменения DOM.
const container = document.getElementById('dynamic');
ally.query.tabbable(container).forEach(el => {
console.log(el);
});
Это особенно актуально при использовании React, Vue или других библиотек, где элементы создаются программно.
ally.js помогает соблюдать стандарты ARIA:
role,
aria-hidden).const tabbableElements = ally.query.tabbable(modalElement, { includeOnlyVisible: true });
Библиотека поддерживает события, связанные с фокусом:
focusin и focusout с расширенной
информацией о переходах фокуса.live query.ally.on.focusin(el, event => {
console.log('Фокус перемещен на элемент', event.target);
});
ally.js позволяет реализовать сложные сценарии без ручного контроля каждого события и элемента, обеспечивая при этом соответствие стандартам доступности.
Эта библиотека является мощным инструментом для любого веб-разработчика, стремящегося сделать интерфейсы доступными и удобными при навигации с клавиатуры, при этом значительно сокращая объем ручного кода для управления фокусом.