Клавиатурная навигация — один из ключевых элементов доступности веб-интерфейсов. Пользователи могут взаимодействовать с приложением без использования мыши по разным причинам: применение экранных считывателей, моторные ограничения, работа с альтернативными устройствами ввода, либо предпочтение быстрого управления с клавиатуры.
ARIA-атрибуты позволяют описывать интерактивные элементы так, чтобы вспомогательные технологии корректно интерпретировали структуру интерфейса. Однако сами по себе ARIA-атрибуты не реализуют логику перемещения фокуса. Для этого требуется программная обработка клавиатурных событий.
Библиотека aria-query используется для получения достоверных сведений о ролях ARIA, допустимых атрибутах и их семантике. Эти данные применяются в инструментах разработки, системах валидации доступности и в логике компонентов, реализующих корректное поведение клавиатурной навигации.
Библиотека предоставляет структурированные данные из спецификаций ARIA:
roles)elementRoles)roleElements)ariaProps)roleDefinitions)Эти структуры позволяют определить:
В контексте клавиатурной навигации библиотека используется для анализа ролей компонентов и выбора правильной модели поведения.
Установка выполняется через менеджер пакетов:
npm install aria-query
Импорт основных структур данных:
import { roles, elementRoles, roleElements, ariaProps } from "aria-query";
Каждая структура представляет собой Map, содержащую
данные спецификации.
ARIA определяет набор ролей, каждая из которых предполагает определённую модель взаимодействия с клавиатуры.
Примеры:
| Роль | Тип навигации |
|---|---|
| button | активация по Enter / Space |
| menu | стрелочная навигация |
| tablist | перемещение между вкладками |
| listbox | вертикальная навигация |
| grid | двумерная навигация |
aria-query позволяет программно получить информацию о роли и определить соответствующую модель поведения.
Получение роли:
const buttonRole = roles.get("button");
console.log(buttonRole);
Результат содержит описание роли, включая допустимые свойства и требования доступности.
Навигация с клавиатуры должна поддерживаться только для элементов, которые логически являются интерактивными.
aria-query позволяет определить, соответствует ли HTML-элемент определённой роли.
Пример проверки:
import { elementRoles } from "aria-query";
function getRolesForElement(tagName) {
const rolesSet = elementRoles.get({ name: tagName });
if (!rolesSet) return [];
return Array.from(rolesSet);
}
console.log(getRolesForElement("button"));
Полученная информация используется для определения необходимости обработки клавиатурных событий.
Фокус — центральное понятие клавиатурной навигации. Правильное управление фокусом обеспечивает предсказуемое перемещение пользователя между элементами интерфейса.
Основные правила:
TabПример перемещения фокуса:
function moveFocus(elements, currentIndex, direction) {
const nextIndex = currentIndex + direction;
if (nextIndex < 0 || nextIndex >= elements.length) {
return;
}
elements[nextIndex].focus();
}
Такая логика часто применяется в компонентах menu,
listbox, tablist.
Многие ARIA-компоненты используют стрелки клавиатуры для перемещения между элементами.
Пример реализации:
function handleArrowNavigation(event, items, currentIndex) {
switch (event.key) {
case "ArrowDown":
moveFocus(items, currentIndex, 1);
break;
case "ArrowUp":
moveFocus(items, currentIndex, -1);
break;
case "Home":
items[0].focus();
break;
case "End":
items[items.length - 1].focus();
break;
}
}
Такой механизм соответствует рекомендациям WAI-ARIA Authoring Practices.
При создании универсальных компонентов часто требуется автоматически определять роль элемента.
Пример:
function getRoleDefinition(roleName) {
return roles.get(roleName);
}
const menuRole = getRoleDefinition("menu");
console.log(menuRole.props);
Полученные данные позволяют определить допустимые состояния
(aria-expanded, aria-selected и др.).
Это особенно полезно при создании систем проектирования интерфейсов.
ARIA определяет понятие composite widget — компонент, внутри которого управление фокусом осуществляется стрелками.
Примеры:
menugridtablistlistboxВ таких компонентах используется паттерн roving tabindex.
В группе элементов только один элемент имеет
tabindex="0", остальные tabindex="-1".
Перемещение фокуса сопровождается изменением tabindex.
Пример:
function updateTabIndex(items, activeIndex) {
items.forEach((item, index) => {
item.tabIndex = index === activeIndex ? 0 : -1;
});
}
Это позволяет:
aria-query содержит информацию о допустимых свойствах для каждой роли.
Пример:
import { ariaProps } from "aria-query";
console.log(ariaProps.get("aria-expanded"));
Это позволяет валидировать состояние компонента перед обработкой клавиатурных событий.
Например, элементы с aria-expanded могут реагировать на
клавиши:
Роль tablist предполагает особые правила клавиатурной
навигации.
Стандартные клавиши:
| Клавиша | Действие |
|---|---|
| ArrowRight | следующая вкладка |
| ArrowLeft | предыдущая вкладка |
| Home | первая вкладка |
| End | последняя вкладка |
Пример обработчика:
function handleTabKey(event, tabs, currentIndex) {
if (event.key === "ArrowRight") {
moveFocus(tabs, currentIndex, 1);
}
if (event.key === "ArrowLeft") {
moveFocus(tabs, currentIndex, -1);
}
}
aria-query помогает определить, что элемент действительно имеет роль
tab, и применить соответствующие правила.
Компоненты listbox и menu используют
вертикальную навигацию.
Основные клавиши:
Пример:
function handleListNavigation(event, items, index) {
if (event.key === "ArrowDown") {
moveFocus(items, index, 1);
}
if (event.key === "ArrowUp") {
moveFocus(items, index, -1);
}
}
aria-query позволяет убедиться, что элементы списка имеют допустимую
роль option или menuitem.
Компоненты grid требуют поддержки перемещения по строкам
и колонкам.
Клавиатурные действия:
| Клавиша | Действие |
|---|---|
| ArrowRight | следующая колонка |
| ArrowLeft | предыдущая колонка |
| ArrowDown | следующая строка |
| ArrowUp | предыдущая строка |
Пример:
function moveGridFocus(grid, row, col, direction) {
const nextRow = row + direction.row;
const nextCol = col + direction.col;
const nextCell = grid[nextRow]?.[nextCol];
if (nextCell) {
nextCell.focus();
}
}
aria-query позволяет определить, что элемент имеет роль
gridcell.
Библиотека активно применяется в системах анализа доступности.
Основные задачи:
Многие инструменты линтинга используют aria-query как источник официальных данных спецификации.
Пример применения в валидаторе:
function isValidRole(roleName) {
return roles.has(roleName);
}
Это позволяет автоматически выявлять ошибки доступности на этапе разработки.
Клавиатурное поведение должно соответствовать семантике роли. Несоответствие может привести к проблемам для пользователей вспомогательных технологий.
Типичные ошибки:
div с ролью button без
обработки Enter и Spacemenutablistaria-query предоставляет структурированную модель ролей, позволяющую избежать подобных ошибок при реализации компонентов.
Интеграция этой библиотеки в систему компонентов помогает автоматически определять правила клавиатурной навигации и поддерживать соответствие стандартам доступности.