Соответствие WCAG - элемент с кнопкой role = и без содержимого

Я пытаюсь разработать веб-приложение, совместимое с WCAG, в настоящее время codeniffer дает мне много:

Этот элемент выполняет роль «кнопки», но не имеет имени, доступного для API специальных возможностей. Допустимые имена: содержимое элемента.

Из этого HTML:

<span unselectable="on" class="k-select" aria-label="abcd" role="button"  alt="abcd" title="abcd" value="abcd">
  <span class="k-icon k-i-calendar"></span>
</span>

Установка alt, value, title и aria-label, похоже, бесполезна. Как мне получить совместимый с WCAG элемент с role = "button" без текста внутри?


person Mohammad Sepahvand    schedule 07.06.2017    source источник


Ответы (2)


Вы можете использовать элемент button с атрибутами aria-label и title:

 <button class="k-select" role="button"
        aria-label="alternative for screen readers"
        title="alternative for other users"
        value="abcd">
   <span class="k-icon k-i-calendar"></span>
 </button>
person Adam    schedule 07.06.2017
comment
Спасибо, Адам. Единственная проблема заключается в том, что этот вывод создается сторонним компонентом, поэтому я не могу изменить диапазон на кнопку, я закончил тем, что отказался от компонента и использовал другой, который имеет встроенную поддержку wcag. - person Mohammad Sepahvand; 25.06.2017

Адам прав, преобразовав это в <button>. Это лучший подход с самого начала, а также означает, что вы можете сбросить файл role="button". Это также означает, что вы получаете доступность взаимодействия бесплатно (например, вам не нужно слушать клавишу пробела или клавишу Enter).

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

Итак, рассмотрим этот HTML:

<button class="k-select">
  <span class="k-icon k-i-calendar">Calendar</span>
</button>

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

Теперь примените это правило CSS, чтобы визуально скрыть этот текст:

.k-icon {
  position: absolute;
  top: auto;
  overflow: hidden;
  clip: rect(1px 1px 1px 1px); /* IE 6/7 */
  clip: rect(1px, 1px, 1px, 1px);
  width: 1px;
  height: 1px;
  white-space: nowrap; /* https://medium.com/@jessebeach/beware-smushed-off-screen-accessible-text-5952a4c2cbfe */
}

Обычно у меня это служебный класс (.visually-hidden), так что я могу применять его где угодно.

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

При таком подходе вам не понадобится ни ARIA, ни одноразовые решения для кода, ни какой-либо скрипт. Сначала это работает с вашими значками (настоящая проблема) и означает, что, когда эти значки используются где-то еще (ссылки, кнопки и т. Д.), Они становятся доступными.

Кроме того, для кнопки нельзя использовать ни alt, ни value. aria-label не нужен. Определенно избегайте title.

person aardrian    schedule 07.06.2017
comment
Вы обязательно должны установить атрибут title на кнопке при скрытии текста, чтобы предоставить правильную видимую альтернативу значку для 99% людей, не использующих программу чтения с экрана, которые не поймут, что может означать странный квадрат, похожий на школьную сумку. Мы определенно должны прекратить эту политику визуального сокрытия / избегания заголовков, которая не помогает подавляющему большинству пользователей. - person Adam; 11.06.2017
comment
title ничего не делает для пользователей сенсорных дисплеев (или гибридных дисплеев, которые не используют мышь). Только IE10 + отображает title в фокусе клавиатуры. Я понимаю, почему вы хотите применить это здесь, но title - неадекватная альтернатива, которая заставляет разработчиков думать, что они делают что-то доступным, хотя это не так. Вопрос касался сбоя WCAG, и многие аудиторы откажут кнопку, которая использует только title. Вопрос также коснулся API-интерфейса 11y, и title непоследовательно обрабатывается браузерами в API. - person aardrian; 12.06.2017
comment
Если мы понимаем, что скрытие текста не является правильной альтернативой для 99% пользователей, использование как title , так и aria-label - это решение, которое охватит гораздо больше пользователей. Но вы правы, безусловно, постоянный видимый текст - лучшее, что можно сделать для сенсорных дисплеев, когда значка недостаточно. - person Adam; 12.06.2017
comment
@aardrian Отличный ответ. Я применяю это к другому сценарию, где я открываю ссылку в новой вкладке target = _blank, чтобы просто визуально скрыть текст. - person Mohammad Sepahvand; 28.06.2017