Просмотр глазами экранного диктора

Для экранного диктора страница представляет собой одну длинная фраза. Введите адрес, чтобы получить эту фразу в виде расшифровки, прослушать её голосом вашего устройства и увидеть, какие элементы объявляются без имени.

Страница загружается одним запросом, ничего не сохраняется. Речь создают голоса, установленные на вашем устройстве, поэтому звук его не покидает.

Или попробуйте mozilla.org, wikipedia.org

Из двух измерений в одно

Глазами вы охватываете страницу целиком: логотип слева вверху, меню поперёк, статья посередине, боковая колонка справа. Речь так не умеет. Экранный диктор, например NVDA, JAWS, VoiceOver или TalkBack, проходит HTML в порядке исходного кода и произносит по одному элементу, ставя роль элемента перед его текстом: «заголовок уровень 2, Цены», «ссылка, Связаться с нами», «поле ввода, Email, обязательное».

Никто не слушает всё это от начала до конца. Опытные пользователи перемещаются по типам. Одна клавиша переходит к следующему заголовку, другая выводит список всех ссылок на странице, третья ведёт прямо к основному ориентиру. Поэтому для них роль и имя каждого элемента и есть весь интерфейс. Кнопка, которая на экране выглядит очевидной, но не имеет текста, объявляется как «кнопка», и больше они ничего не слышат.

Как строится расшифровка

Наш сервер один раз загружает страницу и проходит <body> так же, как это делают вспомогательные программы. Первым идёт <title> страницы, потому что его произносят первым при открытии. После этого каждый элемент становится строкой:

  • Ориентиры: баннер, навигация, основное содержимое, дополнительное, сведения о содержимом, поиск, а также именованные области и формы.
  • Заголовки с их уровнем, ссылки с адресом назначения, кнопки с их состоянием (развёрнуто, свёрнуто, нажато).
  • Поля форм с их типом и состоянием: «флажок, не отмечен», «комбинированный список», «поле ввода, email, обязательное».
  • Изображения, фреймы, списки с числом пунктов и таблицы с числом строк и столбцов.

Имя каждого элемента мы вычисляем в том же порядке, что и браузеры: aria-labelledby, затем aria-label, затем собственный источник (alt, <label>, текстовое содержимое), затем title. Всё, что несёт hidden, aria-hidden="true" или встроенный display:none, пропускается, как и содержимое закрытого <details>. Изображения с alt="" пропускаются и считаются декоративными.

Нажмите «Слушать», и синтезатор речи вашего браузера прочитает строки. Роли произносятся по-английски. Содержимое читается голосом, соответствующим атрибуту lang страницы, если такой голос есть на устройстве, а для фрагментов со своим lang голос меняется.

Что означают пометки

ПометкаЧто слышит слушательИсправление
нет alt«Изображение без подписи», иногда с именем файлаДобавить текст alt или alt="", если изображение декоративное
пустая ссылка, нет имениТолько «ссылка» или «кнопка»Видимый текст, alt у значка или aria-label
нет подписи«Поле ввода» без вопроса<label for="…">, связанный с id поля
только placeholderПодсказка, которую могут вообще не прочитатьНастоящая подпись рядом с полем
расплывчатый текст, повторяющийся текст«Подробнее» пять раз, и каждый раз в разное местоНазвать цель в самой ссылке
пропуск уровня, пустойОглавление с дырамиПереходить от h2 к h3, никогда сразу к h4
нет title, нет заголовков«Фрейм»; значения таблицы без их столбцаtitle у <iframe>; ячейки <th>

Красная пометка значит, что у элемента вообще нет имени. Жёлтая значит, что имя есть, но оно не помогает. Сводка также сообщает об отсутствии языка страницы, <h1> и основного ориентира и показывает, сколько элементов стоит перед основным содержимым. Если это число велико, каждое посещение каждой страницы начинается с одного и того же долгого перечисления вашего меню.

Три способа пользоваться фильтрами

  1. Выберите Заголовки и прочитайте только этот список. Он должен работать как оглавление страницы.
  2. Выберите Ссылки. Каждая строка должна быть понятна без окружающего предложения.
  3. Выберите Поля и кнопки, закройте глаза и нажмите «Слушать». Вы должны понять, чего от вас хочет каждый элемент управления.

Выберите любую строку, чтобы начать чтение с неё. Ползунок скорости даёт почувствовать темп, который выбирают постоянные пользователи, а он часто намного выше обычной речи.

Приближение с известными пробелами

Расшифровка строится по HTML в том виде, в каком его отправил сервер. Мы не выполняем JavaScript и не применяем таблицы стилей, поэтому содержимое, добавленное скриптом, отсутствует, а содержимое, скрытое CSS-классом, всё равно читается. Время прослушивания оценивается примерно из 170 слов в минуту. Очень длинные страницы обрываются на 1200 элементах. У каждого настоящего экранного диктора к тому же свой словарь и свои сочетания клавиш, поэтому перед выпуском проверьте хотя бы с одним из них. NVDA бесплатен для Windows, а VoiceOver входит в macOS и iOS.

Частые вопросы

Это то же самое, что проверка в NVDA или VoiceOver?

Нет. Здесь видны порядок, роли и имена, с которыми работает экранный диктор, а большинство проблем как раз там. Интерактивное поведение не воспроизводится: открытие меню, живые объявления, переход фокуса в диалог. Используйте эту проверку, чтобы быстро найти проблемы, а затем подтвердите их настоящим экранным диктором.

Почему голос читает мою страницу с неправильным акцентом?

Либо страница не объявляет язык через <html lang="…">, либо на вашем устройстве не установлен голос для этого языка. Строка состояния над расшифровкой показывает, какой голос используется. Настоящие экранные дикторы ведут себя так же.

Почему часть текста моей страницы отсутствует в расшифровке?

Вероятно, его добавил JavaScript после загрузки страницы, или он находится внутри закрытого элемента <details> либо контейнера с aria-hidden. Мы читаем только HTML, который отдаёт сервер.

Что экранный диктор должен объявить для логотипа?

Название организации и, если логотип является ссылкой, куда она ведёт: alt="Acme, home page". Не пишите одно слово «логотип» и не опускайте alt, иначе ссылка будет объявлена по имени файла или адресу.

Сколько ссылок перед основным содержимым уже слишком много?

Жёсткого предела нет, потому что ссылка для пропуска и элемент <main> позволяют перескочить через них одним нажатием. Без этих двух всё, что больше нескольких элементов, утомляет уже к третьей странице.