Подробное руководство по созданию доступных всплывающих уведомлений. Изучите принципы WCAG, роли ARIA и лучшие практики UX для создания инклюзивных временных сообщений.
Всплывающие уведомления: создание доступных и удобных временных сообщений
В быстро меняющемся мире цифровых интерфейсов коммуникация между системой и пользователем имеет первостепенное значение. Мы полагаемся на визуальные подсказки, чтобы понять результаты наших действий. Одним из наиболее распространенных паттернов пользовательского интерфейса для такой обратной связи является всплывающее уведомление («toast») — небольшое немодальное окно, предоставляющее временную информацию. Будь то подтверждение «Сообщение отправлено», уведомление «Файл загружен» или предупреждение «Соединение потеряно», всплывающие уведомления — это незаметные рабочие лошадки обратной связи с пользователем.
Однако их временный и ненавязчивый характер — это палка о двух концах. Хотя для некоторых пользователей они минимально навязчивы, именно эта характеристика часто делает их полностью недоступными для других, особенно для тех, кто полагается на вспомогательные технологии, такие как программы экранного доступа (скринридеры). Недоступное всплывающее уведомление — это не просто незначительное неудобство; это молчаливый сбой, оставляющий пользователей в неуверенности и разочаровании. Пользователь, который не может воспринять сообщение «Настройки сохранены», может попытаться сохранить их снова или просто покинуть приложение, не будучи уверенным, были ли его изменения успешными.
Это исчерпывающее руководство предназначено для разработчиков, UX/UI-дизайнеров и менеджеров по продукту, которые хотят создавать по-настоящему инклюзивные цифровые продукты. Мы рассмотрим внутренние проблемы доступности всплывающих уведомлений, углубимся в технические решения с использованием ARIA (Accessible Rich Internet Applications) и изложим лучшие практики дизайна, которые принесут пользу всем. Давайте узнаем, как сделать эти временные сообщения постоянной частью доступного пользовательского опыта.
Проблема доступности всплывающих уведомлений
Чтобы понять решение, мы должны сначала глубоко разобраться в проблеме. Традиционные всплывающие уведомления часто не соответствуют требованиям доступности по нескольким причинам, связанным с их основными принципами проектирования.
1. Они эфемерны и ограничены по времени
Определяющая особенность всплывающего уведомления — его мимолетность. Оно появляется на несколько секунд, а затем плавно исчезает. Для зрячего пользователя этого времени обычно достаточно, чтобы прочитать сообщение. Однако для пользователя скринридера это является значительным барьером. Скринридер объявляет контент линейно. Если пользователь сфокусирован на поле формы или слушает другой читаемый контент, уведомление может появиться и исчезнуть до того, как скринридер до него доберется. Это создает информационный пробел, нарушая фундаментальный принцип доступности: информация должна быть воспринимаемой.
2. Они не получают фокус
Всплывающие уведомления спроектированы так, чтобы не мешать. Они намеренно не перехватывают фокус с текущей задачи пользователя. Зрячий пользователь может продолжать печатать в текстовом поле, пока появляется сообщение «Черновик сохранен». Но для пользователей, работающих только с клавиатурой, и пользователей скринридеров фокус является основным методом навигации и взаимодействия. Поскольку уведомление никогда не попадает в порядок фокуса, оно невидимо для линейного пути навигации. Пользователю пришлось бы вручную искать по всей странице сообщение, о существовании которого он даже не знает.
3. Они появляются вне контекста
Всплывающие уведомления часто появляются в отдельной области экрана, например, в правом верхнем или левом нижнем углу, вдали от элемента, который их вызвал (например, кнопка «Сохранить» в середине формы). Этот пространственный разрыв легко преодолевается зрением, но нарушает логический поток для скринридеров. Объявление, если оно вообще происходит, может показаться случайным и не связанным с последним действием пользователя, вызывая путаницу.
Связь с WCAG: четыре столпа доступности
Руководство по обеспечению доступности веб-контента (WCAG) построено на четырех принципах. Недоступные всплывающие уведомления нарушают несколько из них.
- Воспринимаемость: Если пользователь с нарушением зрения не может воспринять уведомление, потому что его скринридер его не объявляет, или если у пользователя с когнитивными нарушениями недостаточно времени, чтобы его прочитать, информация не является воспринимаемой. Это относится к Критерию успеха WCAG 2.2.1 «Регулируемое время», который требует, чтобы пользователям было предоставлено достаточно времени для чтения и использования контента.
- Управляемость: Если всплывающее уведомление включает в себя действие, например, кнопку «Закрыть», оно должно быть фокусируемым и управляемым с помощью клавиатуры. Даже если оно информационное, у пользователя должен быть контроль над ним, например, возможность закрыть его вручную.
- Понятность: Содержание уведомления должно быть четким и кратким. Если скринридер объявляет сообщение вне контекста, его смысл может быть непонятен. Это также связано с WCAG 4.1.2 «Имя, роль, значение», который требует, чтобы назначение компонента пользовательского интерфейса было программно определяемым.
- Надежность: Уведомление должно быть реализовано с использованием стандартных веб-технологий таким образом, чтобы оно было совместимо с текущими и будущими пользовательскими агентами, включая вспомогательные технологии. Самодельное всплывающее уведомление, игнорирующее стандарты ARIA, не является надежным.
Техническое решение: на помощь приходят ARIA Live Regions
Ключ к созданию доступных всплывающих уведомлений лежит в мощной части спецификации ARIA: динамических областях (live regions). Динамическая область ARIA — это элемент на странице, который вы помечаете как «живой». Это указывает вспомогательным технологиям отслеживать изменения в содержимом этого элемента и объявлять эти изменения пользователю, не перемещая его фокус.
Оборачивая наши всплывающие уведомления в динамическую область, мы можем гарантировать, что их содержимое будет объявлено скринридерами, как только оно появится, независимо от того, где находится фокус пользователя.
Ключевые атрибуты ARIA для всплывающих уведомлений
Три основных атрибута работают вместе для создания эффективной динамической области для уведомлений:
1. Атрибут role
Атрибут `role` определяет семантическое назначение элемента. Для динамических областей следует рассматривать три основные роли:
role="status"
: Это наиболее распространенная и подходящая роль для всплывающих уведомлений. Она используется для информационных сообщений, которые важны, но не срочны. Она соответствуетaria-live="polite"
, что означает, что скринридер подождет момента бездействия (например, конца предложения), прежде чем сделать объявление, гарантируя, что пользователь не будет прерван в середине задачи. Используйте это для подтверждений, таких как «Профиль обновлен», «Товар добавлен в корзину» или «Сообщение отправлено».role="alert"
: Эта роль зарезервирована для срочной, чувствительной ко времени информации, требующей немедленного внимания пользователя. Она соответствуетaria-live="assertive"
, что заставит скринридер немедленно прерваться, чтобы доставить сообщение. Используйте это с крайней осторожностью, так как это может сильно отвлекать. Это подходит для сообщений об ошибках, таких как «Ваш сеанс скоро истечет», или критических предупреждений, таких как «Соединение потеряно». Чрезмерное использование `role="alert"` подобно крику на ваших пользователей.role="log"
: Это менее распространенная роль, используемая для создания журнала информации, где новые сообщения добавляются в конец, например, в чатах или консолях ошибок. Обычно это не лучший выбор для типичных всплывающих уведомлений.
2. Атрибут aria-live
Хотя атрибут `role` часто подразумевает определенное поведение `aria-live`, вы можете установить его явно для большего контроля. Он указывает скринридеру, *как* объявлять изменение.
aria-live="polite"
: Скринридер объявляет изменение, когда пользователь бездействует. Это значение по умолчанию дляrole="status"
и предпочтительная настройка для большинства всплывающих уведомлений.aria-live="assertive"
: Скринридер прерывает все, что он делает, и немедленно объявляет изменение. Это значение по умолчанию дляrole="alert"
.aria-live="off"
: Скринридер не будет объявлять изменения. Это значение по умолчанию для большинства элементов.
3. Атрибут aria-atomic
Этот атрибут сообщает скринридеру, следует ли объявлять все содержимое динамической области или только те части, которые изменились.
aria-atomic="true"
: Когда любая часть содержимого в динамической области изменяется, скринридер прочитает все содержимое элемента. Почти всегда это то, что вам нужно для всплывающего уведомления, чтобы гарантировать, что полное сообщение будет прочитано в контексте.aria-atomic="false"
: Скринридер объявит только тот узел, который был добавлен или изменен. Это может привести к фрагментированным и запутанным объявлениям для всплывающих уведомлений.
Собираем все вместе: примеры кода
Давайте посмотрим, как это реализовать. Лучшей практикой является наличие выделенного элемента-контейнера для уведомлений, присутствующего в DOM при загрузке страницы. Затем вы динамически вставляете и удаляете отдельные сообщения в этот контейнер.
Структура HTML
Разместите этот контейнер в конце тега `
`. Он визуально позиционируется с помощью CSS, но его местоположение в DOM не имеет значения для объявлений скринридера.<!-- Вежливая динамическая область для стандартных уведомлений -->
<div id="toast-container-polite"
role="status"
aria-live="polite"
aria-atomic="true">
<!-- Всплывающие уведомления будут динамически вставляться сюда -->
</div>
<!-- Настойчивая динамическая область для срочных оповещений -->
<div id="toast-container-assertive"
role="alert"
aria-live="assertive"
aria-atomic="true">
<!-- Срочные уведомления будут динамически вставляться сюда -->
</div>
JavaScript для вежливого уведомления
Вот функция на чистом JavaScript для отображения вежливого всплывающего уведомления. Она создает элемент уведомления, добавляет его в вежливый контейнер и устанавливает тайм-аут для его удаления.
function showPoliteToast(message, duration = 5000) {
const container = document.getElementById('toast-container-polite');
// Создаем элемент уведомления
const toast = document.createElement('div');
toast.className = 'toast';
toast.textContent = message;
// Добавляем уведомление в контейнер
container.appendChild(toast);
// Устанавливаем тайм-аут для удаления уведомления
setTimeout(() => {
container.removeChild(toast);
}, duration);
}
// Пример использования:
document.getElementById('save-button').addEventListener('click', () => {
// ... логика сохранения ...
showPoliteToast('Ваши настройки были успешно сохранены.');
});
Когда этот код выполняется, обновляется `div` с `role="status"`. Скринридер, отслеживающий страницу, обнаружит это изменение и объявит: «Ваши настройки были успешно сохранены», не прерывая рабочий процесс пользователя.
Лучшие практики дизайна и UX для по-настоящему инклюзивных уведомлений
Техническая реализация с помощью ARIA — это основа, но превосходный пользовательский опыт требует продуманного дизайна. Доступное всплывающее уведомление также является более удобным для всех.
1. Время — это все: дайте пользователям контроль
3-секундное уведомление может быть нормальным для некоторых, но это слишком мало для пользователей с плохим зрением, которым нужно больше времени для чтения, или для пользователей с когнитивными нарушениями, которым нужно больше времени для обработки информации.
- Более длительное время по умолчанию: Стремитесь к минимальной продолжительности в 5-7 секунд. Это обеспечивает более комфортное окно для чтения для более широкого круга пользователей.
- Включите кнопку «Закрыть»: Всегда предоставляйте хорошо видимую и доступную с клавиатуры кнопку для ручного закрытия уведомления. Это дает пользователям полный контроль и предотвращает исчезновение сообщения до того, как они закончат с ним работать. Эта кнопка должна иметь доступную метку, например, `<button aria-label="Закрыть уведомление">X</button>`.
- Пауза при наведении/фокусе: Таймер закрытия должен приостанавливаться, когда пользователь наводит курсор мыши на уведомление или фокусируется на нем с помощью клавиатуры. Это ключевой аспект критерия WCAG «Регулируемое время».
2. Визуальная четкость и расположение
То, как выглядит уведомление и где оно появляется, значительно влияет на его эффективность.
- Высокая контрастность: Убедитесь, что текст и фон уведомления имеют достаточный коэффициент цветового контраста, чтобы соответствовать стандартам WCAG AA (4.5:1 для обычного текста). Используйте инструменты для проверки ваших цветовых комбинаций.
- Понятные иконки: Используйте общепринятые иконки (например, галочку для успеха, «i» для информации или восклицательный знак для предупреждения) вместе с текстом. Эти иконки обеспечивают быструю визуальную подсказку, но не полагайтесь только на них. Всегда включайте текст.
- Постоянное расположение: Выберите постоянное место для ваших уведомлений (например, правый верхний угол) и придерживайтесь его во всем приложении. Это создает предсказуемость для пользователей. Избегайте размещения уведомлений там, где они могут скрыть важные элементы интерфейса.
3. Пишите четкий и лаконичный микротекст
Само сообщение — это ядро уведомления. Сделайте его значимым.
- Будьте прямолинейны: Переходите сразу к делу. Вместо «Операция была успешно завершена» используйте «Профиль обновлен».
- Избегайте жаргона: Используйте простой, понятный язык, который легко поймет глобальная аудитория. Это особенно важно для международных приложений, где контент будет переводиться. Сложные идиомы или технические термины могут потеряться при переводе.
- Дружелюбный тон: Пишите в полезном, разговорном тоне. Сообщение должно звучать так, как будто оно исходит от услужливого помощника, а не от холодной машины.
4. Не используйте всплывающие уведомления для критически важной информации
Это золотое правило. Если пользователь *обязан* увидеть сообщение или взаимодействовать с ним, не используйте всплывающее уведомление. Всплывающие уведомления предназначены для дополнительной, некритической обратной связи. Для критических ошибок, сообщений о валидации, требующих действий пользователя, или подтверждений деструктивных действий (например, удаление файла) используйте более надежный паттерн, такой как модальное диалоговое окно или встроенное оповещение, которое получает фокус.
Тестирование доступности ваших всплывающих уведомлений
Вы не можете быть уверены в доступности вашей реализации, не протестировав ее с помощью инструментов, которыми действительно пользуются ваши пользователи. Ручное тестирование является обязательным для динамических компонентов, таких как всплывающие уведомления.
1. Тестирование с помощью скринридеров
Ознакомьтесь с наиболее распространенными скринридерами: NVDA (бесплатный, для Windows), JAWS (платный, для Windows) и VoiceOver (встроенный, для macOS и iOS). Включите скринридер и выполните действия, которые вызывают ваши уведомления.
Спросите себя:
- Было ли объявлено сообщение? Это самый основной тест.
- Было ли оно объявлено правильно? Было ли прочитано полное сообщение?
- Правильным ли было время? Для вежливого уведомления, дождалось ли оно естественной паузы? Для настойчивого оповещения, прервало ли оно немедленно?
- Был ли опыт disruptive (отвлекающим)? Оправдано ли использование `role="alert"` или это просто раздражает?
2. Тестирование только с клавиатуры
Отключите мышь и перемещайтесь по сайту, используя только клавиатуру (Tab, Shift+Tab, Enter, Пробел).
- Если в вашем уведомлении есть кнопка «Закрыть» или любой другой интерактивный элемент, можете ли вы перейти к нему с помощью клавиши Tab?
- Можете ли вы активировать кнопку с помощью Enter или Пробела?
- Возвращается ли фокус в логичное место в приложении после закрытия уведомления?
3. Визуальные проверки и проверка юзабилити
- Проверьте цветовой контраст с помощью расширения для браузера или онлайн-инструмента.
- Попробуйте изменить размер окна браузера или просмотреть на разных устройствах. Появляется ли уведомление все еще в разумном месте, не заслоняя другой контент?
- Попросите кого-нибудь, кто не знаком с приложением, использовать его. Понимают ли они, что означают всплывающие уведомления?
Заключение: создавая более инклюзивный веб, по одному уведомлению за раз
Всплывающие уведомления — это небольшая, но значительная часть пользовательского опыта. В течение многих лет они были распространенным «слепым пятном» в веб-доступности, создавая разочаровывающий опыт для пользователей вспомогательных технологий. Но так быть не должно.
Используя мощь динамических областей ARIA и придерживаясь продуманных принципов дизайна, мы можем превратить эти мимолетные сообщения из барьеров в мосты. Доступное всплывающее уведомление — это не просто техническая галочка; это приверженность четкой коммуникации со *всеми* пользователями. Это гарантирует, что каждый, независимо от его способностей, получает одинаковую критическую обратную связь и может использовать наши приложения с уверенностью и эффективностью.
Давайте сделаем доступные уведомления отраслевым стандартом. Встраивая эти практики в наши системы дизайна и рабочие процессы разработки, мы можем создать более инклюзивный, надежный и удобный веб для по-настоящему глобальной аудитории.