Фокус не перекрыт

  • WCAG
  • Клавиатура

В Руководстве по доступности веб-контента 2.2 (Web Content Accessibility Guidelines 2.2) появилось восемь новых критериев. Два из них связаны с головной болью пользователей клавиатуры (заодно и сообщества специалистов по доступности) — перекрытием элемента в фокусе другим содержимым. Это критерии 2.4.11: фокус не перекрыт (минимальный) уровня AA и 2.4.12: фокус не перекрыт (продвинутый) уровня AAA.

Коротко о критериях

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

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

Исключения из минимального критерия — открытые пользователем элементы и компоненты, которые можно перемещать по странице (например, путём перетаскивания).

Продвинутый критерий 2.4.12 не допускает элементов в фокусе, даже когда их содержание лишь слегка скрыто другим содержимым.

Подробнее

Многие хоть раз оказывались на сайте с выпадающей навигацией в которой пункты скрыты визуально и, при этом, доступны для навигации с клавиатуры. Эту проблему с навигацией и пытаются предотвратить критерии 2.4.11 и 2.4.12.

Элементы с клавиатурным фокусом также могут перекрывать:

  • другие дропдаун-элементы: комбинированные списки, гамбургерное меню, поля для выбора даты.
  • Фиксированные (прилипающие) элементы: хедер, футер, боковая навигация, куки-баннеры.
  • Попапы: сообщения от чат-ботов, уведомления, тултипы и другие всплывающие подсказки.
  • Немодальные и (недо)модальные диалоговые окна без ловушки фокуса: информация о куки или о подписке на рассылку.
  • Элементы с произвольным положением в интерфейсе: стикеры на виртуальной канбан-доске, цветовая палитра в инструменте для дизайнеров.

Не все дропдауны «плохие». Критерии о перекрытии элемента в фокусе рассматривают два основных случая с дропдаунами. Первый случай — изначально открытый элемент, например, боковое меню с навигацией по сайту. Вторая ситуация — неправильно свёрстанный дропдаун. К примеру, внушительная навигация с подменю, которая открывается с клавиатуры и не закрывается по нажатию на Esc или другие клавиши.

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

Фиксированный баннер с куки — другой проблемный паттерн дизайна. Особенно рискуют нарушить минимальный критерий баннеры с длинными текстами. Куки-баннеры часто расположены после остального содержимого. Из-за этого пользователям клавиатуры приходится идти в конец страницы, содержимое которой скрыто за баннером, чтобы закрыть сообщение о куки.

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

Диалоговые окна — отдельная боль. Большинство открытых по умолчанию немодальных окон, особенно расположенных по центру экрана, нарушат минимальный критерий 2.4.11. Распространённый пример подобных диалогов — настройки куки.

Критерий 2.4.11 не имеет ничего против модальных окон. Модальный диалог не нарушит критерий, даже если свёрстан не совсем правильно. К примеру, пользователь может проскроллить страницу с модальным диалогом мышкой или другим указателем. Главное, чтобы модалка по-настоящему не давала устанавливать фокус с клавиатуры на элементах за ней.

Особый случай, который описывает 2.4.11, — элементы с эффектом стекла или с полупрозрачностью. К примеру, полупрозрачные всплывающие подсказки и фиксированная навигация по сайту.

Чтобы пройти минимальный 2.4.11, «просвечивающий» компонент должен соответствовать другому критерию 1.4.11: нетекстовый контраст. Для него проверяют соотношение контраста между цветом интерактивного элемента и фоном наложившегося.

Представьте полупрозрачный тултип в тексте, который полностью закрывает ссылку из предыдущей строки. В этом случае нужно сравнить цвет ссылки, получившийся после смешения с фоном тултипа, и сам фон всплывающей подсказки.

Например, цвет ссылки после смешения с фоном — #232323 (ранняя ночь), а фон наложившегося тултипа — #373737 (приглушённый серый). Соотношение контраста между цветами 1.32:1. Это ниже минимального значения для нетекстовых элементов. Таким образом, критерий 2.4.11 провален.

Тултип с дополнительным пояснением к ссылке «Австралия» полностью закрыл собой другую ссылку из текста про утконоса.
Пример с полупрозрачным тултипом.

В воображаемом примере мы не сравнивали цвет индикатора фокуса. Нам не важен внешний вид индикатора, кроме двух ситуаций:

  • если индикатор находится внутри компонента в фокусе;
  • когда элемент в состоянии фокуса сильно изменяется.

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

Две кнопки скрыты полупрозрачным верхним слоем.
Примеры кнопок с разными стилями для состояния фокуса.

Перемещающиеся по странице элементы нарушат минимальный критерий, если с самого начала перекрывают ссылки, кнопки и другие интерактивные элементы интерфейса.

Ощущение недосказанности

В описании критериев я не нашла ответов на несколько своих вопросов.

Как проверять ссылки в виде карточек с картинками, заголовками и краткими описаниями? Например, ссылка с текстом и графикой (или только с графикой), у которой видна только часть картинки.

Что делать со ссылкой в фокусе, когда её текст сливается с фоном страницы, и видна только обводка вокруг? Даже если ссылка перекрыта чем-то ещё частично, мы не видим сам элемент.

Кому это важно

В первую очередь частично или полностью перекрытые элементы в состоянии фокуса — барьер для пользователей клавиатур. Это могут быть как обычные, так и кастомные или экранные типы.

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

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

Следующая группа — те, кто пользуется указателями для навигации (мышки не в счёт). К примеру, стилусами, головными указателями и джойстиками.

Не забывайте про пользователей с когнитивными особенностями, затрагивающими память и внимательность. Например, людей с синдромом дефицита внимания и гиперактивности (СДВГ), постковидным синдромом или травмами головного мозга. Такие пользователи могут чаще других отвлекаться и забывать о текущем положении и последних действиях на странице.

Как избежать барьер

Самое простое решение — не фиксировать объёмную навигацию в хедере и футере, особенно на маленьких экранах. Вообще, чем больше места занимают подобные элементы, тем больше содержимого они скрывают. Можно сэкономить место, уменьшив прилипающий хедер при прокрутке.

Следующий помощник — scroll-padding. Это CSS-свойство увеличивает расстояние между фиксированным элементом и остальным содержимым страницы.

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

Верстайте модальные окна правильно. Не давайте пользователям попасть на страницу, пока они не закроют модалку.

Чтобы решить проблему с перекрывающим всё на свете сообщением о куки, можно попробовать следующее:

  • разместить его в самом начале страницы и вообще не фиксировать;
  • показать его в настоящем модальном окне.

Примеры соответствия критериям

При фокусе на ссылках со страницы статьи из Википедии появляются тултипы с картинками и текстом. Некоторые ссылки частично перекрываются раскрытой подсказкой. Тултип исчезает при переходе к новой ссылке, но не закрывается с помощью Esc.

У ссылки на список всех выпусков открыт тултип. Подсказка частично перекрывает картинку с синей обводкой вокруг. От первого слова видны последние буквы «AR», от второго слова — «CE».
Статья про журнал «Popular Science».

Так как интерактивные элементы в фокусе скрываются подсказкой частично, страница соответствует критерию 2.4.11: фокус не перекрыт (минимальный).

В блоге Transcend хедер фиксируется при прокрутке страницы вниз и вверх. При перемещении с клавиатуры по странице ни один интерактивный элемент не скрывается за хедером.

Наверху зафиксирована навигация из трёх пунктов. Навигация перекрывает параграф текста без ссылок. В следующем параграфе ссылка «CPRA modified regulations» обведена чёрной рамкой и полностью видна.
Страница одного поста из блога Transcend.

Страница соответствует и минимальному критерию 2.4.11, и максимальному 2.4.12: фокус не перекрыт (продвинутый).

В главной вкладке YouTube Studio автоматически появляется уведомление с интерфейсной подсказкой. Этот элемент не закрывает собой активные ссылки. Это соответствует минимальному критерию 2.4.11.

Справа от боковой навигации развёрнут тултип с подсказками о командной работе с каналом. Хвостик тултипа указывает на полностью видимый пункт «Settings». Рядом с тултипом и под ним нет других интерактивных элементов.
YouTube Studio.

Примеры барьеров

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

Одну из ссылок в футере баннер вообще полностью перекрывает. Цвет текста ссылки — #808080 (серый), цвет фона куки-баннера — #4c4c4c (кварцевый серый). Соотношение уровня контраста между двумя цветами — 2.17:1. Это ниже минимального значения для нетекстовых элементов (3:1). Из-за этого сайт не соответствует критерию 2.4.11 уровня AA.

Часть текста «Our site uses…» из полупрозрачного баннера накладывается на ссылку «NHK». Ссылка обведена чёрной рамкой, видна только верхняя часть букв. Рядом, на отдельном скриншоте, показана эта же ссылка, когда она полностью видна.
Сайт NHK World Japan.

На сайте университета Стокгольма немодальное окно с информацией про куки выровнено по центру экрана.

Немодальное окно полностью закрывает часть ссылок в фокусе. Из-за этого сайт не соответствует минимальному критерию 2.4.11.

Из-под баннера с белым фоном выглядывает часть карточки. Виден текст и половина картинки с цветочным полем. На отдельном скриншоте карточка показана полностью. Ссылка «Stockholms universitet paa plats 147 i QS-rankningen» обведена синей рамкой.
Главная университета Стокгольма.

При первом открытии главной посольства Австрии в Токио появляется окно с сообщением о куки. Визуально, из-за затемнённого фона, окно выглядит модальным. При этом мы всё ещё можем навигироваться по странице с клавиатуры, когда окно открыто. Из-за этого названия части полей, ссылок и кнопок полностью перекрываются. Значит, страница не соответствует критерию 2.4.11 уровня AA.

Под окном с согласием на сбор куки видна часть чёрной рамки вокруг поля. Рядом скриншот с полностью видимым полем для сравнения. В поле введён текст «I am human».
Сайт посольства Австрии в Токио.

Как тестировать

Оба критерия можно протестировать как автоматически, так и вручную.

С автоматическим тестированием теоретически помогут букмарклеты.

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

Временное полуавтоматическое решение — отдельные букмарклеты для показа стилей фокуса (Show focus styles) и ручное открытие окон, дропдаунов и похожих элементов.

Для ручного тестирования понадобится клавиатура. Примерные этапы тестирования:

  • Убедитесь, что на странице есть интерактивные элементы (кнопки, ссылки и другие).
  • Найдите элементы, которые накладываются поверх остального содержимого.
  • Пройдитесь по всем интерактивным элементам с помощью Tab и Shift Tab.
  • Повторите предыдущие шаги для других брейкпоинтов.

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

  • Узнайте цвет фона верхнего элемента.
  • Определите цвет элемента в фокусе: его исходный цвет без индикатора фокуса, смешанный с фоном наложившегося элемента.
  • Проверьте соотношение контраста между цветами.

Тестировать полупрозрачные компоненты можно с помощью инструментов для проверки контраста цветов. Например, Colour Contrast Analyser (CCA) от TPGi и WCAG Color Contrast Checker от Accessible Web.

Если каждый интерактивный элемент в фокусе виден полностью или частично, страница соответствует 2.4.11: фокус не перекрыт (минимальный) уровня AA.

Если полупрозрачные элементы полностью перекрывают элементы в состоянии фокуса, а соотношение контраста между цветами составляет 3:1 и выше, страница также соответствует минимальному критерию.

Когда ни один элемент в состоянии клавиатурного фокуса не скрывается другими, страница соответствует 2.4.12: фокус не перекрыт (продвинутый) уровня AAA.

Что почитать

Другие статьи