В библиотеке MUI для управления анимацией раскрытия элементов чаще
всего используется компонент Collapse. Этот компонент
позволяет плавно изменять высоту содержимого, создавая эффект появления
или исчезновения блока.
in – логическое значение,
определяющее, открыт ли компонент. При изменении с false на
true запускается анимация раскрытия, и наоборот.timeout – задаёт длительность анимации
в миллисекундах или предустановленные значения: 'auto',
'short', 'standard', 'long'.
Значение 'auto' автоматически подбирает время анимации в
зависимости от высоты содержимого.collapsedSize – определяет высоту
компонента в закрытом состоянии. По умолчанию равна
0px.orientation – направление анимации:
'vertical' (по умолчанию) или
'horizontal'.Пример использования:
import React, { useState } from 'react';
import { Collapse, Button, Box } from '@mui/material';
function ExampleCollapse() {
const [open, setOpen] = useState(false);
return (
Содержимое, которое плавно раскрывается и скрывается
);
}
MUI использует библиотеку react-transition-group под
капотом для управления состояниями анимации. Компонент
Collapse расширяет стандартный Transition,
предоставляя следующие состояния:
entering – начало раскрытия.entered – полностью раскрыт.exiting – начало закрытия.exited – полностью закрыт.Эти состояния можно использовать для кастомной стилизации через
sx или styled:
Плавное появление с изменением прозрачности
Collapse может использоваться внутри других компонентов
с анимацией, например Accordion. Это позволяет создавать
сложные интерактивные интерфейсы с несколькими уровнями раскрытия.
import { Accordion, AccordionSummary, AccordionDetails, Typography } from '@mui/material';
import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
}>
Заголовок аккордеона
Вложенный контент с плавной анимацией
По умолчанию Collapse раскрывает контент по вертикали.
Для горизонтального раскрытия используется свойство
orientation="horizontal". В этом случае
collapsedSize указывает ширину закрытого состояния.
Горизонтальное раскрытие
Для более сложных сценариев можно комбинировать Collapse
с useState или useReducer и управлять моментом
раскрытия в зависимости от данных или пользовательских действий. Это
особенно полезно для динамических списков, где элементы добавляются и
удаляются.
const [items, setItems] = useState(['Элемент 1', 'Элемент 2']);
function addItem() {
setItems([...items, `Элемент ${items.length + 1}`]);
}
function removeItem() {
setItems(items.slice(0, -1));
}
{items.map((item, index) => (
{item}
))}
Для более плавной или специфичной анимации можно задавать
CSS-свойства transitionTimingFunction и
transitionDelay через sx или
styled:
Кастомная кривая и задержка анимации
Эти приёмы позволяют точно контролировать скорость, плавность и последовательность раскрытия, что особенно важно в интерфейсах с множеством интерактивных элементов.