Popper.js предоставляет мощные инструменты для управления позиционированием всплывающих элементов относительно их reference elements. Одной из таких возможностей является использование transform contexts, которые позволяют точно контролировать рендеринг и визуальное положение элементов, особенно при сложных структурах DOM и трансформациях CSS.
Transform context определяется как область, в которой CSS-свойства transform, perspective или filter создают новый контекст для потомков. В Popper.js это критически важно, потому что позиционирование элементов происходит относительно ближайшего offsetParent, который может быть изменён трансформацией.
Примеры свойств, создающих новый контекст:
transform: translateX(50px);
transform: rotate(10deg);
perspective: 500px;
filter: blur(2px);
Эти свойства заставляют браузер воспринимать элемент как новый контекст для абсолютного позиционирования дочерних элементов. Для Popper.js это значит, что стандартное вычисление top и left может дать неверный результат, если не учитывать transform context.
Когда Popper.js вычисляет позицию поппера, оно использует
getBoundingClientRect reference элемента. Если
reference элемент находится внутри transform context, координаты будут
смещены относительно нового контекста, а не
относительно документа. Popper.js автоматически определяет ближайший
transform ancestor через функцию getOffsetParent, чтобы
скорректировать позицию:
const popperInstance = Popper.createPopper(referenceElement, popperElement, {
placement: 'bottom-start',
modifiers: [
{
name: 'computeStyles',
options: {
adaptive: true, // корректировка позиции в зависимости от transform context
},
},
],
});
adaptive
учитывает наличие transform context и корректирует значения
top/left.adaptive: true для
корректного позиционирования.getOffsetParent до
корня документа.transform: translateZ(0) может вызвать новый контекст, но
также ускоряет рендеринг. Popper.js воспринимает это и корректно
рассчитывает координаты, чтобы поппер оставался на нужной позиции.<div class="container" style="transform: translateX(100px);">
<button id="btn">Нажми меня</button>
<div id="tooltip">Подсказка</div>
</div>
<script>
const reference = document.querySelector('#btn');
const popper = document.querySelector('#tooltip');
Popper.createPopper(reference, popper, {
placement: 'top',
modifiers: [
{
name: 'computeStyles',
options: { adaptive: true }
},
{
name: 'offset',
options: { offset: [0, 8] } // отступ от reference
}
]
});
</script>
В этом примере .container создает transform context.
Поппер автоматически учитывает смещение при рендеринге подсказки над
кнопкой, без необходимости вручную вычислять top/left.
adaptive: true в
computeStyles, если поппер находится в элементах с
transform или perspective.Transform contexts напрямую влияют на корректность позиционирования элементов Popper.js. Понимание того, как CSS-трансформации создают новые координатные системы, позволяет управлять сложными интерфейсами, предотвращать смещения и гарантировать правильное поведение всплывающих элементов в любых структурах DOM.