Mithril — это современный клиентский JavaScript-фреймворк, ориентированный на создание быстрых и минималистичных одностраничных приложений. Одной из ключевых задач при разработке интерфейсов является обеспечение доступности (accessibility). ARIA (Accessible Rich Internet Applications) предоставляет стандарт для улучшения взаимодействия пользователей с веб-приложениями, особенно для тех, кто использует вспомогательные технологии: экранные читалки, голосовые команды и т.п.
ARIA роли (role) определяют тип
элемента интерфейса, например, кнопку, диалог, навигационное меню. Они
помогают вспомогательным технологиям корректно интерпретировать
назначение элемента:
m("button", { role: "button" }, "Отправить")
В данном примере роль button повторяет стандартное
назначение HTML-кнопки, что полезно при кастомных элементах, которые
визуально выглядят как кнопка, но не используют
<button>.
ARIA атрибуты уточняют состояние элемента или его свойства:
aria-label — текстовое описание элемента.aria-labelledby — связывает элемент с другим,
содержащим текстовую метку.aria-hidden — скрывает элемент от вспомогательных
технологий.aria-expanded — состояние раскрытия панели, меню,
аккордеона.aria-checked — состояние выбора, актуально для
чекбоксов и радиокнопок.Пример использования атрибутов:
m("div", {
role: "dialog",
"aria-labelledby": "dialogTitle",
"aria-describedby": "dialogDesc",
"aria-hidden": "false"
}, [
m("h2", { id: "dialogTitle" }, "Заголовок диалога"),
m("p", { id: "dialogDesc" }, "Описание содержимого диалога")
])
В Mithril часто используются компоненты с динамическим состоянием. ARIA атрибуты позволяют корректно передавать изменения состояния элементам интерфейса.
Пример аккордеона:
const AccordionItem = {
view: ({ attrs, state }) => {
const expanded = state.expanded || false;
return m("div", [
m("button", {
role: "button",
"aria-expanded": expanded,
onclick: () => state.expanded = !expanded
}, attrs.title),
m("div", {
role: "region",
"aria-hidden": !expanded
}, expanded ? attrs.content : null)
]);
}
};
Здесь атрибут aria-expanded динамически меняется при
клике, а aria-hidden контролирует доступность содержимого
для экранных читалок.
Некоторые ключевые ARIA роли, часто используемые в SPA:
button — интерактивная кнопка.link — ссылка.menu, menuitem — элементы навигационного
меню.dialog — модальные окна, всплывающие диалоги.tablist, tab, tabpanel — табы
и панели вкладок.alert — динамические уведомления, которые должны быть
прочитаны сразу.Использование этих ролей вместе с атрибутами позволяет создавать полностью доступные компоненты без изменения визуальной структуры.
aria-label или aria-labelledby.Mithril облегчает интеграцию ARIA через простой синтаксис объектов атрибутов. Любой компонент можно сделать доступным, добавив соответствующие роли и атрибуты. Это особенно важно для кастомных элементов, где стандартная семантика HTML не подходит.
Пример кастомной кнопки с ARIA:
const AccessibleButton = {
view: ({ attrs }) => {
return m("div", {
role: "button",
tabindex: 0,
"aria-label": attrs.label,
onclick: attrs.onclick,
onkeypress: e => { if(e.key === "Enter") attrs.onclick() }
}, attrs.label);
}
};
В этом примере добавлены tabindex и обработка
Enter, что делает div полностью функциональной
и доступной кнопкой.
ARIA в Mithril позволяет создавать компоненты, которые не только красивы и интерактивны, но и доступны для всех пользователей, что критически важно в современных веб-приложениях. Правильное использование ролей и атрибутов обеспечивает совместимость с широким спектром устройств и технологий.