Some Examples » 28. Variants: Staggered animation
28. Variants: Staggered animation
As shown in the previous example, a child will automatically follow its parent’s animation (when using variants). You can orchestrate the delay between the parent and child animations with staggerChildren and delayChildren.
Code component
export default function CC_28_Variants_Staggered_animation(props) {
const container = {
hidden: { rotate: 90 },
show: {
rotate: 0,
transition: {
staggerChildren: 0.1,
delayChildren: 0.3,
},
},
}
const itemA = {
hidden: { scale: 0, top: 100 },
show: { scale: 1, top: 30 },
}
const itemB = {
hidden: { scale: 0, top: 200 },
show: { scale: 1, top: 80 },
}
return (
<div>
<motion.div
style={{
width: 150,
height: 150,
borderRadius: 30,
backgroundColor: "#fff",
position: "relative",
}}
variants={container}
initial="hidden"
animate="show"
>
<motion.div
style={{ ...blobStyle, left: 30 }}
variants={itemA}
/>
<motion.div
style={{ ...blobStyle, left: 80 }}
variants={itemA}
/>
<motion.div
style={{ ...blobStyle, left: 30 }}
variants={itemB}
/>
<motion.div
style={{ ...blobStyle, left: 80 }}
variants={itemB}
/>
</motion.div>
</div>
)
}
const blobStyle: React.CSSProperties = {
width: 40,
height: 40,
borderRadius: 75,
backgroundColor: "#1d1ef0",
position: "absolute",
}
Code overrides
export function Parent(Component): ComponentType {
return (props) => {
const container = {
hidden: { rotate: 90 },
show: {
rotate: 0,
transition: { staggerChildren: 0.1, delayChildren: 0.3 },
},
}
return (
<Component
{...props}
variants={container}
initial="hidden"
animate="show"
/>
)
}
}
export function ChildA(Component): ComponentType {
return (props) => {
return (
<Component
{...props}
variants={{
hidden: { scale: 0, top: 100 },
show: { scale: 1, top: 30 },
}}
/>
)
}
}
export function ChildB(Component): ComponentType {
return (props) => {
return (
<Component
{...props}
variants={{
hidden: { scale: 0, top: 200 },
show: { scale: 1, top: 80 },
}}
/>
)
}
}