Tippy.js, как современная библиотека для создания всплывающих подсказок и тултипов, предоставляет встроенные механизмы для обеспечения доступности контента. Поддержка скринридеров реализуется через правильное использование ARIA-атрибутов, управление фокусом и обработку событий клавиатуры.
Tippy.js автоматически добавляет ключевые ARIA-атрибуты к элементам:
aria-describedby — связывает элемент с
тултипом. Атрибут содержит id тултипа и позволяет
скринридеру озвучивать подсказку при фокусе на элементе.role="tooltip" — применяется к самому
тултипу, что однозначно указывает скринридеру его назначение.aria-hidden="true/false" —
контролирует видимость тултипа для скринридеров. Когда тултип скрыт,
aria-hidden="true" предотвращает его озвучивание.Пример настройки:
tippy('#button', {
content: 'Это подсказка',
aria: {
content: 'auto', // автоматически добавляет aria-describedby и role
},
});
В данном примере Tippy.js автоматически сгенерирует уникальный
id для тултипа и установит его в
aria-describedby целевого элемента. Опция
aria.content со значением auto обеспечивает
корректную поддержку большинства скринридеров.
Скринридеры взаимодействуют с элементами, которые находятся в фокусе. Tippy.js предоставляет несколько стратегий управления видимостью тултипов:
trigger: 'mouseenter focus' — тултип
появляется при наведении мыши и при фокусе с клавиатуры, что
обеспечивает доступность для пользователей с ограниченной
моторикой.interactive: true — позволяет
пользователю перемещать фокус внутри тултипа (например, для ссылки или
кнопки внутри подсказки) без его закрытия.hideOnClick — можно отключить, чтобы
тултип не закрывался случайно при попытке взаимодействия с его
контентом.Пример:
tippy('#info', {
content: 'Дополнительная информация',
trigger: 'mouseenter focus',
interactive: true,
hideOnClick: false,
});
Такой подход гарантирует, что пользователи, использующие клавиатуру или скринридер, смогут прослушать весь контент тултипа.
Если контент тултипа обновляется динамически (например, при загрузке данных с сервера), важно, чтобы ARIA-атрибуты оставались актуальными:
aria-describedby, если
использовать методы setContent или
setProps.instance.popperInstance.update(), чтобы
тултип оставался корректно привязанным к целевому элементу и скринридеры
могли его озвучивать.Пример динамического обновления:
const tip = tippy('#dynamic', {
content: 'Изначальный текст',
aria: { content: 'auto' },
});
document.querySelector('#updateBtn').addEventListener('click', () => {
tip.setContent('Обновленный текст подсказки');
});
Tippy.js поддерживает стандартные события клавиатуры:
interactive: true).followCursor
или кастомными навигационными подсказками можно реализовать перемещение
между тултипами.Пример:
tippy('#keyboard', {
content: 'Используйте Esc для закрытия',
trigger: 'focus',
interactive: true,
hideOnClick: false,
});
Для проверки корректной работы скринридеров рекомендуется:
aria-describedby всегда соответствовал
текущему содержимому тултипа.Tippy.js обеспечивает автоматизацию большинства этих процессов, но при сложных динамических интерфейсах иногда требуется ручное обновление ARIA-атрибутов и фокусных состояний.
aria: { content: 'auto' } для
стандартной доступности.trigger: 'focus' наряду с
mouseenter для клавиатурных пользователей.interactive: true при наличии
интерактивного контента в тултипе.Эти механизмы делают Tippy.js полностью совместимым с современными требованиями к доступности веб-приложений.