Тестирование доступности (Accessibility, сокращённо a11y) является ключевым аспектом разработки интерфейсов, обеспечивая удобство использования приложений людьми с различными ограничениями. В Vue.js, как и в любом современном фронтенд-фреймворке, существуют инструменты и подходы для интеграции проверок доступности на уровне компонентов и всего приложения.
Семантическая разметка Использование правильных HTML-элементов обеспечивает корректное взаимодействие с ассистивными технологиями (скринридерами, голосовыми помощниками).
<button> вместо <div> для
кнопок.<label> для форм, связывающий текст с полем ввода
через атрибут for.<h1>–<h6> для
структурирования контента.Атрибуты ARIA ARIA (Accessible Rich Internet Applications) расширяет семантику стандартных элементов. Vue.js позволяет динамически управлять ARIA-атрибутами через реактивные свойства:
<button :aria-pressed="isActive">{{ isActive ? 'Включено' : 'Выключено' }}</button>Фокус и навигация с клавиатуры Все интерактивные
элементы должны быть доступны через Tab. Vue поддерживает
управление фокусом через директивы и refs:
<input ref="username" type="text" />
<button @click="$refs.username.focus()">Фокус на поле</button>Контраст и цвет Текст и элементы интерфейса должны иметь достаточный контраст по стандартам WCAG. Vue-компоненты можно стилизовать динамически с учётом состояния доступности:
<p :style="{ color: isDisabled ? '#999' : '#000' }">Текст</p>eslint-plugin-vuejs-accessibility ESLint-плагин, проверяющий компоненты на ошибки доступности. Позволяет обнаруживать:
alt у <img>Установка и настройка:
npm install eslint-plugin-vuejs-accessibility --save-dev
Конфигурация .eslintrc.js:
module.exports = {
plugins: ['vuejs-accessibility'],
extends: ['plugin:vuejs-accessibility/recommended'],
};axe-core и vue-axe Автоматизированный анализ доступности с детальными отчетами о нарушениях. Подключение во Vue 3:
import { createApp } from 'vue'
import App from './App.vue'
import VueAxe from 'vue-axe'
const app = createApp(App)
app.use(VueAxe, { config: { rules: [] } })
app.mount('#app')Cypress + cypress-axe Тестирование доступности на уровне e2e. Позволяет интегрировать проверки в CI/CD. Пример теста:
import 'cypress-axe'
it('Проверка доступности главной страницы', () => {
cy.visit('/')
cy.injectAxe()
cy.checkA11y()
})Модульное тестирование с Jest Проверка доступности отдельных компонентов:
import { mount } from '@vue/test-utils'
import { toHaveNoViolations } from 'jest-axe'
import MyButton from '@/components/MyButton.vue'
import { axe, toHaveNoViolations } from 'jest-axe'
expect.extend(toHaveNoViolations)
test('MyButton должен быть доступен', async () => {
const wrapper = mount(MyButton)
const results = await axe(wrapper.element)
expect(results).toHaveNoViolations()
})Реактивная доступность Vue позволяет динамически менять доступность элементов через реактивные данные:
<template>
<button :disabled="!isActive" aria-label="Сохранить">Сохранить</button>
</template>
<script>
export default {
data() {
return { isActive: false }
}
}
</script>lang.Composition API упрощает управление фокусом и состоянием ARIA:
import { ref, onMounted } from 'vue'
export default {
setup() {
const inputRef = ref(null)
onMounted(() => inputRef.value.focus())
return { inputRef }
}
}Teleport позволяет выводить элементы модально, при этом сохраняя доступность для скринридеров.
Suspense и динамическая загрузка компонентов требуют внимательного контроля за доступностью загружаемых элементов.
Тестирование доступности во Vue.js — это не просто проверка наличия атрибутов, а комплексный процесс, включающий семантическую разметку, управление фокусом, автоматизированные тесты и динамическое управление состояниями компонентов. Эффективная интеграция этих практик гарантирует, что приложение будет удобно использовать широкому кругу пользователей.