Transitions
Transitions help to make a UI expressive and easy to use.
MUI provides transitions that can be used to introduce some basic motion to your applications.
Collapse
Expand from the start edge of the child element.
Use the orientation prop if you need a horizontal collapse.
The collapsedSize prop can be used to set the minimum width/height when not expanded.
<FormControlLabel
control={<Switch checked={checked} onChange={handleChange} />}
label="Show"
/>
<Box sx={{ display: 'flex' }}>
<Fade in={checked}>{icon}</Fade>
</Box>Grow
Expands outwards from the center of the child element, while also fading in from transparent to opaque.
The second example demonstrates how to change the transform-origin, and conditionally applies
the timeout prop to change the entry speed.
<FormControlLabel
control={<Switch checked={checked} onChange={handleChange} />}
label="Show"
/>
<Box sx={{ display: 'flex' }}>
<Grow in={checked}>{icon}</Grow>
{/* Conditionally applies the timeout prop to change the entry speed. */}
<Grow
in={checked}
style={{ transformOrigin: '0 0 0' }}
{...(checked ? { timeout: 1000 } : {})}
>
{icon}
</Grow>
</Box>Slide
Slide in from the edge of the screen.
The direction prop controls which edge of the screen the transition starts from.
The Transition component's mountOnEnter prop prevents the child component from being mounted
until in is true.
This prevents the relatively positioned component from scrolling into view
from its off-screen position.
Similarly, the unmountOnExit prop removes the component from the DOM after it has been transition off-screen.
<Box sx={{ width: `calc(100px + 16px)` }}>
<FormControlLabel
control={<Switch checked={checked} onChange={handleChange} />}
label="Show"
/>
<Slide direction="up" in={checked} mountOnEnter unmountOnExit>
{icon}
</Slide>
</Box>Slide relative to a container
The Slide component also accepts container prop, which is a reference to a DOM node.
If this prop is set, the Slide component will slide from the edge of that DOM node.
<Box sx={{ width: 200 }}>
<FormControlLabel
control={<Switch checked={checked} onChange={handleChange} />}
label="Show from target"
/>
<Slide direction="up" in={checked} container={containerRef.current}>
{icon}
</Slide>
</Box>Zoom
Expand outwards from the center of the child element.
This example also demonstrates how to delay the enter transition.
<FormControlLabel
control={<Switch checked={checked} onChange={handleChange} />}
label="Show"
/>
<Box sx={{ display: 'flex' }}>
<Zoom in={checked}>{icon}</Zoom>
<Zoom in={checked} style={{ transitionDelay: checked ? '500ms' : '0ms' }}>
{icon}
</Zoom>
</Box>Child requirement
- Forward the style: To better support server rendering, MUI provides a
styleprop to the children of some transition components (Fade, Grow, Zoom, Slide). Thestyleprop must be applied to the DOM for the animation to work as expected. - Forward the ref: The transition components require the first child element to forward its ref to the DOM node. For more details about ref, check out Caveat with refs
- Single element: The transition components require only one child element (
React.Fragmentis not allowed).
// The `props` object contains a `style` prop.
// You need to provide it to the `div` element as shown here.
const MyComponent = React.forwardRef((props, ref) {
return (
<div ref={ref} {...props}>
Fade
</div>
);
})
export default Main() {
return (
<Fade>
{/* MyComponent must the only child */}
<MyComponent />
</Fade>
);
}
TransitionGroup
To animate a component when it is mounted or unmounted, you can use the TransitionGroup component from react-transition-group.
As components are added or removed, the in prop is toggled automatically by TransitionGroup.
- ๐ Apple
- ๐ Banana
- ๐ Pineapple
{addFruitButton}
<Box sx={{ mt: 1 }}>
<List>
<TransitionGroup>
{fruitsInBasket.map((item) => (
<Collapse key={item}>
{renderItem({ item, handleRemoveFruit })}
</Collapse>
))}
</TransitionGroup>
</List>
</Box>TransitionComponent prop
Some MUI components use these transitions internally. These accept a TransitionComponent prop to customize the default transition.
You can use any of the above components or your own.
It should respect the following conditions:
- Accepts an
inprop. This corresponds to the open/close state. - Call the
onEntercallback prop when the enter transition starts. - Call the
onExitedcallback prop when the exit transition is completed. These two callbacks allow to unmount the children when in a closed state and fully transitioned.
For more information on creating a custom transition, visit the react-transition-group Transition documentation.
You can also visit the dedicated sections of some of the components: