Четирите инженерни практики, които наистина имат значение
Категорични. Не изчерпателни. Шаблоните, които при спазване елиминират повечето регресии в достъпността преди code review.
Семантичен HTML на първо място, ARIA на второ
Когато нативният HTML може да свърши работата, използвайте го. <button>
има вградена работа с клавиатура, фокус, роля и активиране с Enter/Space;
<label> свързва контрола с описанието му;
<dialog> идва с поведение за задържане на фокуса и деактивиране
на останалата страница, което иначе би трябвало да се имплементира ръчно;
<details> е disclosure widget без никакъв JavaScript. ARIA е
вратата за излизане — полезна, когато няма нативен елемент за задачата, вредна,
когато се добавя върху такъв, който вече работи. Справка:
критериите за успех на WCAG 2.2 и
ръководството за авторски практики на W3C ARIA.
Поддръжката на клавиатура не е отметка в списък
Всеки интерактивен елемент трябва да работи само с клавиатура. Tab
и Shift+Tab за придвижване; Enter или Space за активиране; Esc за
затваряне на преходна повърхност (модал, popover, меню). Фокусът трябва
да е видим — никога outline: none; без замяна. Фокусът
трябва да се премества логично — когато се отвори модал, фокусът влиза в него;
когато модалът се затвори, фокусът се връща към елемента, отворил го.
Тествайте с клавиатура преди да тествате с мишка;
мишката скрива грешки, които клавиатурата веднага разкрива.
Достъпни наименования и описания
Не sprinkles от aria-label. Достъпното наименование идва
по подразбиране от текстовото съдържание на елемента; aria-labelledby
реферира текста на друг възел; aria-label замества всичко
с твърдо кодиран низ (и трябва да е последна мярка, тъй като заобикаля
превода и склонен е да се разминава с видимия етикет). Достъпното описание
е отделно — aria-describedby реферира възела с помощен текст
или съобщение за грешка. Проверявайте в дървото за достъпност на DevTools
какво реално получава екранният четец — предположенията и реалността
често не съвпадат.
Тествайте в реалната си CI среда, не само локално
Локалната проверка с axe е тест за здрав разум. Зелената CI е портал
срещу регресии. Свържете eslint-plugin-jsx-a11y към всеки PR;
добавете твърдения с axe-core в unit и e2e тестовете; изпълнявайте
AT-driver потоци на представителни страници, за да включите реален екранен четец.
Прегледът на инструментите за тестване с екранен четец
обхваща какво си струва да се автоматизира и какво все още изисква ръчен преглед.
Инструментариумът — 13 подбрани инструмента и библиотеки
Всеки запис съответства на фаза от жизнения цикъл — lint, unit тест, e2e, runtime, мониторинг или ръчен преглед — за да свържете правилния инструмент с правилния портал.
-
Runtime
axe-core
Машината за тестване на достъпност, която задвижва по-голямата част от инструментите по-долу. Интегрирайте я в unit тестове, e2e пакети или я свържете с DOM среда по време на разработка за проверки по време на изпълнение.
-
E2E
axe DevTools
Разширение за браузър с интеграции за Playwright, Cypress, Jest и Selenium. Стандартният потребителски интерфейс за разработчици върху axe-core.
-
Правила за статичен анализ (lint) за React JSX. Улавя очевидните пропуски (липсващ alt, невалидни роли, onClick на div) преди code review.
-
Runtime
vue-axe
Инструмент за проверка на достъпността по време на изпълнение за Vue — показва нарушенията от axe-core в конзолата на браузъра по време на разработка.
-
Unit test
@testing-library/jest-dom
Матчъри за unit тестове, ориентирани към достъпността. Насърчава намирането на елементи по начина, по който би го направил екранен четец (по роля + достъпно наименование), а не по клас.
-
Браузърна автоматизация от край до край с първокласна интеграция на axe-core. Изпълнява проверки за достъпност в реални браузъри в CI.
github.com/dequelabs/axe-core-npm/tree/develop/packages/playwright ↗
-
Unit test
Storybook a11y addon
Сканиране с axe-core на ниво компонент в дизайн системата. Улавя нарушенията преди да са попаднали в продуктовия код.
-
Мониторинг
Pa11y
CLI скенер, обвиващ axe-core и HTML CodeSniffer. Подходящ примитив за CI портал, който проваля билда при регресии.
-
Мониторинг
Lighthouse CI
Разработен от Google, включва одит на достъпността (axe-core под капака) плюс оценки за производителност и добри практики. Полезен за проследяване на тенденции.
-
Ръчно
WebAIM WAVE
Визуален скенер, който нанася проблемите върху живата страница. Подходящ за дизайнери и автори на съдържание, които не искат да четат JSON доклади.
-
Unit test
Wallaby + axe-core integration
Цикъл за обратна връзка в IDE — изпълнява axe-core твърдения до курсора на теста. Ускорява итерацията на разработчика при свързване на нов компонент.
-
Стандарт, инкубиран от W3C, за управление на реални екранни четци от автоматизирани тестове. Границата на автоматизираното тестване за достъпност — най-накрая излизаме отвъд статичните проверки в стил axe.
-
Ръчно
NVDA + JAWS + VoiceOver
Реалните екранни четци, използвани от потребителите. Никаква автоматизация не замества ръчния преглед с екранен четец за 30–40% от WCAG проблемите, които автоматизацията не може да улови.
Специфични ръководства по фреймуърк
Проблемите с достъпността, които се проявяват по различен начин в различните екосистеми — и по-задълбоченото им разглеждане за всяка от тях.
React
Ключове в списъци (неправилно наредени списъци объркват екранните четци при
пренареждане на елементи). Управление на фокуса при смяна на маршрута (без него
фокусът остава върху връзката, задействала навигацията, и новата страница е
невидима за потребителите на помощни технологии). Portals и задържане на фокуса —
модал, рендериран в document.body, все пак трябва да задържа
фокуса вътре в себе си. Несъответствията при хидратация, променящи DOM структурата
между SSR и client, могат безшумно да счупят ARIA връзките. Нашият задълбочен
преглед на
aria-live региони в съвременни фреймуърки
обхваща шаблона за обявяване на live региони, който React reconciliation е склонен да нарушава.
Vue / Svelte / Solid
Подобни шаблони; промените в реактивното състояние не задействат актуализации
на live региони по подразбиране. Моделът на реактивност на всеки фреймуърк има
различна дефиниция на „DOM се е променил“ и екранните четци виждат — или не виждат
— резултиращата актуализация на възела по фино различни начини. v-if
срещу v-show на Vue, реактивните декларации на Svelte и
фино зърнестата реактивност на Solid произвеждат различни актуализации на дървото
за достъпност за привидно еднакъв код.
Нативна мобилна разработка (iOS + Android)
Напълно различна повърхност на API. iOS излага UIAccessibility
(и .accessibilityLabel() /
.accessibilityHint() на SwiftUI) за VoiceOver; Android излага
AccessibilityNodeInfo за TalkBack. ARIA в уеб стил не се транслира.
Материалът за
нативните мобилни API за достъпност
съпоставя уеб концепциите с техните нативни еквиваленти, за да спре инженерите,
обучени в уеб среда, да отгатват.
Библиотеки с компоненти
Headless библиотеките (Radix UI, Headless UI, React Aria) поемат трудните части — управление на фокуса, работа с клавиатура, свързване на ARIA — и оставят визуалния дизайн изцяло на вас. Пълнофункционалните библиотеки (Material UI, Chakra, Ant) идват с мнения за визуалната страна, но качеството им по отношение на достъпността варира значително, и „достъпен по подразбиране“ рядко означава „тестван срещу реални екранни четци“. Нашият преглед на достъпни библиотеки с компоненти оценява основните варианти спрямо реално тестване с помощни технологии.
Контролен списък при PR преглед за достъпност
Отпечатайте го, поставете го в PR шаблона или го автоматизирайте в бот. Минимумът, на който всеки рецензент трябва да обърне внимание.
- Интерактивните елементи работят само с клавиатура (Tab + Enter + Space + Esc).
- Индикаторът за фокус е видим на всеки интерактивен елемент.
- Полетата на формуляра имат асоцииран
<label>. - Съобщенията за грешка са асоциирани с полетата си (
aria-describedbyили съседен текст). - Промените в динамичното съдържание се обявяват чрез
aria-liveпри необходимост. - Модалните диалози задържат фокуса и го връщат към отварящия елемент при затваряне.
- Изображенията имат смислен алтернативен текст; декоративните изображения носят
alt="". - Списъците използват
<ul>/<ol>/<dl>— не<div>салата. - Йерархията на заглавията е логична (без пропуснати нива).
- Lint + axe тестовете преминават в CI преди сливане.
Чести инженерни антишаблони
Шаблоните, преминаващи code review и счупващи се в production. Улавяйте ги по-рано.
- „Overlay widget“ — JavaScript на трета страна, претендиращ, че добавя достъпност към съществуващ сайт. Не го прави, чести нарушава слоя на помощните технологии и сам по себе си е генерирал вълна от съдебни искове. Контекст: overlay доставчиците.
-
role="button"върху<div>— добавя обявяването на ролята без поведението при работа с клавиатура (Enter, Space) или участие в таб реда. Използвайте<button>. -
aria-hidden="true"върху фокусируеми елементи — създава капан за фокуса, при който потребителите с клавиатура могат да попаднат на елемент, за който екранният четец е инструктиран да игнорира. Или премахнете елемента от таб реда сtabindex="-1", или премахнетеaria-hidden. - Персонализирано падащо меню без управление с клавиатура —
combobox на база
<div>, отварящ се при клик, но игнориращ клавишите със стрелки, Home/End, въвеждане на знак и Esc. Прегледът на достъпни библиотеки с компоненти обхваща библиотеките, които се справят с това правилно от кутията. - Toast известия, които не се обявяват —
преходна повърхност, рендерирана без
role="status"(polite) илиrole="alert"(assertive). Зрящите потребители я виждат; потребителите на екранни четци — не. - Генериран DOM, счупващ дървото за достъпност
— тежки обвивки около input (персонализиран select, изграден от
дванадесет вложени
<div>) често скриват реалния контрол от помощните технологии. Тествайте какво вижда помощната технология, а не само какво вижда потребителят.
Набор от инструменти + pipeline за мониторинг
Повечето екипи искат три неща в последователност: еднократно сканиране при триаж, когато нещо изглежда счупено; инженерна справка, когато искат да разберат основните шаблони; и непрекъснат слой за мониторинг, след като достъпността е влязла в production пътната карта. Нашият безплатен WCAG 2.2 скенер покрива първото — поставете публичен URL, получете доклад, задвижван от axe, в нов таб. Инженерното съдържание на редакционния отдел покрива второто — включително анализи на дълга по достъпността като технически дълг и на инциденти с достъпността като SRE постмортем за екипи, управляващи достъпността в мащаб.
За непрекъснатия слой, ръководството за избор на инструмент за мониторинг е най-категоричният материал в сайта. Оценява axe Monitor, Siteimprove, Level Access и Qualibooth — последният от които интегрира мониторинга с предаване към ръчен одит, липсващото звено в повечето стекове само с автоматизация — по широчина на покритие, процент на фалшиви положителни резултати и колко чисто данните се вграждат в инженерните работни процеси. Целта на мониторинга е да се гарантира, че корекциите, доставени днес, няма да регресират следващия спринт.
Често задавани инженерни въпроси
Въпросите, появяващи се на всеки стартов разговор за достъпност. Огледалени в структурираните данни FAQPage.
- По-добро ли е
aria-labelот видимите текстови етикети? -
Не. Видимият текст почти винаги е по-добър — той е полезен за зрящи
потребители, зрящи потребители с когнитивни увреждания, потребители на
гласово управление (казват това, което виждат) и инструменти за превод.
Прибягвайте до
aria-labelсамо когато няма видим текст за асоцииране (бутони само с икона) или когато видимият текст наистина не е желаното достъпно наименование. - Трябва ли да използвам ARIA роли за всичко?
-
Не. Първото правило на ARIA е "do not use ARIA". Нативните HTML
елементи идват с правилната роля, правилното поведение при работа с клавиатура
и правилната семантика в дървото за достъпност. Използвайте ARIA
само когато (и единствено когато) няма нативен елемент, подходящ за целта —
например таб списък, дърво или персонализиран диалог, при който не можете да
използвате
<dialog>. - Как да тествам достъпността в CI?
-
Три слоя, наредени по цена. (1) Lint:
eslint-plugin-jsx-a11yпри всеки PR. (2) Unit тестове:@testing-library/jest-domплюсjest-axe(или@axe-core/react) за всеки компонент. (3) End-to-end:@axe-core/playwrightна представителни потребителски пътища. Добавете портал Pa11y или Lighthouse CI в staging среда, за да хванете дрейфа, пропуснат от по-ниските слоеве. - axe-core и Lighthouse едно и също ли са?
- Lighthouse използва axe-core под капака за своя одит на достъпността, но изпълнява подбрано подмножество от правилата и ги представя в рамките на по-широк доклад за производителност / SEO / добри практики. axe-core е самият двигател — когато искате пълния набор от правила или искате да го разширите, използвате axe-core директно. За повечето екипи: използвайте Lighthouse за проследяване на тенденции, axe-core за реалния портал.
- Каква е минималната конфигурация за тестване на достъпност в React проект?
-
Добавете
eslint-plugin-jsx-a11yкъм съществуващата конфигурация на ESLint (предоставя се по подразбиране с create-react-app и Next.js). Добавете@testing-library/jest-domиjest-axeкъм настройката за unit тестове и извиквайтеexpect(await axe(container)).toHaveNoViolations()в поне един тест за всеки компонент. Това е минимумът — улавя около 40% от реалните WCAG проблеми срещу няколко часа настройка. - Необходимо ли е тестване с реални екранни четци?
- Да, за всяка функционалност на продукта, която потребител на помощна технология реално ще използва. Автоматизираните инструменти улавят структурните грешки (липсващи етикети, контраст, несъответствия в ролите), но не и функционалните (фокус, прескачащ към долния колонтитул, live региони, които не обявяват, „достъпен“ модал, задържащ фокуса в грешното поддърво). Планирайте поне един ръчен преглед на всяко основно издание с NVDA на Windows и VoiceOver на macOS / iOS.
Следващи стъпки
Направете бърза проверка с безплатния WCAG 2.2 скенер, ако извършвате триаж на конкретна страница. Прочетете прегледа на инструментите за тестване с екранен четец преди да свържете AT-driver в CI. И ако достъпността преминава от „еднократен одит“ към „постоянна production грижа“, ръководството за избор на инструмент за мониторинг е най-конкретният материал в сайта за избор на доставчик.