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

Многие пользователи с ограниченными двигательными возможностями полагаются на клавиатуру. Слепые пользователи также обычно используют клавиатуру для навигации. У некоторых людей бывает тремор, который не позволяет контролировать мышцы.

Обычно пользователь может выбрать ссылку с помощью клавиши Tab и вернуться к предыдущей ссылке с помощью клавиш Shift + Tab. Есть некоторые встроенные элементы HTML, которые интерактивны с клавиатуры, например ‹a›, ‹button›, ‹input›, ‹select ›Итекстовое поле ›. Иногда разработчикам приходится связывать событие щелчка с ‹div›, ‹span›, или любым другим тегом HTML. В таких случаях элемент можно сфокусировать, добавив tabindex. (Чтобы узнать больше об этом, см. Практика разработки WAI-ARIA).

Первым шагом является добавление дизайна для элемента (например, тега привязки или кнопки и т. Д.), Который выбирается с клавиатуры. Для этого мы используем псевдокласс : focus. Допустим, у нас есть кнопка, на которую мы хотим добавить сфокусированный дизайн.

button:focus {
    outline: none !important;
    box-shadow: 0 0 2px 2px #52514f;
    -webkit-box-shadow: 0 0 0 2px #52514f;
    -moz-box-shadow: 0 0 0 2px #52514f;
}

При выборе элемента с помощью клавиатуры он будет выглядеть так:

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

Итак, как нам решить эту проблему? Одним из таких решений является псевдоэлемент : focus-visible. К сожалению, этот псевдоэлемент сейчас работает только в Firefox. Для других браузеров разработчики используют различные хаки, но у всех хаков есть свои ограничения.

Найдем решение!

Чтобы решить эту проблему, я нашел простое решение в Angular using директивы. Вам просто нужно создать директиву и добавить прослушиватель событий для события mousedown в вашем элементе с помощью декоратора @hostlistener. Hostlistener объявляет событие DOM для прослушивания и предоставляет метод обработчика для запуска при возникновении этого события.

Но что мы делаем в этой директиве? При возникновении события mousedown мы просто добавляем к этому элементу класс focus-hide. Событие mousedown происходит, когда левая кнопка мыши нажимается на выбранный элемент.

@Directive({
  selector: '[focusHide]'
})
export class FocusHideDirective {
@HostListener("mousedown", ["$event"])
public onMouseDownTrigger(event: any) {
   event.srcElement.classList.add("focus-hide")
}

Затем мы добавим дизайн CSS в класс .focus-hide и отключим все наши дизайны фокуса.

button:focus {
    outline: none !important;
    box-shadow: 0 0 2px 2px #52514f;
    -webkit-box-shadow: 0 0 0 2px #52514f;
    -moz-box-shadow: 0 0 0 2px #52514f;
&.focus-hide {
       box-shadow: none !important;
    }
}

Затем добавьте свою директиву в свой HTML-тег следующим образом:

<button class="btn" focusHide>Button</button>

НЕТ! Что, если пользователь захочет выбрать этот элемент с помощью клавиатуры сейчас? Многие пользователи используют и клавиатуру, и мышь для просмотра веб-страницы. Мы создадим еще один @hostlistener для события focusout и удалим класс focus-hide (и вуаля!). Событие focusout запускается, когда элемент собирается потерять фокус.

@HostListener(“focusout”, [“$event”])
public onFocusOutTrigger(event: any): void {
   event.srcElement.classList.remove(“focus-hide”)
}

Полный пример вы можете посмотреть на GitHub здесь,

Спасибо, что прочитали мой первый пост на Medium 😃 Не забывайте хлопать!

Ссылка

  1. Https://developer.mozilla.org/en-US/docs/Web/CSS/:focus-visible
  2. Https://angular.io/guide/attribute-directives
  3. Https://angular.io/api/core/HostListener
  4. Https://www.w3.org/TR/wai-aria-practices-1.1