Tippy.js изначально проектировалась как легковесная и гибкая библиотека для создания всплывающих подсказок и тултипов. Помимо стандартного поведения при наведении мышью, библиотека предоставляет расширенные возможности управления с клавиатуры, что критически важно для доступности (accessibility, a11y) и удобства работы пользователей без мыши.
Tippy.js позволяет перехватывать и обрабатывать клавиатурные события, обеспечивая полное управление подсказками с помощью клавиш. Ключевые аспекты:
Фокусировка на элементе Tippy автоматически
может открывать тултип при фокусе на элементе через клавишу
Tab. Для этого используется параметр:
tippy(button, {
content: 'Подсказка при фокусе',
trigger: 'mouseenter focus',
});
Здесь focus отвечает за активацию тултипа при
фокусировке через клавиатуру. Это гарантирует, что пользователь, который
навигацирует с помощью клавиш Tab и Shift+Tab,
увидит подсказку.
Закрытие с клавиатуры По умолчанию Tippy.js
поддерживает закрытие подсказок с помощью клавиши Escape.
Реализуется через встроенную логику, но можно настроить собственное
поведение:
tippy(button, {
content: 'Нажмите Esc чтобы закрыть',
hideOnClick: true,
});
button.addEventListener('keydown', (event) => {
if (event.key === 'Escape') {
button._tippy.hide();
}
});
Важно: для управления через клавиатуру Tippy.js хранит ссылку на
объект тултипа в element._tippy, что позволяет программно
вызывать методы show(), hide(),
toggle().
Для сложных интерфейсов с несколькими тултипами можно реализовать
циклическую навигацию клавишами Tab и
Shift+Tab. Пример:
const buttons = document.querySelectorAll('.tooltip-button');
buttons.forEach((button) => {
tippy(button, {
content: button.dataset.tooltip,
trigger: 'focus',
interactive: true,
});
button.addEventListener('keydown', (event) => {
if (event.key === 'ArrowRight') {
const next = button.nextElementSibling || buttons[0];
next.focus();
}
if (event.key === 'ArrowLeft') {
const prev = button.previousElementSibling || buttons[buttons.length - 1];
prev.focus();
}
});
});
В этом примере:
ArrowRight перемещает фокус к следующему элементу с
тултипом.ArrowLeft возвращает фокус к предыдущему элементу.Tippy.js поддерживает плагины и модификаторы, которые позволяют расширить функциональность клавиатуры:
interactive — делает тултип
кликабельным и фокусируемым.keyboard — добавляется через плагин
tippy.js/headless для полноценного управления клавишами
внутри тултипа.Пример использования:
tippy(button, {
content: 'Тултип с клавиатурным управлением',
trigger: 'focus',
interactive: true,
onShow(instance) {
instance.popper.addEventListener('keydown', (event) => {
if (event.key === 'Enter') {
console.log('Enter внутри тултипа');
}
});
}
});
Здесь можно реализовать обработку Enter,
Tab, Escape или любых других клавиш внутри
тултипа, не нарушая стандартной логики навигации документа.
Tippy.js автоматически учитывает:
interactive: true.blur) или нажатии
Escape.show и hide.Для сложных интерфейсов полезно комбинировать эти возможности с
библиотеками типа focus-trap, чтобы полностью
контролировать фокус внутри всплывающего окна.
focus в список trigger,
если поддерживается клавиатурная навигация.interactive: true, если внутри тултипа
есть кнопки или ссылки.Escape для немедленного закрытия, чтобы
соответствовать стандартам a11y.ArrowLeft
/ ArrowRight или Tab для навигации.keydown и методы _tippy.show() /
_tippy.hide().Tippy.js обеспечивает гибкую и расширяемую систему работы с клавиатурой, позволяя создавать доступные интерфейсы, где подсказки управляются не только мышью, но и полностью через клавиатурные события.