使用 Framer Motion 让一个元素淡入另一个元素之上

Have one element fade in on top of the other one with Framer Motion

我正在尝试淡出一个 div 与我在使用 Framer Motion 时试图淡出另一个 div 相同 space。即使在过渡上有延迟,对象本身也会立即呈现,这会导致同一 space 中的另一个对象跳来跳去。

这是我正在尝试做的一个小代码示例:

  const [short, setShort] = useState(false);

  return (
    <div>
      <img src="image.jpg" />
      <AnimatePresence>
        {!short && (
          <motion.span
            initial={{ opacity: 0 }}
            animate={{ opacity: 1 }}
            exit={{ opacity: 0 }}
            transition={{ delay: 1.5 }}
            key="logoText"
          >
            TEXT
          </motion.span>
        )}
        {short && (
          <motion.span
            initial={{ opacity: 0 }}
            animate={{ opacity: 1 }}
            exit={{ opacity: 0 }}
            transition={{delay: 1.5}}
            key="searchBox"
          >
            SOME DIFFERENT TEXT
          </motion.span>
        )}
      </AnimatePresence>

      <Button onClick={() => setShort(!short)}>Toggle</Button>
    </div>
  );
};

基本上 SOME DIFFERENT TEXT 占用的 space 立即出现,将切换按钮向右推,然后在 TEXT 消失后推入。然后单击按钮后 SOME DIFFERENT TEXT 再次向右推出。

我怎样才能让两个项目占用相同的空间 space,以便它们无缝过渡到彼此?

您可以将 exitBeforeEnter 道具 (https://www.framer.com/api/motion/animate-presence/#animatepresenceprops.exitbeforeenter) 添加到 AnimatePresence 组件,这将确保 TEXTSOME DIFFERENT TEXT 出现之前被完全移除