Библиотека aria-query предназначена для анализа и
проверки соответствия HTML-элементов спецификации ARIA (Accessible Rich
Internet Applications). Она предоставляет структурированные данные о
ARIA-ролях, состояниях и
атрибутах, позволяя разработчику создавать доступные
веб-интерфейсы и проверять корректность разметки.
aria-query эксплуатирует две основные концепции:
Роли в ARIA делятся на структурные и
видовые. Структурные роли, например list
или table, определяют каркас интерфейса, а видовые
(button, link) описывают элементы с конкретным
поведением.
В aria-query роли представлены объектом с ключами:
import { roles } from 'aria-query';
console.log(roles.get('button'));
Каждая запись роли содержит следующие свойства:
abstract — флаг, указывающий на абстрактную роль,
которую нельзя использовать напрямую в HTML.baseConcepts — массив базовых HTML-элементов, с
которыми соотносится роль.requiredProps — обязательные свойства ARIA, которые
должны присутствовать на элементе.props — дополнительные поддерживаемые свойства.Пример структуры роли button:
{
abstract: false,
baseConcepts: [{ name: 'button', attributes: [] }],
requiredProps: {},
props: { 'aria-expanded': null, 'aria-pressed': null }
}
Основная ошибка при работе с ARIA — неправильное назначение
роли элементу, которое нарушает семантику интерфейса и ухудшает
доступность. В aria-query это легко проверить, используя
сопоставление роли с базовыми элементами.
<span role="button">Кликни меня</span>
Хотя HTML-элемент span сам по себе не интерактивен,
назначение ему роли button требует реализации
соответствующего поведения через JavaScript (click,
keydown), иначе элемент станет недоступным для клавиатурной
навигации.
roles.get('command'); // abstract: true
Абстрактные роли, такие как command или
range, нельзя использовать в HTML. Их задача — служить
основой для других ролей. Прямое применение ведет к нарушению
ARIA-спецификации.
Некоторые роли можно применять только к определенным тегам. Например:
<div role="table">
<div role="row">
<div role="cell">Ячейка</div>
</div>
</div>
Теоретически разметка верная, но элемент div не
поддерживает некоторые особенности таблицы, такие как
caption или thead. В aria-query
через baseConcepts можно проверять совместимость:
const tableRole = roles.get('table');
console.log(tableRole.baseConcepts); // [{ name: 'table', attributes: [] }]
Если базовый элемент не совпадает с рекомендованным, использование роли считается потенциально неправильным.
Библиотека предоставляет методы для анализа разметки на соответствие спецификации:
roles.has('button'); // true
roles.has('nonexistent'); // false
const role = roles.get('menu');
console.log(role.abstract); // true/false
const cellRole = roles.get('cell');
console.log(cellRole.baseConcepts); // [{ name: 'td', attributes: [] }]
Используя эти данные, можно построить валидатор, который проверяет:
aria-query активно используется совместно с
eslint-plugin-jsx-a11y и другими статическими
анализаторами. Это позволяет автоматически предупреждать разработчиков
о:
Пример использования с ESLint:
// .eslintrc.js
module.exports = {
plugins: ['jsx-a11y'],
rules: {
'jsx-a11y/role-has-required-aria-props': 'error',
'jsx-a11y/role-supports-aria-props': 'error'
}
};
baseConcepts из aria-query.props для установки
ARIA-атрибутов, соответствующих роли.aria-query для предотвращения нарушений доступности.aria-query обеспечивает точную и структурированную
информацию о ролях ARIA, что позволяет предотвращать ошибки семантики и
создавать веб-интерфейсы, доступные для всех пользователей. Корректное
использование ролей критично для соответствия стандартам доступности и
корректного взаимодействия с вспомогательными технологиями.