ARIA (Accessible Rich Internet Applications) — это набор атрибутов, который позволяет сделать веб-приложения доступными для пользователей с ограниченными возможностями. В контексте фреймворка Inferno использование ARIA требует понимания как стандартного HTML-поведения, так и специфики виртуального DOM.
В Inferno компоненты создаются с помощью JSX. Любой стандартный HTML-атрибут можно передать через свойства компонента. ARIA-атрибуты не являются исключением. Важно соблюдать правильную нотацию: в JSX имена атрибутов пишутся в camelCase, а не через дефис, с некоторыми исключениями для специфических ARIA-атрибутов, которые остаются в kebab-case.
Пример использования ARIA-атрибутов в JSX-компоненте:
import { render } from 'inferno';
import { Component } from 'inferno-component';
class Button extends Component {
render() {
return (
<button
aria-label="Закрыть окно"
aria-pressed={false}
onCl ick={this.props.onClick}
>
Закрыть
</button>
);
}
}
render(<Button onCl ick={() => console.log('clicked')} />, document.getElementById('app'));
В этом примере:
aria-label задаёт текстовую альтернативу для экранных
читалок.aria-pressed отражает состояние кнопки как логический
атрибут, что полезно для кнопок-переключателей.Один из ключевых аспектов доступности — корректная реакция на изменения состояния компонента. В Inferno виртуальный DOM обеспечивает эффективное обновление атрибутов при изменении состояния:
class Toggle extends Component {
constructor(props) {
super(props);
this.state = { active: false };
}
toggleState = () => {
this.setState({ active: !this.state.active });
};
render() {
return (
<button
aria-pressed={this.state.active}
onCl ick={this.toggleState}
>
{this.state.active ? 'Включено' : 'Выключено'}
</button>
);
}
}
Здесь aria-pressed автоматически обновляется при
изменении состояния active, что делает компонент полностью
совместимым с технологиями вспомогательного доступа.
Роли ARIA (role) используются для определения типа
интерактивного элемента. Inferno позволяет напрямую назначать роли как
JSX-атрибуты:
<div role="alert">
Произошла ошибка при загрузке данных
</div>
Роли могут комбинироваться с другими ARIA-атрибутами, например
aria-live:
<div role="status" aria-live="polite">
Статус обновлен
</div>
Такой подход гарантирует корректное оповещение экранных читалок о динамических изменениях интерфейса.
В Inferno кастомные компоненты могут принимать любые props и передавать их на корневой элемент. Для ARIA это означает возможность создавать универсальные, доступные обёртки:
const AccessibleCard = ({ label, children, ...props }) => (
<div role="region" aria-label={label} {...props}>
{children}
</div>
);
render(
<AccessibleCard label="Карточка профиля">
<p>Имя пользователя: Иван</p>
</AccessibleCard>,
document.getElementById('app')
);
Использование spread-оператора ...props позволяет гибко
добавлять новые ARIA-атрибуты без изменения компонента.
true/false), Inferno автоматически
преобразует их в строку "true" или "false" в
HTML.aria-label или aria-describedby сохраняется
исходная запись через дефис.aria-pressed, чекбоксы —
aria-checked.aria-live с подходящим уровнем приоритета
(polite или assertive).role) и текстовые альтернативы (aria-label
или aria-labelledby).ARIA особенно полезна для сложных интерфейсов: меню, вкладок,
аккордеонов, таблиц. В Inferno управление состоянием позволяет легко
поддерживать атрибуты aria-selected,
aria-expanded, aria-hidden:
class Accordion extends Component {
constructor(props) {
super(props);
this.state = { open: false };
}
toggle = () => this.setState({ open: !this.state.open });
render() {
return (
<div>
<button
aria-expanded={this.state.open}
onCl ick={this.toggle}
>
Развернуть
</button>
<div aria-hidden={!this.state.open}>
Содержимое аккордеона
</div>
</div>
);
}
}
Применение ARIA в таких компонентах обеспечивает корректное взаимодействие с экранными читалками и другими вспомогательными технологиями.