В HTML, как я могу получить текст, доступный только для чтения с экрана (т.е. Для слепых)?

У меня есть веб-сайт, на котором есть цветные div с цифрами, например, красный блок с цифрой 2 внутри. Цвет важен для понимания. Слепой пользователь отправил мне электронное письмо с вопросом, могу ли я сказать "2 красных" для его программы чтения с экрана.

Я попытался добавить это как alt= "2 red", но он сказал, что ничего не сделал. Он думает, что он может читать только альтернативные теги для изображений.

Есть ли хороший способ сделать это для divs?

Ответ 1

Что касается alt text, вы правы, это работает только для изображений. Но вы можете использовать aria-label вместо атрибута alt для таких элементов без изображения:

Решения, которые работают

Маркировка ARIA ★ ★ ★ ★ ★ ★

aria-label (чтобы не сфокусироваться на aria-labeledby) используется для добавления внеэкранного описательного содержимого к элементу, значительно отличающемуся от атрибута alt=, добавляющего внеэкранный описательный контент к изображениям, которые будут использоваться, когда изображения не отображаются.

Разница заключается в том, что aria-label может использоваться для элементов без изображения.

<div aria-label="test A"><p aria-hidden="true">test B</p></div>
<!--
     result (screenreaders):  test A
     result (regular):        test B
-->

Добавление атрибута aria-hidden скрывает внутренний текст.

Позиция + Клип + Свернуть ★ ★ ★ ★

.screenreader {
    position: absolute !important; /* Outside the DOM flow */
    height: 1px; width: 1px; /* Nearly collapsed */
    overflow: hidden;
    clip: rect(1px 1px 1px 1px); /* IE 7+ only support clip without commas */
    clip: rect(1px, 1px, 1px, 1px); /* All other browsers */
}

Клип используется, чтобы полностью скрыть элемент 1px x 1px, в противном случае он все равно будет отображаться на экране.

Позиция ★ ★ ★

.screenreader {
    position: absolute;
    left:-9999px;
}

<div>Wed<span class="screenreader">nesday</span>, Sept<span class="screenreader">ember</span> 24, 2014</div>

Отступ ★

.screenreader {
    text-indent: -5000px;
}

Фактическое значение отступа не имеет значения, если оно находится вне диапазона макета ваших страниц. Пример приведет к перемещению содержимого влево на 5 000 пикселей.

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

Не работает

видимость: скрытая; и/или отображение: none;

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

<ударa > ширина: 0px; высота: 0pxудаp >

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

Далее:

Ответ 2

Если иное не указано в принятом ответе, по крайней мере, Chromevox 1и NVDA 2 также читают элементы со стильным display:none или visibility: hidden атрибуты CSS, если установлено aria-hidden=false. Однако в настоящее время только в Chrome (65), а не в Firefox или Edge (по моим тестам).

Итак (в настоящее время, к сожалению, только в Chrome) также можно сделать что-то вроде этого:

<h1 aria-hidden="false" style="display: none;">Heading only for Screen Readers</h1>
<h1 aria-hidden="false" style="visibility: hidden;">Second Heading only for Screen Readers</h1>
<h1 aria-hidden="true">Heading only for Screen</h1>

где Chromevox и NVDA читают первый и второй заголовок. Также см. Это: https://jsfiddle.net/4y3g6zr8/6/

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

1 Chromevox https://chrome.google.com/webstore/detail/chromevox/kgejglhpjiefppelpmljglcjbhoiplfn2 NVDA https://www.nvaccess.org/

Ответ 3

Вы можете поместить визуально скрытый элемент внутри:

<div>
    <span class="visually_hidden">2 red</span>
</div>

Чтобы "визуально скрывать", вы можете охарактеризовать, как это делает HTML5:

.visually_hidden { 
    border: 0; 
    clip: rect(0 0 0 0); 
    height: 1px; 
    margin: -1px; 
    overflow: hidden; 
    padding: 0; 
    position: absolute; 
    width: 1px; 
}

Ответ 4

Относительно вопроса в заголовке: Нет, нет способа (в HTML или иначе) иметь текст, доступный только для чтения с экрана. Независимо от того, что вы можете сделать, например, с помощью элемента img с непустым атрибутом alt и отсутствующим или dysfunct src атрибутом "или с помощью CSS, чтобы скрыть что-то визуально, будет доступно любое программное обеспечение, которое его прочитает (и могут быть недоступны для чтения с экрана по той или иной причине).

С другой стороны, если вы действительно используете, например,

<div class=foo>2 <img alt=red></div>

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

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

В конкретном случае может быть простое решение, или это может быть сложной проблемой без хорошего решения. Общие замечания и различные методы см. В документе Как встретить WCAG 2.0: использование цвета.

Ответ 5

Как насчет того, чтобы сделать цвет шрифта полностью прозрачным? У меня нет программы чтения с экрана, чтобы проверить, читается ли этот тип текста программами чтения с экрана.

.hovereffect a.info {
    color: #9c27b000 !important;
}