Popper.js предоставляет мощный механизм позиционирования всплывающих элементов относительно их опорных элементов. Одной из ключевых особенностей является возможность адаптировать поведение попперов под разные размеры экранов и условия отображения. Для этого используются модификаторы, функции обратного вызова и динамическое вычисление стратегий позиционирования.
Popper.js позволяет задавать разные конфигурации через модификатор
applyStyles или собственные модификаторы, которые могут
учитывать текущую ширину экрана. Стандартный подход — использование
matchMedia:
const mediaQuery = window.matchMedia('(max-width: 768px)');
const popperInstance = Popper.createPopper(referenceElement, popperElement, {
placement: mediaQuery.matches ? 'bottom' : 'right',
});
В этом примере для экранов меньше 768px поппер будет отображаться
снизу, а для больших экранов — справа. Такой подход позволяет
динамически изменять позицию без пересоздания
экземпляра, если использовать слушатель события change на
MediaQueryList.
mediaQuery.addEventListener('change', (e) => {
popperInstance.setOptions({
placement: e.matches ? 'bottom' : 'right',
});
});
Попперы могут иметь набор модификаторов, которые активируются только
при определённых условиях. Например, модификатор
preventOverflow можно настроить по-разному:
const popperInstance = Popper.createPopper(referenceElement, popperElement, {
placement: 'right',
modifiers: [
{
name: 'preventOverflow',
options: {
padding: mediaQuery.matches ? 8 : 16,
boundary: mediaQuery.matches ? referenceElement : 'viewport',
},
},
],
});
Здесь для маленьких экранов отступ ограничен 8px и границей является сам элемент, а для больших экранов — 16px и границей выступает весь viewport. Такой подход позволяет контролировать смещение и предотвращать выход за границы окна в зависимости от устройства.
Popper.js поддерживает две стратегии позиционирования:
absolute и fixed. Для мобильных экранов часто
выбирается fixed, чтобы поппер оставался на месте при
скролле:
popperInstance.setOptions({
strategy: mediaQuery.matches ? 'fixed' : 'absolute',
});
Комбинируя стратегию с медиазапросами и динамическими модификаторами, можно добиться полной адаптивности всплывающих элементов.
Для сложных сценариев удобно создавать массив модификаторов, который меняется в зависимости от ширины экрана:
function getModifiers(screenWidth) {
return [
{
name: 'offset',
options: {
offset: screenWidth < 768 ? [0, 10] : [0, 20],
},
},
{
name: 'flip',
options: {
fallbackPlacements: screenWidth < 768 ? ['top', 'bottom'] : ['left', 'right'],
},
},
];
}
popperInstance.setOptions({
modifiers: getModifiers(window.innerWidth),
});
Такой подход позволяет точно контролировать поведение поппера на разных устройствах, избегая создания отдельных экземпляров для каждого типа экрана.
Попперы часто содержат динамический контент, размер которого может меняться. Для мобильных устройств важно ограничивать ширину или изменять структуру контента:
const popperElement = document.querySelector('.popper');
if (window.innerWidth < 768) {
popperElement.style.width = '90vw';
} else {
popperElement.style.width = '300px';
}
Сочетание CSS и Popper.js обеспечивает правильное позиционирование независимо от размеров контента.
autoUpdate для реагирования на изменения экранаPopper.js предоставляет функцию autoUpdate, которая
автоматически пересчитывает позицию поппера при изменении размера экрана
или прокрутке:
import { autoUpdate } from '@popperjs/core';
autoUpdate(referenceElement, popperElement, popperInstance.update);
В сочетании с медиазапросами и динамическими модификаторами это позволяет поддерживать плавную адаптивную работу без ручного пересоздания попперов.
window.innerWidth для определения текущего
состояния.offset,
preventOverflow, flip) под конкретный размер
экрана.autoUpdate для постоянной
актуализации позиции при изменении размеров и прокрутке.Такой комплексный подход обеспечивает гибкое, точное и адаптивное позиционирование любых всплывающих элементов с Popper.js.