ally.js — это библиотека для обеспечения доступности веб-приложений, ориентированная на управление фокусом, поддержку клавиатурной навигации и улучшение взаимодействия с ассистивными технологиями. Она предоставляет низкоуровневые и высокоуровневые API для работы с элементами страницы, проверкой их доступности и динамическим управлением фокусом.
Фокусировка — центральная концепция ally.js. Библиотека позволяет:
isFocusable(element)).focus(element, options)), включая поддержку вложенных и
скрытых элементов.Особенности:
iframe и Shadow DOM.Пример использования проверки фокусируемости:
import { isFocusable } from 'ally.js';
const button = document.querySelector('button');
if (isFocusable(button)) {
console.log('Элемент доступен для фокуса');
}
ally.js предоставляет функции для работы с клавишами и навигацией внутри компонента или всего документа:
tabNext и tabPrevious для перемещения
фокуса между элементами по порядку.tabindex.import { tabNext } from 'ally.js';
tabNext({ context: document.querySelector('.modal') });
Эта функциональность позволяет создавать полнофункциональные клавиатурные интерфейсы, соответствующие стандартам WCAG.
ally.js облегчает проверку и управление ARIA-атрибутами:
getRole(element) возвращает текущую роль элемента.getState(element, stateName) проверяет состояние ARIA
(например, aria-expanded).import { getRole, getState } from 'ally.js';
const menu = document.querySelector('#menu');
console.log(getRole(menu)); // "menu"
console.log(getState(menu, 'expanded')); // true или false
Это позволяет динамически управлять доступностью интерфейсов для скринридеров.
ally.js предоставляет средства для анализа структуры DOM и выявления потенциальных проблем:
query.tabOrder() — возвращает список всех фокусируемых
элементов в порядке навигации.query.focusable() — возвращает только доступные для
фокуса элементы.query.maintainFocus() — защищает фокус внутри
контейнера, предотвращая его потерю.Эти функции позволяют строить интерактивные компоненты, которые автоматически соответствуют правилам доступности.
Динамически создаваемые элементы требуют дополнительного контроля:
MutationObserver для отслеживания вставки,
удаления или изменения видимости элементов.import { maintainFocus } from 'ally.js';
const modal = document.querySelector('.modal');
maintainFocus({ context: modal });
Это гарантирует, что пользователь не потеряет фокус при взаимодействии с динамическим контентом.
Библиотека разделена на несколько модулей:
Преимущества модульной архитектуры:
ally.js легко интегрируется с React, Vue и другими библиотеками:
Пример интеграции с React:
import { useEffect, useRef } from 'react';
import { focus } from 'ally.js';
function Modal({ isOpen }) {
const modalRef = useRef(null);
useEffect(() => {
if (isOpen && modalRef.current) {
focus(modalRef.current);
}
}, [isOpen]);
return <div ref={modalRef} className="modal">Контент модального окна</div>;
}
ally.js полностью ориентирована на соответствие стандартам WCAG 2.1 и ARIA:
Эта строгая приверженность стандартам делает библиотеку надёжным инструментом для создания доступных веб-приложений.