Tippy.js — библиотека для создания всплывающих подсказок (tooltips) и поповеров в JavaScript, построенная на Popper.js. Одним из ключевых аспектов при работе с Tippy.js является доступность (accessibility, a11y). Всплывающие подсказки должны корректно взаимодействовать с клавиатурой, экранными читалками и другими вспомогательными технологиями.
Tippy.js поддерживает автоматическое добавление ARIA-атрибутов для повышения доступности:
role="tooltip" — указывает, что элемент является
подсказкой.aria-describedby — связывает элемент с подсказкой.
Tippy автоматически присваивает этот атрибут целевому элементу.aria-hidden — управляет видимостью подсказки для
экранных читалок. Tippy скрывает подсказку от ассистивных технологий,
когда она неактивна.Пример создания простой подсказки с доступностью:
tippy('#button', {
content: 'Подсказка с ARIA',
aria: {
content: 'auto', // автоматически добавляет aria-describedby
},
});
Для пользователей, которые используют клавиатуру:
focus), а не только при наведении мыши.focus и
mouseenter гарантирует, что подсказка будет доступна
клавиатурным пользователям.tippy('#button', {
content: 'Доступная подсказка',
trigger: 'mouseenter focus', // мышь и клавиатура
});
Tippy.js предоставляет возможность полностью контролировать, когда подсказка доступна для ассистивных технологий:
aria: 'describedby' — элемент получает
aria-describedby, когда подсказка активна.aria: 'labelledby' — альтернативный режим, при котором
элемент будет использовать подсказку как метку.aria: false — отключает добавление любых
ARIA-атрибутов, если это необходимо для кастомного решения.Для оценки доступности можно использовать:
Пример интеграции Tippy.js с axe-core:
import axe from 'axe-core';
axe.run(document, {}, (err, results) => {
if (err) throw err;
console.log(results.violations); // выводит нарушения доступности
});
Tippy.js автоматически поддерживает сенсорные экраны, но важно убедиться, что:
Если подсказка содержит интерактивные элементы (кнопки, ссылки, поля ввода), необходимо:
interactive: true для того, чтобы
подсказка не исчезала при фокусе на её содержимом.tabindex корректно установлен для всех
элементов подсказки.Tab и
Shift+Tab.tippy('#button', {
content: '<button>Нажми меня</button>',
allowHTML: true,
interactive: true,
});
Использование слишком короткой задержки появления/скрытия может вызвать проблемы для пользователей с моторными нарушениями:
tippy('#button', {
content: 'Подсказка с задержкой',
delay: [300, 100], // [появление, скрытие] в миллисекундах
});
Для системного тестирования подсказок рекомендуется:
trigger: 'mouseenter focus' для
поддержки клавиатурных пользователей.interactive: true.Эти подходы обеспечивают максимальную совместимость Tippy.js с требованиями доступности и создают удобный интерфейс для всех категорий пользователей.