Тестирование доступности (accessibility, a11y) является неотъемлемой частью разработки интерфейсов, обеспечивая возможность использования приложений людьми с различными ограничениями. Preact, как легковесный фреймворк для построения UI, предоставляет гибкую структуру, позволяющую интегрировать методы тестирования доступности на различных уровнях приложения.
Семантическая разметка Правильное использование
HTML-элементов играет ключевую роль. Например, кнопки должны быть
<button>, а ссылки <a>, а не
имитироваться <div> с обработчиками событий. Preact
поддерживает стандартную HTML-разметку, поэтому проверка семантики
сводится к корректному использованию JSX:
const Button = ({ onClick, label }) => (
<button onCl ick={onClick}>{label}</button>
);
ARIA-атрибуты ARIA (Accessible Rich Internet Applications) расширяет возможности HTML для сложных компонентов. Preact позволяет добавлять ARIA-атрибуты напрямую в JSX:
const Modal = ({ isOpen }) => (
<div role="dialog" aria-modal={isOpen}>
Контент модального окна
</div>
);
Ключевые ARIA-атрибуты:
role – назначение элементаaria-label / aria-labelledby – описание
для скринридеровaria-hidden – скрытие элементов от доступностиaria-live – уведомления об изменениях динамического
контентаLighthouse Lighthouse встроен в Chrome DevTools и предоставляет детальный отчёт по a11y. Он проверяет: контраст текста, семантику, использование ARIA, навигацию с клавиатуры.
axe-core Библиотека для автоматизированного тестирования доступности. В Preact её удобно использовать с Jest или Cypress:
import { render } from '@testing-library/preact';
import { axe, toHaveNoViolations } from 'jest-axe';
import App from './App';
expect.extend(toHaveNoViolations);
test('App should have no accessibility violations', async () => {
const { container } = render(<App />);
const results = await axe(container);
expect(results).toHaveNoViolations();
});
Testing Library @testing-library/preact
позволяет писать тесты, ориентированные на поведение пользователя, а не
на реализацию компонента, что повышает качество проверки
доступности:
import { render, screen } from '@testing-library/preact';
import userEvent from '@testing-library/user-event';
import Modal from './Modal';
test('Modal can be closed with Escape key', async () => {
render(<Modal isOpen={true} />);
const modal = screen.getByRole('dialog');
await userEvent.keyboard('{Escape}');
expect(modal).not.toBeVisible();
});
Для пользователей, использующих клавиатуру, важна последовательная навигация по элементам:
В Preact это реализуется через обработку событий:
const Dropdown = ({ items }) => {
const [isOpen, setIsOpen] = useState(false);
const handleKeyDown = (e) => {
if (e.key === 'Escape') setIsOpen(false);
};
return (
<div tabIndex={0} onKeyD own={handleKeyDown}>
<button onCl ick={() => setIsOpen(!isOpen)}>Меню</button>
{isOpen && <ul>{items.map(item => <li key={item}>{item}</li>)}</ul>}
</div>
);
};
Контраст текста и фона Использование инструментов вроде Contrast Checker помогает убедиться, что цвет текста достаточно различим на фоне. В CSS можно заранее создавать темы с высокой контрастностью:
.button {
color: #ffffff;
background-color: #1a73e8;
}
Фокус и видимость активного элемента Важно, чтобы при навигации клавиатурой был видим фокус:
:focus {
outline: 2px solid #ff9800;
outline-offset: 2px;
}
Автоматизация тестирования a11y в Preact-проектах повышает стабильность интерфейса:
Пример конфигурации CI с axe и Jest:
{
"scripts": {
"test": "jest --coverage",
"a11y": "jest --config=jest.a11y.config.js"
}
}
Приложения на Preact часто используют динамический контент. Для его
доступности следует применять aria-live:
const Notification = ({ message }) => (
<div role="status" aria-live="polite">
{message}
</div>
);
aria-live="polite" – обновления уведомлений не
прерывают текущую работу пользователяaria-live="assertive" – важные уведомления, требующие
немедленного вниманияТестирование доступности в Preact требует комплексного подхода: семантическая разметка, использование ARIA, проверка навигации с клавиатуры, контраста и динамического контента. Интеграция инструментов вроде axe-core, Testing Library и Lighthouse обеспечивает высокий стандарт интерфейсов и совместимость с требованиями WCAG.