Popper.js — это мощная библиотека для позиционирования элементов в веб-интерфейсах. Она идеально подходит для создания tooltip’ов, всплывающих подсказок, выпадающих меню и любых элементов, которые должны динамически адаптироваться к размеру окна и положению других элементов на странице. Tooltip — это элемент интерфейса, который появляется рядом с целевым объектом и предоставляет дополнительную информацию при наведении или фокусе.
Для создания tooltip необходимо определить reference element (элемент, к которому привязывается подсказка) и popper element (сам tooltip). Основная структура кода:
import { createPopper } from '@popperjs/core';
const referenceElement = document.querySelector('#button');
const popperElement = document.querySelector('#tooltip');
const popperInstance = createPopper(referenceElement, popperElement, {
placement: 'top', // позиция tooltip: top, bottom, left, right
});
Ключевые моменты:
placement определяет изначальное направление
всплывающего блока относительно целевого элемента.Tooltip не должен отображаться постоянно. Для управления показом используются классы или стили:
referenceElement.addEventListener('mouseenter', () => {
popperElement.setAttribute('data-show', '');
popperInstance.update(); // обновляет позицию при появлении
});
referenceElement.addEventListener('mouseleave', () => {
popperElement.removeAttribute('data-show');
});
Особенности управления:
update() необходимо вызывать каждый раз, когда размеры
или положение reference element изменяются динамически.data-show позволяет подключить
CSS-анимации для плавного появления/исчезновения tooltip.Модификаторы управляют поведением Popper:
createPopper(referenceElement, popperElement, {
placement: 'bottom',
modifiers: [
{
name: 'offset',
options: {
offset: [0, 8], // 8px вниз от кнопки
},
},
],
});
modifiers: [
{
name: 'preventOverflow',
options: {
boundary: 'viewport', // ограничение по области видимости окна
padding: 8,
},
},
]
modifiers: [
{
name: 'flip',
options: {
fallbackPlacements: ['top', 'right', 'left'],
},
},
]
modifiers: [
{
name: 'arrow',
options: {
element: '[data-popper-arrow]', // селектор стрелки внутри tooltip
},
},
]
Tooltip может содержать разный контент, включая HTML-структуры. Для этого достаточно менять содержимое элемента:
referenceElement.addEventListener('mouseenter', () => {
popperElement.innerHTML = '<strong>Подсказка:</strong> Дополнительная информация';
popperInstance.update();
});
Важно помнить, что при использовании HTML необходимо соблюдать правила безопасности: избегать вставки непроверенного пользовательского контента, чтобы предотвратить XSS.
Popper.js автоматически учитывает размеры окна и положение reference element. Для мобильных устройств полезно:
offset, чтобы tooltip не перекрывал палец
пользователя.#tooltip {
max-width: 200px;
word-wrap: break-word;
}
touchstart и touchend
для отображения tooltip на сенсорных устройствах.Tooltip легко стилизуется через CSS. Для плавного появления применяются переходы:
#tooltip {
opacity: 0;
transition: opacity 0.3s;
background-color: #333;
color: #fff;
padding: 6px 12px;
border-radius: 4px;
}
#tooltip[data-show] {
opacity: 1;
}
Стрелка tooltip:
[data-popper-arrow] {
width: 8px;
height: 8px;
background: inherit;
transform: rotate(45deg);
position: absolute;
}
Модификатор arrow автоматически позиционирует элемент
стрелки относительно границы tooltip и reference element.
Для динамических интерфейсов полезно управлять жизненным циклом Popper:
// Обновление позиции
popperInstance.update();
// Полное удаление
popperInstance.destroy();
Это важно при удалении или скрытии элементов, чтобы не оставлять лишние слушатели событий или память.
Popper.js отлично интегрируется с React, Vue, Angular. В React часто
используют обертки вроде react-popper, которые упрощают
управление жизненным циклом и реактивное обновление позиций tooltip.
Popper.js обеспечивает точное, адаптивное позиционирование tooltip с минимальными усилиями. Правильное использование модификаторов, событий и CSS позволяет создавать интерактивные, безопасные и эстетически привлекательные всплывающие подсказки на любых веб-страницах.