Компонент Modal в библиотеке MUI (Material-UI) представляет собой базовый инструмент для создания всплывающих окон и оверлеев, блокирующих взаимодействие с остальной частью интерфейса до закрытия модального окна. Он обеспечивает гибкую настройку поведения и стилей, позволяя создавать как простые диалоговые окна, так и сложные кастомные интерфейсы.
Для начала работы необходимо импортировать компонент из пакета
@mui/material:
import Modal from '@mui/material/Modal';
import Box from '@mui/material/Box';
Простейший пример:
const [open, setOpen] = React.useState(false);
setOpen(false)}
aria-labelledby="modal-title"
aria-describedby="modal-description"
>
Заголовок модального окна
Содержимое модального окна.
Ключевые моменты:
Компонент Modal сам по себе не управляет
позиционированием контента — это полностью делается через обертку,
например, Box. Для удобного центрирования часто
используется комбинация position: 'absolute',
top, left и трансформации:
Свойство sx позволяет применять любую стилизацию, поддерживаемую MUI, включая темы, цвета, отступы и тени.
Modal предоставляет следующие важные свойства для управления поведением:
Fade
или Grow.Пример с анимацией:
import Fade from '@mui/material/Fade';
setOpen(false)} closeAfterTransition>
Анимированное содержимое
Modal автоматически управляет фокусом для обеспечения доступности. При открытии фокус переводится на первый интерактивный элемент внутри модального окна. Для дополнительной доступности важно использовать aria-labelledby и aria-describedby, указывая идентификаторы заголовка и основного контента модального окна.
Вложенные модальные окна:
MUI позволяет открывать несколько модальных окон одновременно, однако нужно аккуратно управлять состояниями, чтобы предотвратить потерю фокуса или конфликт закрытия. Рекомендуется использовать отдельное состояние для каждого модального окна.
Контент динамической высоты:
Модальные окна могут содержать прокручиваемый контент. Для этого
достаточно задать maxHeight и overflow: auto в
стилях Box:
Modal часто используется совместно с компонентами Dialog, Backdrop, Fade, Typography, Button. Например, Dialog строится поверх Modal и добавляет готовую структуру с заголовком, контентом и действиями.
Пример:
import Dialog from '@mui/material/Dialog';
import DialogTitle from '@mui/material/DialogTitle';
import DialogContent from '@mui/material/DialogContent';
import DialogActions from '@mui/material/DialogActions';
import Button from '@mui/material/Button';
Это упрощает создание стандартных диалогов, но при необходимости кастомизации стоит работать с Modal напрямую.