Библиотека Aria-query предназначена для программного анализа и работы с ARIA-ролями и свойствами в веб-разработке. Она предоставляет структурированные данные о ARIA-ролях, атрибутах и их взаимосвязях, что позволяет создавать инструменты проверки доступности, валидаторы и динамически управлять поведением интерфейсов.
Aria-query строится вокруг трёх ключевых понятий: roles, attributes и element-role mappings. Каждое из них имеет подробную структуру и взаимозависимости.
Каждая ARIA-роль описывается объектом с набором стандартных свойств:
props содержат не только тип атрибута, но и правила его использования: допустимые значения, тип данных и возможные комбинации с другими атрибутами.
Пример объекта роли:
{
name: "button",
abstract: false,
superClass: ["widget"],
requiredProps: [],
props: {
"aria-pressed": { type: "tristate", values: [true, false, "mixed"] }
}
}
Здесь роль button наследует свойства от
widget и может дополнительно использовать атрибут
aria-pressed с тремя допустимыми значениями.
Дополнительные атрибуты props важны для правильной
интерпретации интерфейсов вспомогательными технологиями. В Aria-query
они учитываются через объект attributes:
aria-label,
aria-hidden, aria-checked);Использование:
const { attributes } = require('aria-query');
const ariaLabel = attributes.get('aria-label');
console.log(ariaLabel.type); // string
Таким образом, каждый дополнительный атрибут можно получить и проверить на соответствие типу и правилам ARIA.
Каждому HTML-элементу соответствует набор возможных ролей и
атрибутов. Aria-query хранит это в виде elementRoleMap,
где:
div, button,
ul);Дополнительные атрибуты, указанные в props, проверяются
на соответствие элементу и роли. Например, для div с ролью
button можно использовать aria-pressed, а для
input type="checkbox" — aria-checked.
Пример проверки:
const { elementRoleMap, roles } = require('aria-query');
const divRoles = elementRoleMap.get('div');
if (divRoles.has('button')) {
const buttonProps = roles.get('button').props;
console.log(buttonProps['aria-pressed']); // { type: "tristate", values: [true, false, "mixed"] }
}
Роли могут наследовать дополнительные атрибуты от superClass. При проверке интерфейса важно учитывать:
aria-labelledby при отсутствии
aria-label).Пример получения всех доступных атрибутов роли с учетом наследования:
function getAllProps(roleName) {
const role = roles.get(roleName);
let allProps = { ...role.props };
role.superClass.forEach(superRoleName => {
const superProps = getAllProps(superRoleName);
allProps = { ...superProps, ...allProps };
});
return allProps;
}
const buttonAllProps = getAllProps('button');
console.log(buttonAllProps);
Для валидации интерфейса используются методы, которые:
Пример функции проверки:
function validateProps(roleName, propsToCheck) {
const allProps = getAllProps(roleName);
for (const [prop, value] of Object.entries(propsToCheck)) {
if (!allProps[prop]) {
console.warn(`${prop} не допустим для роли ${roleName}`);
} else if (allProps[prop].values && !allProps[prop].values.includes(value)) {
console.warn(`${prop} имеет недопустимое значение: ${value}`);
}
}
}
validateProps('button', { 'aria-pressed': 'mixed', 'aria-hidden': true });
Эта проверка позволяет гарантировать корректное использование ARIA-атрибутов, включая дополнительные свойства, которые не обязательны, но повышают доступность интерфейса.
props для динамических
интерфейсов, где состояние ролей может меняться.elementRoleMap и
roles, чтобы исключить некорректные комбинации
элементов и атрибутов.Aria-query обеспечивает детальный учет дополнительных атрибутов, позволяя создавать динамические, проверяемые и полностью доступные веб-интерфейсы.