无条件渲染的 Framer Motion Animate Presence
Framer Motion Animate Presence without conditional rendering
我有以下使用 framer motion 的 React 飞出导航组件。每个导航项都会多次使用此组件。
有没有其他方法可以在没有条件渲染 (SEO) 的情况下触发此动画?使用 key
将不起作用,因为我需要它默认隐藏并且仅在 isActive
等于 true 时可见。
<AnimatePresence initial={false}>
{isActive && (
<FlyOutWrapper exit={{ opacity: 0 }} transition={{ duration: 0.2 }}>
<FlyOutContent
initial={{
x: "5rem",
opacity: 0,
}}
animate={{
x: 0,
opacity: 1,
}}
transition={{ duration: 0.3 }}>
<Content>{title}</Content>
</FlyOutContent>
<FlyOutBackground
initial={{ y: "-100%" }}
animate={{ y: 0 }}
transition={{ duration: 0.3 }}
/>
</FlyOutWrapper>
)}
</AnimatePresence>
如果您不希望它离开 DOM,那么您根本不需要使用 AnimatePresence
。相反,您可以根据 isActive
状态为位置(和不透明度等)设置动画。您可以使用 variants
或直接在属性之间切换来执行此操作。
示例(无变体):
<FlyOutBackground
initial={{ y: "-100%" }}
animate={{ y: isActive ? 0 : "-100%" }}
transition={{ duration: 0.3 }}
/>
使用变体的示例:
const bgVariants = {
visible: {
y: 0
},
hidden: {
y: "-100%"
}
}
<FlyOutBackground
variants={bgVariants}
initial="hidden"
animate={isActive ? "visible" : "hidden"}
transition={{ duration: 0.3 }}
/>
我有以下使用 framer motion 的 React 飞出导航组件。每个导航项都会多次使用此组件。
有没有其他方法可以在没有条件渲染 (SEO) 的情况下触发此动画?使用 key
将不起作用,因为我需要它默认隐藏并且仅在 isActive
等于 true 时可见。
<AnimatePresence initial={false}>
{isActive && (
<FlyOutWrapper exit={{ opacity: 0 }} transition={{ duration: 0.2 }}>
<FlyOutContent
initial={{
x: "5rem",
opacity: 0,
}}
animate={{
x: 0,
opacity: 1,
}}
transition={{ duration: 0.3 }}>
<Content>{title}</Content>
</FlyOutContent>
<FlyOutBackground
initial={{ y: "-100%" }}
animate={{ y: 0 }}
transition={{ duration: 0.3 }}
/>
</FlyOutWrapper>
)}
</AnimatePresence>
如果您不希望它离开 DOM,那么您根本不需要使用 AnimatePresence
。相反,您可以根据 isActive
状态为位置(和不透明度等)设置动画。您可以使用 variants
或直接在属性之间切换来执行此操作。
示例(无变体):
<FlyOutBackground
initial={{ y: "-100%" }}
animate={{ y: isActive ? 0 : "-100%" }}
transition={{ duration: 0.3 }}
/>
使用变体的示例:
const bgVariants = {
visible: {
y: 0
},
hidden: {
y: "-100%"
}
}
<FlyOutBackground
variants={bgVariants}
initial="hidden"
animate={isActive ? "visible" : "hidden"}
transition={{ duration: 0.3 }}
/>