Компонент Snackbar в библиотеке MUI предназначен для
кратковременного отображения уведомлений пользователю. Позиционирование
этого компонента управляется с помощью свойства
anchorOrigin, которое задаёт, где именно на экране появится
уведомление. anchorOrigin принимает объект с двумя ключами:
vertical и horizontal.
<Snackbar
open={open}
message="Пример уведомления"
anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }}
/>
'top' |
'bottom' Определяет вертикальное положение компонента
относительно окна браузера.'left' |
'center' | 'right' Определяет горизонтальное
выравнивание компонента.Для более точного позиционирования можно использовать
свойство sx, которое позволяет задавать
произвольные отступы и смещения с помощью системы стилей MUI:
<Snackbar
open={open}
message="Уведомление с кастомным отступом"
anchorOrigin={{ vertical: 'top', horizontal: 'right' }}
sx={{ mt: 2, mr: 3 }}
/>
Здесь mt и mr задают верхний и правый
отступы соответственно. Подобная настройка особенно полезна, когда
требуется сдвинуть уведомление от краёв экрана или от других компонентов
интерфейса.
Если в приложении отображается несколько уведомлений одновременно, их
позиционирование должно быть организовано так, чтобы уведомления не
перекрывали друг друга. MUI предоставляет свойство Stack
для управления несколькими Snackbar:
<Stack spacing={1} sx={{ width: '100%' }}>
{notifications.map((note, index) => (
<Snackbar
key={index}
open={true}
message={note.message}
anchorOrigin={{ vertical: 'top', horizontal: 'right' }}
/>
))}
</Stack>
Использование Stack позволяет автоматически распределять
уведомления по вертикали с заданным интервалом между ними, предотвращая
наложение.
В реальных приложениях часто возникает необходимость менять положение
уведомления в зависимости от состояния интерфейса. Для этого можно
хранить anchorOrigin в состоянии компонента:
const [position, setPosition] = React.useState({ vertical: 'bottom', horizontal: 'center' });
<Snackbar
open={open}
message="Динамическое уведомление"
anchorOrigin={position}
/>
<Button onCl ick={() => setPosition({ vertical: 'top', horizontal: 'left' })}>
Сменить позицию
</Button>
Такой подход позволяет управлять положением уведомления в реальном времени, реагируя на действия пользователя или изменение контента.
На мобильных экранах важно учитывать доступное пространство. Для
этого рекомендуется использовать адаптивные значения
anchorOrigin и смещения через sx:
<Snackbar
open={open}
message="Адаптивное уведомление"
anchorOrigin={{
vertical: window.innerWidth < 600 ? 'top' : 'bottom',
horizontal: 'center',
}}
sx={{ px: 2 }}
/>
Использование условий для vertical позволяет избежать
ситуации, когда уведомление перекрывает ключевой контент на маленьких
экранах.
При позиционировании Snackbar важно учитывать соседние компоненты,
например AppBar. Чтобы уведомление не перекрывало
верхнюю панель, можно использовать отступ через sx или
динамически изменять vertical:
<Snackbar
open={open}
message="С учётом AppBar"
anchorOrigin={{ vertical: 'top', horizontal: 'center' }}
sx={{ mt: 8 }} // Отступ равен высоте AppBar
/>
Такое решение обеспечивает визуальную гармонию и удобство взаимодействия с интерфейсом.
Компонент Snackbar поддерживает анимацию появления и скрытия через
свойство TransitionComponent. Положение уведомления не
меняется при анимации, но анимация может быть настроена так, чтобы
уведомление выезжало из края, где оно расположено:
import Slide from '@mui/material/Slide';
function SlideTransition(props) {
return <Slide {...props} direction="up" />;
}
<Snackbar
open={open}
message="Уведомление с анимацией"
anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}
TransitionComponent={SlideTransition}
/>
Здесь направление слайда должно соответствовать расположению Snackbar для естественного визуального эффекта.
Хотите, я могу подготовить подробную таблицу всех комбинаций anchorOrigin с примерами кода и визуальными схемами, чтобы легко выбирать позицию для любого сценария? Это будет очень наглядно для учебника.