Поддержка клавиатурной навигации является важной частью доступности интерфейсов и UX. В Carbon Components Svelte каждый компонент построен с учетом ARIA-атрибутов и событий клавиатуры, что позволяет пользователям эффективно управлять элементами без использования мыши.
Фокусируемость элементов Любой интерактивный
компонент должен быть доступен через клавишу Tab. В Svelte
это достигается с помощью стандартного HTML-атрибута
tabindex и обработчиков событий on:focus и
on:blur. Компоненты Carbon автоматически выставляют
правильный tabindex для кнопок, ссылок, полей ввода и
элементов меню.
Обработка клавиш Enter и Space Для кнопок и элементов, имитирующих кнопку, важно поддерживать активацию клавишами:
<Button on:keydown={(e) => {
if (e.key === 'Enter' || e.key === ' ') {
e.preventDefault();
handleClick();
}
}}>
Подтвердить
</Button>
Здесь handleClick — функция, выполняющая действие
кнопки. Этот подход необходим для соответствия стандартам WCAG.
Навигация по спискам и меню Компоненты меню и
селекторы (Dropdown, ComboBox,
Menu) поддерживают навигацию с помощью стрелок:
ArrowDown и ArrowUp перемещают фокус по
элементам списка.Home и End переводят фокус на первый или
последний элемент.Enter или Space выбирают элемент.В Carbon Components Svelte эти события уже встроены в компоненты, но
при кастомизации необходимо использовать события on:keydown
и методы управления состоянием.
Закрытие модальных элементов клавишей Escape Для
модальных окон (Modal) или выпадающих списков важна
поддержка закрытия через клавишу Escape:
<Modal bind:open>
<div slot="content">
Контент модального окна
</div>
<svelte:window on:keydown={(e) => {
if (e.key === 'Escape') open = false;
}} />
</Modal>
Это обеспечивает быстрый доступ к выходу из модальных интерфейсов без использования мыши.
Фокус на элементе по умолчанию В диалогах и формах важно сразу устанавливать фокус на первый интерактивный элемент:
<TextInput bind:this={firstInput} />
<script>
import { onMount } from 'svelte';
let firstInput;
onMount(() => firstInput.focus());
</script>Семантическая разметка и ARIA Компоненты Carbon
используют ARIA-атрибуты для описания ролей (role="menu",
role="menuitem") и состояния (aria-expanded,
aria-selected). Это позволяет вспомогательным технологиям
корректно интерпретировать интерфейс.
Обеспечение циклической навигации В длинных
списках или меню полезно реализовать циклический фокус, чтобы
пользователь при достижении конца списка возвращался к первому элементу.
В Svelte это делается через проверку текущего индекса и манипуляцию
focus().
Навигация по табам:
<Tabs>
<Tab id="tab-1">Первый</Tab>
<Tab id="tab-2">Второй</Tab>
</Tabs>
<script>
import { Tabs, Tab } from 'carbon-components-svelte';
</script>
ArrowLeft и ArrowRight перемещают активный
таб.Tab переводит фокус внутрь панели с контентом.Выпадающий список с клавиатурной навигацией:
<Dropdown bind:selected={selectedItem} items={items} />
<script>
import { Dropdown } from 'carbon-components-svelte';
let selectedItem;
const items = ['Элемент 1', 'Элемент 2', 'Элемент 3'];
</script>
Enter или Space.ArrowUp/ArrowDown.Enter.autofocus для полей ввода: позволяет
задать элемент, который получит фокус при рендере.bind:this + focus():
динамическая установка фокуса после обновления состояния
компонента.tabindex: для скрытых или
временно неактивных элементов ставить tabindex="-1", чтобы
исключить их из последовательности табуляции.Carbon Components Svelte строятся с ориентацией на WCAG 2.1. Это означает:
:focus-visible) для всех
интерактивных элементов.Эти механизмы позволяют создавать интерфейсы, полностью управляемые с клавиатуры, без потери функциональности и доступности.
Хотите, я могу сделать отдельный раздел с наиболее частыми ошибками при настройке клавиатурной навигации в Carbon Components Svelte с примерами и их исправлением? Это сильно облегчает обучение.