You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Framer Motion中staggerChildren不生效 列表项无交错动画如何解决?

问题根因

你为每个<motion.li>单独配置了initial="hidden"和animate="show"属性,这会让子列表项脱离父容器的动画状态控制,挂载时直接触发动画,父容器配置的staggerChildren交错规则自然不会生效。
你也可以选择在父容器transition补充when: "beforeChildren"配置,确保父容器透明度动画优先执行,视觉效果更统一。

修复步骤

  1. 调整容器variants配置(可选优化)
const listItemContainerVariant = {
    hidden: { opacity: 0 },
    show: {
      opacity: 1,
      transition: { 
        staggerChildren: 1,
        when: "beforeChildren" // 父容器动画执行完成后再触发子元素动画
      }
    }
  };
  1. 删除列表项的独立动画控制属性
    移除每个<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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 18:15:02