Как скрыть элемент визуально, но оставить для скринридеров
Короткий ответ
Сделайте элемент размером в 1 пиксель, вырежьте его через clip-path и уберите из потока:
<style>
.sr-only { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; }
</style>
<button>🛒 <span class="sr-only">Cart, 3 items</span></button>На экране видна только иконка, а скринридер прочитает «Cart, 3 items». Класс обычно называют sr-only или visually-hidden и держат в общих стилях сайта.
Где это нужно
- Подпись к полю, если дизайн её не предусматривает, — например, к полю поиска с кнопкой-лупой.
- Пояснение к иконке или к ссылке «Читать далее» («…about coffee roasting»).
- Заголовок раздела, который виден глазу по оформлению, но нужен в структуре страницы.
Обратная задача
Иногда нужно наоборот: показать элемент глазами, но скрыть от скринридера, — например, декоративную иконку рядом с текстом. Для этого есть атрибут aria-hidden="true":
<p><span aria-hidden="true">★★★★☆</span> <span class="sr-only">Rating: 4 out of 5</span></p>Частая ошибка
Текст для скринридеров прячут через display: none или hidden. Такие элементы не видят и программы чтения с экрана — подсказка пропадает для всех. Скрытие с помощью opacity: 0 тоже не подходит: элемент остаётся на месте и занимает пространство.
Функции из этого ответа
- clip-path — Обрезает элемент по фигуре: видимой остаётся только часть внутри неё.
- position — Как позиционируется элемент: в обычном потоке или по смещениям.
- overflow — Что делать с содержимым, которое не помещается в элемент.
- aria-* — Атрибуты доступности: роль, название и состояние элемента для программ чтения с экрана.
- hidden — Скрывает элемент: он не показывается и недоступен программам чтения с экрана.