Popper.js — это библиотека для управления позиционированием
элементов, таких как всплывающие подсказки, тултипы и выпадающие меню.
Одним из ключевых визуальных элементов является
стрелка, которая указывает на целевой элемент
(reference element). Для добавления стрелки используется модификатор
arrow.
Стрелка является отдельным элементом DOM, вложенным внутрь поппера. Стандартная структура выглядит следующим образом:
<div id="reference">Кнопка</div>
<div id="popper">
<div id="arrow" data-popper-arrow></div>
Содержимое поппера
</div>
Особенности:
data-popper-arrow
или класс, указанный в конфигурации.При инициализации Popper необходимо добавить модификатор
arrow. Пример использования с классической
инициализацией:
const reference = document.querySelector('#reference');
const popper = document.querySelector('#popper');
const arrow = document.querySelector('#arrow');
const popperInstance = Popper.createPopper(reference, popper, {
placement: 'top', // Расположение поппера относительно reference
modifiers: [
{
name: 'arrow',
options: {
element: arrow,
padding: 5, // Отступ стрелки от края поппера
},
},
{
name: 'offset',
options: {
offset: [0, 10], // Смещение поппера относительно reference
},
},
],
});
Ключевые моменты:
placement определяет позицию поппера (top,
bottom, left, right) и
автоматически меняет положение стрелки.padding задаёт минимальное расстояние стрелки от края
поппера, чтобы она не выходила за пределы.arrow автоматически вычисляет позицию
стрелки и применяет transform или top/left
стили.Поппер не накладывает собственные стили на стрелку, поэтому необходимо создать CSS:
#popper {
background-color: #333;
color: #fff;
padding: 8px 12px;
border-radius: 4px;
position: relative;
}
#arrow {
position: absolute;
width: 10px;
height: 10px;
background: #333;
transform: rotate(45deg);
}
Замечания:
offset.Popper.js умеет динамически корректировать позицию стрелки при
изменении позиции поппера. Если поппер автоматически меняет placement из
top на bottom, стрелка также изменит
положение:
const popperInstance = Popper.createPopper(reference, popper, {
placement: 'auto',
modifiers: [
{ name: 'arrow', options: { element: arrow, padding: 8 } },
{ name: 'flip', options: { fallbackPlacements: ['top', 'bottom', 'right', 'left'] } },
],
});
Пояснения:
flip позволяет Popper менять placement при
нехватке места.padding предотвращает визуальное “прилипание” стрелки к
краям поппера.Отступ от края: Стрелка не должна касаться краёв
поппера. Для этого используется padding в модификаторе
arrow.
Положение по оси: Если
placement: top или bottom, стрелка смещается
по горизонтали. Если placement: left или
right, стрелка смещается по вертикали.
Плавающая ширина: Если поппер меняет размер,
Popper автоматически корректирует координаты стрелки при каждом вызове
update().
popperInstance.update();
update() при анимациях, чтобы не создавать
лишнюю нагрузку на браузер.Стрелку можно стилизовать или использовать сложные SVG-элементы:
<div id="arrow" data-popper-arrow>
<svg width="16" height="8" viewBox="0 0 16 8">
<path d="M0,8 L8,0 L16,8" fill="#333"/>
</svg>
</div>
При этом модификатор arrow будет работать точно так же,
позиционируя контейнер SVG внутри поппера.
Для анимаций важно учитывать, что стрелка смещается независимо от поппера. Чтобы анимации выглядели естественно:
#popper {
transform-origin: center bottom; /* Для top placement */
transition: transform 0.2s ease;
}
transform-origin должен соответствовать позиции
стрелки.data-popper-arrow.arrow автоматически позиционирует стрелку в
зависимости от placement.flip и offset обеспечивают корректное
поведение.update()
после изменений размеров или позиции popper.Стрелка Popper.js — это гибкий инструмент, который при правильной настройке обеспечивает точное визуальное указание на целевой элемент без ручного расчета координат.