Framer Motion中staggerChildren不生效 列表项无交错动画如何解决?
问题根因
你为每个<motion.li>单独配置了initial="hidden"和animate="show"属性,这会让子列表项脱离父容器的动画状态控制,挂载时直接触发动画,父容器配置的staggerChildren交错规则自然不会生效。
你也可以选择在父容器transition补充when: "beforeChildren"配置,确保父容器透明度动画优先执行,视觉效果更统一。
修复步骤
- 调整容器variants配置(可选优化)
const listItemContainerVariant = { hidden: { opacity: 0 }, show: { opacity: 1, transition: { staggerChildren: 1, when: "beforeChildren" // 父容器动画执行完成后再触发子元素动画 } } };
- 删除列表项的独立动画控制属性
移除每个<motion.li>上的initial="hidden"和animate="show",让子元素自动继承父容器的动画状态,exit和whileHover属性保留即可,不会影响删除和悬停动画效果。
修改后的JSX代码如下:
<motion.ul id="todo-list" variants={listItemContainerVariant} initial="hidden" animate="show" > <AnimatePresence> {todos.map((todo, index) => ( <motion.li variants={listItemVariant} exit="exit" whileHover="hover" key={todo.id} className="list-item" > <span className="list-item-text">{todo.text}</span> <button onClick={() => handleEdit(todo)} className="edit-btn"> <span role="img" aria-label="emoji"> ✏️ </span> </button> <button onClick={() => handleDelete(todo.id)} className="delete-btn" > <span role="img" aria-label="emoji"> 🗑 </span> </button> </motion.li> ))} </AnimatePresence> </motion.ul>
修改后初次加载就会按你配置的1秒间隔依次触发列表项的入场动画,删除时的退场动画也能正常触发。
内容的提问来源于stack exchange,提问作者Pratik Wadekar
相关产品推荐
相关产品推荐

