Библиотека Aria-query представляет собой мощный инструмент для работы с ARIA-ролями в контексте веб-разработки и доступности. Основной строительный блок библиотеки — объект роли, который содержит подробную информацию о поведении, свойствах и допустимых дочерних элементах роли. Понимание структуры этого объекта критично для правильного применения ARIA-атрибутов и построения доступного интерфейса.
Каждая роль в Aria-query описывается объектом с набором ключевых полей. Среди них:
abstract — булевое значение,
указывающее, является ли роль абстрактной. Абстрактные роли не
применяются напрямую к элементам DOM, они служат основой для создания
других ролей. Например, роль "widget" является
абстрактной.
baseConcepts — массив объектов,
описывающих базовые концепции роли. Каждая базовая концепция
содержит:
concept — ссылка на элемент HTML или
другую роль, с которой связана данная роль.attributes — объект с атрибутами,
которые по умолчанию применяются к базовой концепции.Пример:
baseConcepts: [
{ concept: 'button', attributes: {} }
]props — объект, в котором
перечислены все свойства (ARIA-атрибуты), применимые к роли. Ключи
объекта соответствуют именам свойств, а значения описывают тип значения
и возможность наследования. Например:
props: {
'aria-checked': { type: 'tristate', required: false },
'aria-disabled': { type: 'boolean', required: false }
}childrenPresentational — булевое
значение, указывающее, можно ли роль считать
презентационной, игнорируя дочерние элементы при
рендеринге для вспомогательных технологий. Часто используется для
контейнеров без интерактивного содержания.
superClass — массив объектов,
описывающих иерархию ролей, от которых текущая роль наследует свойства и
ограничения. Каждый объект содержит:
role — имя родительской ролиabstract — информация о том, является
ли родительская роль абстрактной.Пример:
superClass: [
{ role: 'widget', abstract: true }
]requiredContextRole — массив ролей,
которые должны присутствовать в контексте DOM, чтобы текущая роль была
корректной. Это помогает поддерживать правильную семантическую
структуру. Например, "listitem" требует "list"
или "group" в качестве контейнера.
supportedStates и
supportedProps — детализируют
ARIA-состояния и свойства, которые роль может поддерживать.
supportedStates включает такие состояния
как aria-expanded, aria-selected, а
supportedProps — свойства вроде
aria-label, aria-labelledby.
Ария-ролями можно управлять напрямую через атрибуты HTML, однако Aria-query позволяет программно получать полную информацию о роли:
import { roles } from 'aria-query';
const buttonRole = roles.get('button');
console.log(buttonRole.abstract); // false
console.log(buttonRole.props);
// { 'aria-pressed': { type: 'tristate', required: false }, ... }
Такой подход упрощает проверку соответствия элементов ARIA-ролям и позволяет строить валидаторы доступности.
Объект роли поддерживает наследование свойств через
superClass, что важно для создания иерархии ролей. Если
дочерняя роль наследует родительскую, она автоматически получает все
допустимые состояния и свойства родителя, что уменьшает повторение кода
и предотвращает ошибки при назначении ARIA-атрибутов.
Каждая роль может иметь контекстные ограничения,
указанные в requiredContextRole или
requiredOwnedElements. Это гарантирует корректное вложение
элементов:
requiredContextRole — роли, которые
должны быть в иерархии выше текущего элемента.requiredOwnedElements — роли, которые
должны быть у элементов-дочерних элементов. Например,
"menu" должен содержать "menuitem".Ария-объекты позволяют строить автоматизированные проверки доступности. Основные шаги:
roles.get('roleName')).props на наличие обязательных атрибутов.requiredContextRole и
requiredOwnedElements на соответствие DOM-структуре.superClass.function validateRole(element, roleName) {
const role = roles.get(roleName);
if (role.abstract) return false;
// Проверка обязательных контекстов
const contextRoles = role.requiredContextRole || [];
// Логика проверки DOM-родителя
}
function defaultProps(roleName) {
const role = roles.get(roleName);
const props = {};
Object.keys(role.props).forEach(key => {
props[key] = null; // или дефолтное значение, если определено
});
return props;
}
Такая детализация структуры объекта роли обеспечивает точное управление ARIA-атрибутами, соблюдение стандартов доступности и упрощает разработку сложных пользовательских интерфейсов.