Popper.js предоставляет мощный инструмент для создания динамических всплывающих элементов, таких как тултипы, всплывающие меню и модальные подсказки. Одной из ключевых особенностей является возможность использования стрелок, которые указывают на целевой элемент. Разметка стрелки требует внимательного подхода к HTML и CSS, а также понимания API Popper.js.
Стрелка представляет собой отдельный элемент внутри всплывающего контейнера. Базовая структура выглядит следующим образом:
<div id="tooltip" role="tooltip">
Содержимое подсказки
<div id="arrow" data-popper-arrow></div>
</div>
Ключевые моменты:
data-popper-arrow — атрибут, который Popper.js
использует для определения стрелки.Popper.js автоматически учитывает элемент стрелки при вычислении позиции. Пример инициализации:
const reference = document.querySelector('#button');
const popper = document.querySelector('#tooltip');
const arrow = document.querySelector('#arrow');
Popper.createPopper(reference, popper, {
placement: 'top',
modifiers: [
{
name: 'arrow',
options: {
element: arrow,
padding: 5 // отступ стрелки от границ контейнера
}
},
{
name: 'offset',
options: {
offset: [0, 10] // смещение всплывающего элемента относительно цели
}
}
]
});
Пояснения:
placement — позиция всплывающего элемента относительно
цели (top, bottom, left,
right).arrow отвечает за корректное размещение
стрелки.padding задает минимальное расстояние стрелки от
края контейнера, что предотвращает её «врезание» в границы.Для правильного отображения стрелки часто используют CSS с
трансформацией через ::before или напрямую через элемент
стрелки. Пример минимальной стилизации:
#arrow {
width: 10px;
height: 10px;
background: inherit;
position: absolute;
transform: rotate(45deg);
}
[data-popper-placement^='top'] > #arrow {
bottom: -5px;
}
[data-popper-placement^='bottom'] > #arrow {
top: -5px;
}
[data-popper-placement^='left'] > #arrow {
right: -5px;
}
[data-popper-placement^='right'] > #arrow {
left: -5px;
}
Особенности:
transform: rotate(45deg) превращает
квадрат в ромб, имитируя стрелку.[data-popper-placement^='...'] позволяют
корректно менять позицию стрелки при смене направления всплывающего
элемента.background: inherit обеспечивает, что цвет
стрелки совпадает с фоном контейнера.Popper.js автоматически вычисляет смещение стрелки, чтобы она
оставалась направленной на центр целевого элемента, даже если
всплывающий элемент частично выходит за пределы видимой области. Для
расширенной настройки используют опции padding и
модификатор preventOverflow:
Popper.createPopper(reference, popper, {
modifiers: [
{
name: 'arrow',
options: {
element: arrow,
padding: 8
}
},
{
name: 'preventOverflow',
options: {
boundary: 'viewport',
padding: 5
}
}
]
});
Значение preventOverflow:
arrow.padding для сохранения эстетики и
корректного позиционирования.Popper.js умеет менять направление поппера автоматически, если целевой элемент близко к краю экрана. Стрелка при этом сохраняет корректное положение:
Popper.createPopper(reference, popper, {
placement: 'auto',
modifiers: [
{ name: 'arrow', options: { element: arrow, padding: 5 } },
{ name: 'flip', options: { fallbackPlacements: ['top', 'right', 'bottom', 'left'] } }
]
});
flip позволяет автоматически менять позицию поппера,
когда основной вариант не помещается.Стрелка не отображается
data-popper-arrow на элементе
стрелки.Стрелка смещается слишком далеко
arrow.padding и offset в
модификаторах.rotate и
position).Поппер выходит за пределы экрана
preventOverflow и
flip.Эта методика позволяет создавать гибкие всплывающие элементы с точными стрелками, которые адаптируются к различным размерам и положению целевых элементов, обеспечивая профессиональное качество интерфейса.