Используйте паттерн visually-hidden:
.visually-hidden {
/* Удаляем элемент из потока документа */
position: absolute;
/* Временное решение для неверно произносимого, размазанного текста */
white-space: nowrap;
/* Устанавливаем минимально возможный размер (некоторые скринридеры игнорируют элементы с нулевой высотой и шириной) */
width: 1px;
height: 1px;
/* Скрываем вылезающий за границы контент */
overflow: hidden;
/* Сбрасываем любые свойства, которые могут повлиять на размер элемента */
border: 0;
padding: 0;
/* Вырезаем ту часть контента, которая должна отображаться. */
/* Устаревшее свойство clip для старых браузеров */
clip: rect(0 0 0 0);
/* clip-path для новых браузеров. inset(50%) определяет область вставки, которая позволит контенту исчезнуть. */
clip-path: inset(50%);
/* Похоже, никто до конца не понимает, почему тут margin: -1px. Кроме того, это приводит к проблемам (читай: https://github.com/h5bp/html5-boilerplate/issues/1985). */
margin: -1px;
}