Popper — это мощный инструмент для управления позиционированием элементов в интерфейсе, который используется в библиотеке MUI (Material-UI). Он обеспечивает динамическое размещение всплывающих элементов относительно целевых элементов (anchor elements) с поддержкой смещений, автоматического переворота и адаптивного позиционирования при изменении размеров окна или элементов страницы.
Для работы с Popper необходимо установить пакет @mui/material, который
включает компонент Popper.
import Popper from '@mui/material/Popper';
import Button from '@mui/material/Button';
import { useState } from 'react';
Popper не требует сложной конфигурации, но всегда требует привязки к anchor element, относительно которого будет позиционироваться всплывающее окно.
Компонент Popper принимает следующие ключевые
свойства:
open — логическое значение, контролирующее видимость
Popper.anchorEl — ссылка на DOM-элемент, относительно которого
Popper будет позиционироваться.placement — определяет расположение относительно anchor
element: top, bottom, left,
right и их вариации с -start и
-end.modifiers — массив объектов, позволяющий управлять
смещением, ограничениями и поведением при переполнении контейнера.transition — позволяет применять анимации при открытии
и закрытии Popper.Простейший пример использования:
function SimplePopper() {
const [anchorEl, setAnchorEl] = useState(null);
const handleClick = (event) => {
setAnchorEl(anchorEl ? null : event.currentTarget);
};
const open = Boolean(anchorEl);
const id = open ? 'simple-popper' : undefined;
return (
<div>
<Button aria-describedby={id} onCl ick={handleClick}>
Toggle Popper
</Button>
<Popper id={id} open={open} anchorEl={anchorEl} placement="bottom">
<div style={{ padding: '10px', backgroundColor: 'white', border: '1px solid gray' }}>
Содержимое Popper
</div>
</Popper>
</div>
);
}
placementplacement определяет базовое расположение Popper
относительно anchor element:
top — сверхуbottom — снизуleft — слеваright — справаВарианты с -start и -end позволяют уточнять
выравнивание:
bottom-start — снизу, выровнено по левому краюtop-end — сверху, выровнено по правому краюPopper автоматически подстраивается под размеры окна, предотвращая выход за границы видимой области.
modifiersМассив modifiers предоставляет более тонкий контроль над
поведением Popper. Наиболее часто используемые модификаторы:
offset — задаёт смещение относительно anchor
element:<Popper
open={open}
anchorEl={anchorEl}
placement="bottom"
modifiers={[{ name: 'offset', options: { offset: [0, 10] } }]}
/>
preventOverflow — предотвращает выход Popper за границы
контейнера.flip — позволяет Popper автоматически переворачиваться
при недостатке места.arrow — добавляет стрелку, указывающую на anchor
element.Пример с модификаторами:
<Popper
open={open}
anchorEl={anchorEl}
placement="top"
modifiers={[
{ name: 'offset', options: { offset: [0, 20] } },
{ name: 'flip', enabled: true },
{ name: 'preventOverflow', options: { padding: 8 } }
]}
>
<div>Popper с модификаторами</div>
</Popper>
Для добавления плавного появления и скрытия используется свойство
transition. В MUI часто применяют компонент
Grow или Fade из
@mui/material.
import Grow from '@mui/material/Grow';
<Popper open={open} anchorEl={anchorEl} placement="bottom" transition>
{({ TransitionProps }) => (
<Grow {...TransitionProps}>
<div style={{ padding: '10px', backgroundColor: 'white', border: '1px solid gray' }}>
Анимированный Popper
</div>
</Grow>
)}
</Popper>
TransitionProps автоматически передаёт необходимые
свойства для синхронизации анимации с состоянием open.
Popper часто комбинируется с такими компонентами, как
Menu, Tooltip, ClickAwayListener,
что позволяет строить полноценные интерактивные интерфейсы:
Пример использования ClickAwayListener:
import ClickAwayListener from '@mui/material/ClickAwayListener';
<ClickAwayListener onClickA way={() => setAnchorEl(null)}>
<Popper open={open} anchorEl={anchorEl}>
<div>Закрытие при клике вне Popper</div>
</Popper>
</ClickAwayListener>
Popper отслеживает изменения размеров anchor element и окна браузера.
Для ручного обновления позиции можно использовать метод
update через popperRef:
const popperRef = useRef();
useEffect(() => {
if (popperRef.current) {
popperRef.current.update();
}
}, [someDependency]);
Это полезно при изменении содержимого Popper или anchor element динамически.
anchorEl, иначе Popper не будет
работать.modifiers для тонкой настройки смещений и
поведения при переполнении.transition с Grow,
Fade или Slide.ClickAwayListener для управления
закрытием.Popper в MUI — гибкий инструмент для построения всплывающих элементов с полноценным контролем позиции и поведения, идеально подходящий для меню, подсказок и кастомных интерфейсных компонентов.