ARIA (Accessible Rich Internet Applications) атрибуты предназначены для обеспечения доступности веб-приложений. В контексте SvelteKit их использование особенно важно при создании интерактивных компонентов, таких как модальные окна, табы, аккордеоны, выпадающие списки и динамические формы.
В SvelteKit UI библиотеках компоненты могут быть построены с учетом ARIA с двух ключевых задач: сообщить вспомогательным технологиям о роли элемента и обеспечить правильное состояние элемента.
ARIA-атрибуты включают в себя role, которые определяют семантическую роль элемента. Основные роли для UI компонентов:
button — кнопка, инициирующая действие.dialog — модальное окно, которое может требовать
фокусировки и управления клавиатурой.tablist — контейнер для группы вкладок, содержит
вкладки (tab) и панели (tabpanel).menu и menuitem — элементы навигационного
меню.listbox и option — элементы выпадающих
списков.Пример применения в SvelteKit:
<button role="button" aria-pressed={isActive} on:click={toggle}>
{isActive ? 'Включено' : 'Выключено'}
</button>
Здесь aria-pressed сообщает вспомогательным технологиям
текущее состояние кнопки.
ARIA-атрибуты состояния (aria-*) позволяют динамически
обновлять информацию о компонентах:
aria-expanded — показывает, раскрыт ли элемент,
например, аккордеон или выпадающее меню.aria-hidden — скрывает или показывает элемент для
скринридеров.aria-disabled — информирует о недоступности
компонента.aria-selected — используется для выбора элементов в
списках или табах.Пример использования с динамическим состоянием:
<div role="menu" aria-hidden={!isOpen}>
<div role="menuitem" tabindex={isOpen ? 0 : -1} on:click={selectItem}>
Пункт меню 1
</div>
<div role="menuitem" tabindex={isOpen ? 0 : -1} on:click={selectItem}>
Пункт меню 2
</div>
</div>
Важно, что элементы, которые временно скрыты, должны иметь
aria-hidden="true" и быть исключены из таб-индекса.
В SvelteKit компонентах с динамическим отображением элементов критично правильно управлять фокусом. Например, модальное окно должно захватывать фокус при открытии и возвращать его на вызывающий элемент при закрытии.
Пример с использованием ARIA:
<div role="dialog" aria-modal="true" tabindex="-1" bind:this={modalElement}>
<button on:click={closeModal}>Закрыть</button>
<p>Содержимое модального окна</p>
</div>
<script>
import { onMount } from 'svelte';
let modalElement;
onMount(() => {
modalElement.focus();
});
function closeModal() {
modalElement.blur();
}
</script>
aria-modal="true" сообщает скринридерам, что фокус
ограничен внутри диалога.
aria-labelledby и
aria-describedbyДля улучшения семантики и доступности рекомендуется связывать компоненты с описанием или заголовком:
aria-labelledby — указывает ID элемента, который
является заголовком.aria-describedby — указывает ID элемента с
дополнительной информацией.Пример:
<h2 id="dialogTitle">Подтверждение действия</h2>
<p id="dialogDesc">Вы действительно хотите удалить элемент?</p>
<div role="dialog" aria-labelledby="dialogTitle" aria-describedby="dialogDesc">
<button on:click={confirm}>Удалить</button>
<button on:click={cancel}>Отмена</button>
</div>
В SvelteKit UI компонентах динамические интерфейсы требуют обновления ARIA атрибутов в зависимости от состояния:
<script>
let isOpen = false;
function toggleMenu() {
isOpen = !isOpen;
}
</script>
<button aria-haspopup="true" aria-expanded={isOpen} on:click={toggleMenu}>
Меню
</button>
<ul role="menu" aria-hidden={!isOpen}>
<li role="menuitem">Пункт 1</li>
<li role="menuitem">Пункт 2</li>
</ul>
Использование aria-expanded и aria-hidden
синхронизировано с состоянием isOpen, что делает интерфейс
полностью доступным.
Эффективное применение ARIA атрибутов в SvelteKit UI библиотеках обеспечивает полную доступность компонентов, соответствие стандартам WCAG и повышает качество пользовательского интерфейса.