diff --git a/src/pages/html/index.md b/src/pages/html/index.md index 60d20fb..6d0be16 100644 --- a/src/pages/html/index.md +++ b/src/pages/html/index.md @@ -2343,15 +2343,37 @@ browser/platform conventions. При custom styling лучше визуальн **Короткий ответ** -Accessibility, или a11y, — проектирование интерфейса так, чтобы им могли пользоваться люди с разными возможностями и -устройствами. WCAG — рекомендации W3C, сгруппированные по принципам perceivable, operable, understandable и robust, с -проверяемыми критериями уровней A, AA и AAA. +Accessibility, или a11y, — проектирование интерфейса так, чтобы им могли пользоваться люди с разными возможностями, +устройствами и способами ввода. WCAG 2.2 — актуальная рекомендация W3C: success criteria организованы вокруг принципов +perceivable, operable, understandable и robust и имеют уровни A, AA и AAA. **Полный ответ** -Accessibility, или a11y, — проектирование интерфейса так, чтобы им могли пользоваться люди с разными возможностями и -устройствами. WCAG — рекомендации W3C, сгруппированные по принципам perceivable, operable, understandable и robust, с -проверяемыми критериями уровней A, AA и AAA. +Accessibility — это не отдельная «поддержка screen reader», а качество продукта для пользователей с разными зрительными, +слуховыми, моторными, когнитивными особенностями и временными ограничениями. Сюда же попадают keyboard-only users, zoom, +high contrast, speech input и другие способы взаимодействия. + +WCAG 2.2 группирует требования по четырем принципам **POUR**: + +- **Perceivable** — информацию можно воспринять, например есть text alternatives и достаточный contrast; +- **Operable** — интерфейс работает с клавиатуры, focus заметен, нет keyboard traps; +- **Understandable** — navigation и controls предсказуемы, ошибки понятны; +- **Robust** — semantics корректно интерпретируются browsers и assistive technologies. + +Уровни conformance: + +- **A** — базовые требования; +- **AA** — типичная целевая планка для продукта и законодательства; +- **AAA** — дополнительные критерии, которые W3C не рекомендует требовать целиком для любого сайта. + +Важно: WCAG — **не чеклист HTML attributes**. Один и тот же success criterion может выполняться разными техническими +способами, а часть критериев требует human evaluation. + +Практический workflow: команда выбирает target, обычно WCAG 2.2 AA, превращает его в design/development rules, +автоматические проверки и ручные сценарии, а не пытается «проверить WCAG» одной кнопкой Lighthouse. + +На интервью сильный ответ: **accessibility — свойство пользовательского сценария, WCAG — проверяемая модель требований, +а не конкретная библиотека или набор ARIA attributes**. @@ -2363,13 +2385,50 @@ Accessibility, или a11y, — проектирование интерфейс **Короткий ответ** -Все действия должны быть доступны с клавиатуры в логичном порядке. Текущий focus обязан быть заметен; нельзя убирать -outline без равноценной замены. Native controls уже поддерживают Tab, Enter, Space и ожидаемые паттерны. +Ключевые действия должны выполняться без мыши в логичном focus order. Текущий focus обязан быть заметен; нельзя удалять +outline без равноценной замены. Native controls уже дают ожидаемые Tab/Shift+Tab и activation semantics, а composite +widgets дополнительно используют arrow keys по своему паттерну. **Полный ответ** -Все действия должны быть доступны с клавиатуры в логичном порядке. Текущий focus обязан быть заметен; нельзя убирать -outline без равноценной замены. Native controls уже поддерживают Tab, Enter, Space и ожидаемые паттерны. +Keyboard accessibility начинается с того, что пользователь может **дойти до интерактивного элемента, понять где +находится и выполнить действие**. + +Для обычной страницы Tab перемещает focus по focusable controls, Shift+Tab — назад. Порядок обычно должен следовать DOM +и визуальной логике. Положительные `tabindex` (`1`, `2`, ...) почти всегда ухудшают поддержку: они создают отдельный +ручной focus order, который легко расходится с DOM. + +```html + +Помощь +``` + +Native controls сразу получают keyboard semantics. `div tabindex="0"` не становится полноценной кнопкой: нужно вручную +реализовать activation keys, disabled state, role и другие детали. + +Visible focus — отдельное требование. CSS вида + +```css +:focus { + outline: none; +} +``` + +без альтернативы делает интерфейс практически неуправляемым. Современный вариант часто строят на `:focus-visible`, +сохраняя сильный indicator для keyboard interaction. + +Нужно проверять не только наличие кольца, но и что оно: + +- не перекрыто sticky header/overlay; +- имеет достаточную видимость; +- не обрезается `overflow: hidden`; +- остается заметным в high contrast/forced colors. + +У сложных widgets Tab обычно входит в компонент один раз, а внутреннее перемещение выполняется arrow keys согласно +выбранному WAI-ARIA pattern. + +На интервью: **keyboard support — это focus order + видимый focus + ожидаемая activation/navigation model, а не просто +`tabindex=0`**. @@ -2381,15 +2440,39 @@ outline без равноценной замены. Native controls уже по **Короткий ответ** -Focus management переводит focus после значимого UI-события и возвращает его в понятное место. Modal dialog ограничивает -Tab внутри себя, устанавливает начальный focus и после закрытия возвращает его trigger. Focus trap не применяют к -немодальным областям без необходимости. +Focus management осмысленно перемещает DOM focus после значимых UI-переходов и возвращает его туда, откуда пользователь +продолжит работу. Focus trap нужен для настоящего modal dialog, чтобы Tab не уходил в inert content; для обычных panels +и dropdown без модальности trap часто вреден. **Полный ответ** -Focus management переводит focus после значимого UI-события и возвращает его в понятное место. Modal dialog ограничивает -Tab внутри себя, устанавливает начальный focus и после закрытия возвращает его trigger. Focus trap не применяют к -немодальным областям без необходимости. +Focus сообщает пользователю keyboard/screen reader, **где сейчас находится точка взаимодействия**. При динамическом UI +браузер не всегда может сам выбрать правильное место, поэтому приложению иногда нужен focus management. + +Типичные случаи: + +- dialog открылся — focus перемещается внутрь; +- dialog закрылся — обычно возвращается trigger; +- после удаления item focus должен перейти к логичному соседу, а не исчезнуть в `body`; +- после client-side navigation иногда нужно перевести focus к main heading/container, чтобы screen reader понял смену + страницы; +- после validation submit focus может перейти к error summary или первому invalid control. + +`focus()` не следует вызывать на каждое render/update: неожиданный прыжок focus ломает ввод и screen reader navigation. + +**Focus trap** означает, что Tab/Shift+Tab циклически остаются внутри modal context. Это корректно для modal dialog, +потому что content снаружи должен быть недоступен для взаимодействия. Но trap вокруг sidebar, dropdown или обычного card +создает keyboard trap — пользователь не может продолжить navigation. + +Для modal dialog важны четыре части: + +1. background действительно inert/non-interactive; +2. initial focus выбран по содержимому, а не всегда «первый input»; +3. Tab остается внутри; +4. после закрытия focus возвращается в осмысленное место. + +На интервью полезная формула: **focus management следует за изменением пользовательского контекста; focus trap допустим +только там, где UI действительно modal**. @@ -2401,13 +2484,43 @@ Tab внутри себя, устанавливает начальный focus **Короткий ответ** -Screen reader озвучивает accessibility tree и позволяет перемещаться по headings, landmarks, controls и другим -семантическим узлам. Проверка только DOM или визуального вида не гарантирует корректный опыт screen reader. +Screen reader озвучивает и позволяет исследовать accessibility tree: headings, landmarks, links, controls, names, states +и descriptions. Он не просто «читает DOM сверху вниз», поэтому визуально правильная страница может быть неудобной, если +semantics или focus model неверны. **Полный ответ** -Screen reader озвучивает accessibility tree и позволяет перемещаться по headings, landmarks, controls и другим -семантическим узлам. Проверка только DOM или визуального вида не гарантирует корректный опыт screen reader. +Screen reader — assistive technology, которая предоставляет интерфейс через речь и/или Braille. Пользователь может +читать текст последовательно, но часто работает намного быстрее через semantic navigation: прыгает по headings, +landmarks, links, form controls, tables и другим категориям. + +Screen reader взаимодействует не напрямую с HTML source, а с **accessibility tree**, который browser строит из: + +- native HTML semantics; +- accessible name/description; +- ARIA roles/states/properties; +- DOM state и некоторых CSS properties; +- platform accessibility APIs. + +Например: + +```html + +``` + +может быть объявлен как button с именем «Фильтры» и состоянием collapsed. + +Это объясняет, почему проверка Elements panel недостаточна. Element может присутствовать в DOM, но быть скрытым из +accessibility tree; наоборот, роль и имя могут отличаться от того, что визуально кажется очевидным. + +Реальные screen readers также различаются по OS/browser combinations: VoiceOver + Safari, NVDA/JAWS + Chrome/Firefox и +т.д. Поэтому для critical flows полезно иметь поддерживаемую test matrix, а не проверять случайную комбинацию один раз. + +Не нужно пытаться «озвучить все вручную» ARIA. Хорошая semantic разметка дает screen reader структурированную модель, в +которой пользователь сам выбирает способ navigation. + +На интервью: **screen reader — клиент accessibility API, а качество опыта определяется semantics, name/state, focus и +keyboard behavior вместе**. @@ -2419,15 +2532,58 @@ Screen reader озвучивает accessibility tree и позволяет пе **Короткий ответ** -ARIA добавляет roles, states и relationships в accessibility tree, но не создает keyboard behavior и не меняет семантику -для обычного UI автоматически. Сначала выбирают native HTML; ARIA используют, когда нужную семантику нельзя выразить -подходящим элементом. +ARIA описывает roles, states и relationships для accessibility tree, когда native HTML недостаточно. Она не добавляет +keyboard behavior, focus management или визуальное состояние автоматически. Правило: сначала native HTML, затем +минимально необходимая ARIA для custom/dynamic widget. **Полный ответ** -ARIA добавляет roles, states и relationships в accessibility tree, но не создает keyboard behavior и не меняет семантику -для обычного UI автоматически. Сначала выбирают native HTML; ARIA используют, когда нужную семантику нельзя выразить -подходящим элементом. +WAI-ARIA позволяет уточнять accessibility semantics через `role`, `aria-*` states и relationships. + +Например custom disclosure может сообщать состояние: + +```html + + +``` + +Но ARIA **не реализует behavior**. Если написать: + +```html +
Save
+``` + +browser не добавит автоматически Tab focus, Space/Enter handling, disabled semantics и form behavior настоящего +` +``` + +сообщает, что button является toggle control и сейчас pressed. + +Но screen reader experience ломается, если visual state говорит одно, а `aria-pressed` другое. Поэтому ARIA state — +часть application state contract и должен обновляться атомарно с UI. + +Еще один пример: `aria-describedby` может связать input с hint/error, но сам по себе не показывает сообщение визуально. +Accessibility требует, чтобы информация была доступна разными способами, а не только screen reader. + +Не все users assistive technology используют speech. Accessibility tree также потребляют другие технологии и browser +automation. Поэтому корректная semantics полезна шире одной программы. + +Главная ошибка — считать, что добавление `aria-label` делает любой component accessible. Если custom button не работает +с keyboard или dialog не управляет focus, name не исправляет interaction. + +На интервью: **ARIA — входные данные для accessibility tree, screen reader — один из потребителей этого tree, а +полноценная accessibility включает semantics + interaction + perception**. @@ -2459,15 +2648,59 @@ Screen reader читает accessibility tree, который строится **Короткий ответ** -Использовать semantic landmarks, правильную иерархию заголовков, label, fieldset, legend, понятные ссылки, доступные -изображения и native form validation. Контент и основные действия должны быть доступны как HTML, а JavaScript добавляет -улучшения. Такой подход помогает progressive enhancement и снижает риск пустого интерфейса при ошибке bundle. +Начать с semantic HTML и native behavior: landmarks/headings, links, buttons, forms с labels, fieldset/legend, alt text, +language и нормальная document order. JavaScript должен улучшать baseline, а не заменять базовые navigation/form +semantics без необходимости. **Полный ответ** -Использовать semantic landmarks, правильную иерархию заголовков, `label`, `fieldset`, `legend`, понятные ссылки, -доступные изображения и native form validation. Контент и основные действия должны быть доступны как HTML, а JavaScript -добавляет улучшения. Такой подход помогает progressive enhancement и снижает риск пустого интерфейса при ошибке bundle. +Большой объем accessibility можно получить **до первого JavaScript handler**. + +Пример базовой страницы: + +```html +
...
+ +
+

Профиль

+
+ + + +
+
+``` + +Здесь уже есть: + +- landmarks; +- heading structure; +- link/button semantics; +- keyboard support; +- accessible form name; +- native submission/validation. + +Другие platform primitives: `
/` для disclosure, `` как база dialog, `