Framer-motion配置staggerChildren后子元素未产生错开动画效果
Framer Motion staggerChildren 不生效问题修复
问题原因
staggerChildren失效的核心原因是子元素dropUpVariants的visible状态transition中配置了固定delay: .3。staggerChildren的工作逻辑是父容器触发动画时,自动按子元素顺序给每个子元素的动画延迟叠加索引 * staggerChildren值的偏移量,实现依次错开效果。如果子元素自身transition里写了固定delay值,会直接使用这个固定值,覆盖stagger自动计算的偏移延迟,最终所有子元素都在0.3s后同时执行动画,没有错开效果。
修复方案
- 移除子元素变体里的固定
delay: .3配置 - 如果需要给整组动画设置统一的启动延迟(即第一个子元素也等待0.3s再开始,后续每个子元素间隔0.5s),把
delay: .3移到父容器containerVariants的transition配置中即可
修正后的variants代码
export const containerVariants = { hidden: { opacity: .6 }, visible: { opacity: 1, transition: { delay: .3, // 整组动画统一启动延迟,移到父容器配置 staggerChildren: 0.5, // 可选配置:如果需要父容器自身的opacity动画执行完再触发子元素动画,打开下面一行 // when: "beforeChildren" } } } export const dropUpVariants = { hidden: { y: '100vw' }, visible: { y: 0, transition: { type: 'spring', stiffness: 100, mass: .3 // 移除此处原有的固定delay: .3 } } }
JSX结构说明
你当前写的JSX结构完全符合要求,不需要做任何调整:父motion容器绑定了容器变体、设置了initial/animate状态,子motion元素绑定了对应子变体,会自动继承父容器的动画状态,满足staggerChildren的生效条件。
补充提示:如果后续需要给某个特定子元素设置单独的额外延迟,可以在对应子元素的transition中用动态计算的延迟写法,不要写所有子元素统一的固定delay值,避免覆盖stagger逻辑。
内容的提问来源于stack exchange,提问作者VictoriaStudios
相关产品推荐
相关产品推荐

