Гайд по цифровой доступности веб-сайтов

Web:

Интерфейсом должно быть удобно пользоваться всем, в том числе людям с особенностями здоровья

Важно не создавать дополнительных барьеров, а задумываться, где у пользователя могут возникнуть трудности и как их решить

1
1.1

Изучите работу скринридера

Незрячие пользователи изучают сайты с помощью скринридеров — специальных приложений, которые зачитывают все элементы на странице и сообщают, как с ними взаимодействовать. Например, подсказывают, что человек может перейти по ссылке.

Попробуйте в действии NVDA или JAWS для веба, VoiceOver для Mac, VoiceOver для iOS и TalkBack для Android. Так вы сможете понять, как люди воспринимают интерфейс и взаимодействуют с ним.

1.2

Скрывайте неважные элементы от скринридера

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

Скрыть контент можно с помощью:

  • CSS-свойства display: none; или HTML-атрибута hidden. Контент будет скрыт и от пользователя, и от скринридера;
  • CSS-свойства visibility: hidden. Контент будет скрыт и от пользователя, и от скринридера. Визуально оставит пустое место под элемент;
  • HTML-атрибута aria-hidden="true". Контент будет виден пользователю, но скрыт от скринридера;
  • Класса .visually-hidden. Или любого другого класса со стилями скрывающими визуально элемент.
1.3

Задавайте кнопкам доступное имя

Доступное имя — это название элемента, которое скринридер сообщает пользователю при фокусе на элемент.

Кнопки могут получить доступное имя несколькими способами:

  • Атрибут aria-label. В значение атрибута указываем желаемое название, которое будет озвучивать скринридер;
  • Атрибут aria-labelledby — присваиваем отдельному тексту id, которой потом встраиваем через aria-labelledby в кнопку или другой элемент.
Пример правильной иерархии заголовков
  • HTML
  • aria-label
<button aria-label="Подключить подписку МТС Premium">
  Купить
</button>
  • HTML
  • aria-labelledby
<button aria-labelledby="bt-label">
  <span class="visually-hidden" id="bt-label">Подключить
  подписку МТС Premium</span>
  Подключить
</button>
1.4

Задавайте кнопкам-иконкам доступное имя

Доступное имя должно быть у всех интерактивных элементов. В том числе у кнопок-иконок.

Задать имя для них можно с помощью aria-label или в сочетании aria-label и data-tooltip.

Редактировать текст
  • HTML
  • aria-label
<button type="button" aria-label="Редактировать текст">
    <img src="edit.svg" alt="">
</button>
  • HTML
  • aria-label
  • data-tooltip
<button
    data-tooltip="Редактировать текст"
    aria-label="Редактировать текст">
    <img src="edit.svg">
</button>
1.5

Указывайте язык контента

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

Если в тексте есть символы другого алфавита, оберните их в тег span с атрибутом lang и укажите в нем нужный язык.

Мы сотрудничаем с НКО, которые измеряют социальный эффект (social impact) своей деятельности — то есть регулярно отслеживают, какие изменения в жизни общества произошли благодаря их работе
  • HTML
  • aria-label
<p>Мы сотрудничаем с НКО, которые измеряют социальный
эффект <span lang=“en”>(social impact)</span> своей
деятельности — то есть регулярно отслеживают, какие
изменения в обществе произошли благодаря их работе</p>
1.6

Проверьте уровень смещения макета

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

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

2.1

Добавляйте уникальное название для каждой страницы

Первое, что слышит пользователь со скринридером — название страницы. Поэтому добавляйте в тег title уникальное название для каждой страницы.

Имя страницы отображается в названии вкладки браузера. Это помогает пользователям быстрее найти нужную вкладку и вспомнить, что на ней.

Если у пользователя открыто много вкладок, то ему будет видно только начало заголовка страницы. Поэтому старайтесь выносить в него наиболее важную информацию.

Пример правильной иерархии заголовков
  • HTML
  • <title>
<head>
    <title>Web — Гайд цифровой доступности МТС: Практики
    доступности</title>
</head>
2.2

Убедитесь, что элементы попадают в фокус в правильном порядке

Фокус должен идти по порядку — слева направо, сверху вниз — и нигде не застревать.

Атрибут tabindex поможет убрать фокус с элемента или добавить его. Используйте:

  • tabindex="-1″, если вам нужно убрать фокус с интерактивного элемента;
  • tabindex="0″, если вам нужно поставить фокус на неинтерактивный элемент.

В этих случаях порядок элементов для фокуса будет устанавливаться на усмотрение браузера.

Но рекомендуем ориентироваться на естественный порядок, а tabindex использовать только в исключительных случаях, когда важна особая последовательность.

Пример правильной иерархии заголовков
2.3

Придерживайтесь иерархии заголовков

Незрячие пользователи не могут ориентироваться по размеру шрифта или его начертанию. Для них уровень заголовка определяется его разметкой.

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

Соблюдайте логическую последовательность заголовков от самого крупного h1 к самому мелкому h6. Старайтесь не пропускать уровни.

  • HTML
  • <title>
<h1>Доступная Web-разработка</h1>
    <h2>Навигация</h2>
        <h3>Добавляйте уникальное название...</h3>
        <h3>Убедитесь, что элементы...</h3>
        <h3>Придерживайтесь иерархии...</h3>
        <h3>Оборачивайте навигацию...</h3>
        <h3>Добавляйте хлебные...</h3>
        <h3>Сделайте ссылку...</h3>
        <h3>Используйте семантические...</h3>
2.8

Используйте семантические теги

Ориентиры — это атрибуты, которые добавляются к смысловым блокам страницы. Они нужны, чтобы создавать семантические разделы на странице и помочь пользователям со скринридером легче перемещаться по сайту.

Самые распространенные ориентиры в HTML:

  • header — для шапки сайта;
  • nav — для навигации;
  • main — для основного контента;
  • aside — для дополнительного контента;
  • section — для разделения страницы на смысловые блоки;
  • footer — для подвала сайта.
Пример правильной иерархии заголовков

Web:

Вся информация в вашем продукте должна быть доступной, понятной, удобной, а взаимодействие пользователя с ней — логичным, знакомым и универсальным

3
3.1

Добавляйте изображениям осмысленные альт-тексты

С помощью атрибута alt указывайте описания для изображений, которые иллюстрируют текст.

Если у изображения не будет альт-текста, скринридер может не сообщить о его наличии или сказать пользователю, что перед ним изображение без описания. Это не даст человеку никакой информации.

Ванная комната с двумя раковинами и ванной
  • HTML
  • alt
<img src="img.jpg" alt="Ванная комната с двумя раковинами
и ванной">
3.2

Указывайте название для SVG

У ценных SVG-изображений тоже должен быть альт-текст.

Добавьте роль role="img" для изображения, а альт-текст укажите с помощью aria-label или сочетания title и aria-labelledby.

Пример правильной иерархии заголовков
  • HTML
  • aria-label
<svg aria-label="Логотип" role="img" width="276"
height="15" viewBox="0 0 276 15" fill="none"
xmlns="http://www.w3.org/2000/svg">
  • HTML
  • aria-labelledby
  • title
<svg role="img" width="276" height="15" viewBox="0 0 276
15" fill="none" xmlns="http://www.w3.org/2000/svg">
<title id="name">Логотип</title>
3.3

Расшифровывайте сложные изображения

Для сложных изображений, например, диаграмм, графиков или карт, добавляйте короткое описание в атрибут alt.

Подробную информацию выносите в тег figcaption. Чтобы визуально скрыть информацию от пользователя, используйте класс .visually-hidden.

При необходимости с помощью атрибута longdesc укажите адрес документа, где находится описание.

Пример правильной иерархии заголовков
  • HTML
  • <figcaption>
<figure role="group">
    <img src="chart.png" alt="График посещений сайта mts.ru за первое полугодие"
    class="width-80">
    <figcaption>
        <a href="mts.ru">График посещений сайта mts.ru за первое полугодие</a>
    </figcaption>
</figure>
3.4

Используйте в таблицах семантические теги

Создавайте таблицы с помощью тега table. Заголовок таблицы оборачивайте в тег caption или добавляйте в атрибут aria-label или aria-labelledby.

Для ячеек-заголовков используйте тег th, а для связывания ячейки с данными — атрибут scope="col" и scope="row".

Это поможет незрячим пользователям ориентироваться в таблице. Скринридер назовет заголовки таблицы и сообщит, в какой колонке и строке человек находится.

Если таблица не отображается и нужна только в качестве разметки, используйте для нее role="presentation". Так скринридер не будет зачитывать лишнюю семантику.

Пример правильной иерархии заголовков
  • HTML
<table>
    <caption>Статус разделов</caption>
    <thead>
        <tr>
            <th scope="col">№</th>
            <th scope="col">Название раздела</th>
            <th scope="col">Статус</th>
        </tr>
    </thead>
    <tbody>
        ...
    </tbody>
<table>
3.5

Убедитесь, что у видео со звуком есть субтитры

Видео со звуком должно сопровождаться синхронизированными субтитрами. Они могут быть либо встроены в видео, либо появляться при нажатии на соответствующую кнопку.

Все, что сказано в видео, должно быть в субтитрах. А все, что написано в субтитрах, должно быть в видео.

3.6

Избегайте автоматического воспроизведения контента

Неожиданное включение видео или аудио может сбить с толку любого человека. Особенно, если пользователь находится в месте, где нужно соблюдать тишину, например, в кино.

Автовоcпроизведение также может заглушить звук скринридера и пользователю будет труднее найти кнопку паузы или остановки.

Web:

Даже если вы учли все нюансы, ошибки все равно могут всплыть. Чтобы сократить количество возможных проблем, проводите отладку кода

5
5.1

Проверьте масштабирование

Проверьте, что страницу или отдельно текст можно увеличить минимум до 200%.

Убедитесь, что интерфейс при этом корректно перестраивается. Например, элементы не должны перекрывать друг друга и смешиваться.

Сайт также должен поддерживать планшетную и мобильную версии и не иметь горизонтальный скролл.

5.2

Используйте Линтеры и плагины для кода

Линтеры и плагины помогут автоматизировать проверку кода, а также легче и быстрее интегрировать цифровую доступность в веб.

Рекомендуем использовать stylelint-a11y, eslint-plugin-jsx-a11y, eslint-plugin-react-native-a11y и aatt.

5.3

Проверьте валидность верстки

Онлайн-валидатор W3C поможет понять, насколько верстка соответствует международным стандартам цифровой доступности.

С ним можно узнать не только о серьезных проблемах доступности сайта, но и получить рекомендации по оптимизации кода и верстки.

Валидатор отображает два типа уведомлений: предупреждение — сообщение о некритичных ошибках и ошибка — сообщение о серьезной проблеме, которую необходимо устранить.

Гайды доступности