ally.js — это библиотека JavaScript, предназначенная для работы с доступностью веб-приложений. Она фокусируется на управлении фокусом, обнаружении доступных элементов и обеспечении корректной навигации с клавиатуры и вспомогательных технологий. Основной принцип библиотеки — это предоставление высокоуровневых API для управления доступностью без необходимости ручной реализации всех низкоуровневых проверок.
Библиотека строится вокруг нескольких ключевых концепций:
Основной функционал ally.js — это управление фокусом. Библиотека позволяет программно определять, какой элемент должен получать фокус, предотвращать потерю фокуса и управлять последовательностью навигации.
import { focusable, focusNext } from 'ally.js';
const elements = focusable({ context: document.body });
elements.forEach(el => {
el.addEventListener('keydown', event => {
if (event.key === 'Tab') {
focusNext({ context: document.body, includeContext: true });
event.preventDefault();
}
});
});
Ключевые моменты:
focusable() возвращает список всех элементов, которые
могут получать фокус.focusNext() перемещает фокус на следующий доступный
элемент.ally.js предоставляет методы для определения доступности элементов для различных пользователей, включая тех, кто использует клавиатуру или вспомогательные технологии.
true, если элемент может быть сфокусирован.true,
если элемент входит в последовательность табуляции.import { tabbable } from 'ally.js';
const tabbableElements = tabbable({ context: document.getElementById('form') });
console.log(tabbableElements); // Выводит все элементы формы, доступные для табуляции
Эти методы позволяют создавать динамическую логику управления доступностью, реагируя на изменения DOM или пользовательские события.
ally.js поддерживает работу с атрибутами ARIA и позволяет взаимодействовать с элементами, помеченными для вспомогательных технологий.
aria-hidden.import { ariaHidden } from 'ally.js';
const modal = document.querySelector('#modal');
ariaHidden(modal, true); // Скрывает модальное окно для вспомогательных технологий
Библиотека обеспечивает совместимость с динамически обновляемыми интерфейсами, где элементы могут появляться и исчезать, корректно изменяя состояния доступности.
ally.js предоставляет расширенные селекторы и фильтры для работы с элементами DOM:
import { query } from 'ally.js';
const visibleFocusable = query.focusable({ context: document.body })
.filter(el => query.visible(el));
Такой подход позволяет строить сложные паттерны управления фокусом и доступностью без ручного перебора элементов DOM.
Библиотека ally.js облегчает реализацию стандартных паттернов доступности:
Модальные окна (Modal Dialogs)
aria-hidden.Аккордеоны (Accordion Widgets)
aria-expanded и
aria-hidden.Меню и выпадающие списки (Menu / Dropdown)
Формы и интерактивные элементы
ally.js легко интегрируется с библиотеками React, Vue и Angular, предоставляя функционал управления фокусом через хуки и директивы.
Пример использования с React:
import { useEffect, useRef } from 'react';
import { focusFirstTabbable } from 'ally.js';
function Modal({ isOpen }) {
const modalRef = useRef();
useEffect(() => {
if (isOpen) {
focusFirstTabbable({ context: modalRef.current });
}
}, [isOpen]);
return (
<div ref={modalRef} role="dialog">
<button>Закрыть</button>
<input type="text" />
</div>
);
}
Паттерн «фокус внутри модального окна» полностью реализуется с минимальными усилиями благодаря ally.js.
focusable и
tabbable для определения элементов, доступных для
пользователя.visible() для исключения скрытых элементов.Эти практики позволяют создавать веб-приложения, полностью соответствующие требованиям доступности, с предсказуемой логикой навигации и удобством для всех категорий пользователей.