Какие основные ошибки при работе с Accessibility

Ответ

  1. Отсутствие альтернативного текста для изображений (alt)
    <!-- Плохо -->
    <img src="logo.png">

    <!-- Хорошо -->
    <img src="logo.png" alt="Логотип компании">
  1. Некорректное использование семантических тегов
    Использование div вместо button, nav, header и т.д. лишает пользователей скринридеров контекста.

  2. Низкая контрастность текста
    Текст должен соответствовать WCAG (минимум 4.5:1 для обычного текста).

  3. Отсутствие фокусируемых элементов
    Убедитесь, что все интерактивные элементы (a, button) доступны с клавиатуры (Tab/Shift+Tab).

  4. Динамический контент без ARIA-атрибутов
    Например, скрытые меню или модалки без aria-expanded или aria-modal.

  5. Автовоспроизведение медиа
    Видео/аудио без управления мешают пользователям скринридеров.

  6. Недоступные кастомные элементы
    Кастомные чекбоксы или радиокнопки без правильных role и aria-* атрибутов.

Пример доступного кастомного чекбокса:

<div role="checkbox" aria-checked="false" tabindex="0">Подписаться</div>

Всегда проверяйте сайт инструментами вроде axe DevTools или WAVE.

Ответ 18+ 🔞

А, ну это же классика, блядь! Сидишь такой, верстаешь, думаешь — ну что может пойти не так? А потом приходит этот, с палочкой, и начинает тебе мозги выносить на раз-два. Ёпта, я тебе сейчас по пунктам разложу, что обычно забывают, чтобы ты не попал в просак.

Первое, и самое любимое — картинки без подписи. Ну серьёзно, чувак, ты что, думаешь, все видят? Человек со скринридером слушает твой сайт, а там: «Изображение, логотип-пнг». И всё. Пиздец как информативно. В рот меня чих-пых! Добавь alt, не будь мудаком.

<!-- Так — говно. Человек нихуя не поймёт -->
<img src="logo.png">

<!-- А так — уже красота. Уважение на лицо. -->
<img src="logo.png" alt="Логотип компании «Рога и копыта»">

Второе — семантика, ёб твою мать. Ты всю жизнь кнопки в div заворачивал? Ну и как, хорошо? А скринридер видит просто «блок» и нихуя не понимает, что на него можно нажать. Используй нормальные теги: button для кнопок, nav для навигации, header для шапки. Это же не просто так придумали!

Третье — контрастность. Ты что, дальтоник? Серый текст на светло-сером фоне — это пиздец как нечитаемо. Есть стандарты WCAG, блядь. Минимум 4.5 к 1 для обычного текста. Проверь, а то окажешься тем самым пидарасом, который сделал сайт только для молодых и здоровых.

Четвёртое — клавиатура. Представь, что у тебя сломалась мышь или тачпад. Или ты просто не можешь ей пользоваться. Как ты будешь по сайту перемещаться? Tab должен ходить по всем интерактивным штукам — ссылкам, кнопкам, полям ввода. Если он где-то проваливается в пустоту — это твой косяк, дружок.

Пятое — динамика. Модальное окно выскакивает, меню раскрывается, а скринридер об этом нихуя не знает. Он живёт в своём мире. Надо ему подсказывать. Для этого есть ARIA-атрибуты. Модалке — aria-modal="true", выпадашке — aria-expanded="true/false". Без этого — полный ахтунг.

Шестое — медиа. Представь, ты слушаешь скринридер, а тут внезапно начинает орать рекламный ролик про «уникальное предложение». Хули? Сделай так, чтобы всё медиа не стартовало само, либо дай кнопку паузы сразу. Уважай чужое внимание.

Седьмое — свои кастомные штуки. Захотелось красивый чекбокс? Ну сделал ты его на div-ах, стили навесил, а доступность похерил. Надо ему роль прописать и состояние.

<!-- Кастомный чекбокс, который хотя бы попытался -->
<div role="checkbox" aria-checked="false" tabindex="0" id="subscribe">Подписаться на спам</div>

И главное — проверяй, блядь! Не на глазок. Есть куча инструментов: axe DevTools, WAVE. Запустил, увидел ошибки — поправил. И не будет тебе потом стыдно, когда приедет проверка или просто адекватный человек с ограничениями захочет твоим сайтом воспользоваться.

Вот и вся наука. Не так страшен чёрт, как его малюют. Главное — не забывать, что ты делаешь не для себя, а для всех.