eslint-plugin-jsx-a11y представляет собой специализированный плагин для ESLint, ориентированный на анализ JSX-разметки с точки зрения доступности (accessibility, a11y). Основная задача — выявление нарушений практик, затрудняющих использование интерфейса людьми с ограниченными возможностями, включая пользователей экранных читалок, клавиатурной навигации и вспомогательных технологий.
Плагин работает статически, анализируя JSX-деревья и проверяя соответствие набору правил, основанных на рекомендациях WAI-ARIA и стандартах WCAG.
Плагин устанавливается как зависимость проекта и подключается в конфигурации ESLint.
npm install eslint-plugin-jsx-a11y --save-dev
или
yarn add eslint-plugin-jsx-a11y -D
Подключение в конфигурации ESLint:
{
"plugins": ["jsx-a11y"]
}
Использование рекомендуемого набора правил:
{
"extends": ["plugin:jsx-a11y/recommended"]
}
Дополнительно возможен строгий режим:
{
"extends": ["plugin:jsx-a11y/strict"]
}
Плагин анализирует:
Проверки реализованы как набор независимых правил, каждое из которых отвечает за узкий аспект доступности.
Правила плагина условно делятся на группы:
Контроль корректного использования HTML-элементов:
Проверка корректности использования ARIA:
Контроль доступности интерактивных элементов:
Правило: jsx-a11y/alt-text
Контролирует наличие и корректность alt-атрибута.
Некорректный пример:
<img src="photo.jpg" />
Корректный пример:
<img src="photo.jpg" alt="Описание изображения" />
Особые случаи включают декоративные изображения:
<img src="decorative.png" alt="" />
Правило: jsx-a11y/aria-props
Контролирует допустимость ARIA-атрибутов в JSX.
Некорректный пример:
<div aria-unknown="true" />
Корректный пример:
<div aria-hidden="true" />
Также проверяется соответствие типов значений:
<button aria-expanded="not-a-boolean" />
Правило: jsx-a11y/role-has-required-aria-props
Некоторые роли требуют обязательных атрибутов.
Пример нарушения:
<div role="checkbox" />
Корректно:
<div role="checkbox" aria-checked="false" />
Правило: jsx-a11y/interactive-supports-focus
Интерактивные элементы должны быть доступны через клавиатуру.
Нарушение:
<div onCl ick={handleClick} />
Корректный вариант:
<div onCl ick={handleClick} tabIndex={0} />
или семантически правильнее:
<button onCl ick={handleClick} />
Правило: jsx-a11y/click-events-have-key-events
Обеспечивает поддержку клавиатурных событий для кликабельных элементов.
Нарушение:
<div onCl ick={handleClick} />
Корректно:
<div onCl ick={handleClick} onKeyD own={handleKeyDown} />
Правило: jsx-a11y/no-static-element-interactions
Запрещает использование статических элементов как интерактивных без корректной семантики.
Нарушение:
<span onCl ick={handleClick}>Кнопка</span>
Корректно:
<button onCl ick={handleClick}>Кнопка</button>
Правило: jsx-a11y/label-has-associated-control
Контролирует связь label и input.
Нарушение:
<label>Имя</label>
<input type="text" />
Корректно:
<label htmlFor="name">Имя</label>
<input id="name" type="text" />
Альтернативный вариант:
<label>
Имя
<input type="text" />
</label>
Правило: jsx-a11y/anchor-has-content
Ссылка должна содержать текст или доступное содержимое.
Нарушение:
<a href="/home"></a>
Корректно:
<a href="/home">Главная</a>
Правило: jsx-a11y/heading-has-content
Контролирует наличие содержимого в заголовках.
Нарушение:
<h1 />
Корректно:
<h1>Заголовок</h1>
Правило: jsx-a11y/no-autofocus
Ограничивает использование autoFocus, так как оно может нарушать пользовательский поток.
Нарушение:
<input autoFocus />
Включение допускается только при явной необходимости интерфейса.
Правило: jsx-a11y/tabindex-no-positive
Запрещает положительные значения tabIndex.
Нарушение:
<div tabIndex={5} />
Корректно:
<div tabIndex={0} />
или удаление tabIndex для естественного порядка.
Каждое правило может быть переопределено:
{
"rules": {
"jsx-a11y/alt-text": "error",
"jsx-a11y/no-autofocus": "warn",
"jsx-a11y/click-events-have-key-events": "error"
}
}
Возможные уровни:
offwarnerrorЛокальное отключение:
// eslint-disable-next-line jsx-a11y/alt-text
<img src="image.jpg" />
Или для блока:
/* eslint-disable jsx-a11y/no-autofocus */
<input autoFocus />
/* eslint-enable jsx-a11y/no-autofocus */
В React-приложениях плагин часто подключается через preset:
{
"extends": [
"eslint:recommended",
"plugin:react/recommended",
"plugin:jsx-a11y/recommended"
]
}
В Next.js конфигурациях плагин используется как часть общего ESLint-набора фреймворка, дополняя проверки React и TypeScript.
В реальных проектах возникают ситуации, требующие адаптации правил:
Компоненты могут не соответствовать требованиям a11y, что приводит к ложным срабатываниям.
При создании нестандартных компонентов требуется ручное управление ARIA-атрибутами.
Некоторые правила могут конфликтовать с динамической генерацией DOM.
Плагин ориентируется на следующие принципы:
Особое внимание уделяется React-компонентам, которые инкапсулируют DOM:
const Button = ({ onClick }) => (
<div onCl ick={onClick}>Click</div>
);
Такой код нарушает несколько правил одновременно:
Корректная реализация:
const Button = ({ onClick }) => (
<button onCl ick={onClick}>Click</button>
);