Библиотека Aria-query предоставляет удобный способ
анализа и работы с ARIA-ролями, их свойствами и поведением в DOM. Одной
из ключевых особенностей является понимание того, как роли управляют
своими дочерними элементами, особенно через свойство
childrenPresentational.
childrenPresentationalchildrenPresentational — это логическое свойство роли,
которое указывает, что дочерние элементы роли не должны быть
интерпретированы как отдельные элементы ARIA. Иными словами,
при значении true потомки рассматриваются только как
визуальные или структурные компоненты, а не как самостоятельные
ARIA-элементы.
Пример использования в спецификации ARIA:
import { roles } from 'aria-query';
const buttonRole = roles.get('button');
console.log(buttonRole.childrenPresentational); // false
false — дочерние элементы могут иметь
собственные ARIA-атрибуты и роли.true — дочерние элементы
игнорируются скринридерами, основной элемент
воспринимается целиком.Основное применение childrenPresentational связано с
компонентами с декоративной разметкой:
Кнопки с иконкой Когда кнопка содержит иконку внутри, часто нет смысла объявлять иконку отдельной ARIA-ролей.
const iconButtonRole = roles.get('button');
console.log(iconButtonRole.childrenPresentational); // false
В этом случае, если иконка не несет семантики, можно обернуть её как
<span aria-hidden="true">.
Меню и панельные компоненты Для контейнеров,
которые агрегируют дочерние элементы, не требующие собственной роли,
свойство childrenPresentational: true позволяет упростить
доступность.
Каждая роль в roles содержит набор свойств:
name — имя роли.superClass — родительские роли, наследующие
поведение.props — набор ARIA-атрибутов, применимых к роли.childrenPresentational — булево значение, определяющее,
нужно ли игнорировать дочерние элементы.Пример просмотра всех ролей с активным
childrenPresentational:
import { roles } from 'aria-query';
const rolesWithChildrenHidden = Array.from(roles.entries())
.filter(([name, role]) => role.childrenPresentational)
.map(([name]) => name);
console.log(rolesWithChildrenHidden);
Это позволяет строить динамические проверки доступности и выявлять элементы, где дочерние роли не должны влиять на восприятие.
childrenPresentational напрямую влияет на модель
доступности (Accessibility Tree):
childrenPresentational: true не
создают дочерние узлы в Accessibility Tree.Пример:
<button>
<span class="icon" aria-hidden="true"></span>
Submit
</button>
Даже без явного childrenPresentational, добавление
aria-hidden="true" на дочерние элементы имитирует поведение
childrenPresentational.
propsИногда childrenPresentational комбинируется с
ARIA-свойствами:
aria-label — задает имя основного элемента.aria-labelledby — связывает с внешними элементами для
именования.aria-hidden — может переопределять поведение дочерних
элементов.const dialogRole = roles.get('dialog');
console.log(dialogRole.childrenPresentational); // true
console.log(dialogRole.props.has('aria-label')); // true
Это показывает, что даже если дочерние элементы игнорируются, сам элемент может иметь собственное имя, обеспечивая корректную доступность.
childrenPresentational для элементов
декоративного содержания или агрегирующих
контейнеров.roles.get(roleName).childrenPresentational для корректной
разметки ARIA.childrenPresentational в Aria-query позволяет создавать
интерфейсы, где доступность не нарушается сложной визуальной
структурой, и обеспечивает корректное взаимодействие с
ассистивными технологиями. Он является ключевым инструментом при
разработке ARIA-совместимых компонентов и управлении
семантикой дочерних элементов.