Animate presence 仅在退出动画的下一个 js 中不起作用?
Animate presence not working in next js for exit animations only?
我试图在下一个 js 中为我的组件设置退出动画,但我只能提供初始动画。
谁能告诉我这里出了什么问题??
这是我的示例代码:
<AnimatePresence >
<motion.div key="modalBackground" className={styles['auth-modal-layout']} key="modalBackground" initial="hidden" animate="visible" variants={
{
hidden:{
opacity:0
},
visible:{
opacity:1,
transition:{
duration:.4,
}
},
}
} >
<motion.div key="modalForm" className={styles['auth-modal-form']} initial="hidden" exit="pageExit" animate="visible" exit="hidden" variants={{
hidden:{
translateY:100,
opacity:0
},
visible:{
translateY:0,
opacity:1,
transition:{
duration:.4
}
},
pageExit:{
opacity:0,
transition:{
when:"afterChildren",
duration:.4
}
}
}} >
{modal()}
</motion.div>
</motion.div>
</AnimatePresence>
<AnimatePresence>
需要包装有条件渲染的组件。它不能在里面。
您需要将 <AnimatePresence>
标记移动到更高级别或将您的条件逻辑移动到组件中。您很可能会选择前者,如下所示:
<AnimatePresence>
{modalIsVisible && <ModalComponent />}
</AnimatePresence>
(在此示例中 ModalComponent
包含您上面显示的代码)。
否则,您需要始终渲染组件并传入一个 prop 以用于有条件地渲染子组件。在你的情况下(模态window)我认为这不是你想要的。
你这样做,更多例子here:
<AnimatePresence>
<motion.div
// initial state opacity
initial={{ opacity: 0 }}
//animation of component appearence
animate={{ opacity: 1 }}
// how your element will appears f.e(duration in seconds)
transition={{ delay: 0.5 }}
// your exit animation
exit={{ opacity: 0 }}
>
{your_content_here}
</motion.div>
</AnimatePresence>
如果您发出一些错误,那不是 nextjs
。尝试在 framer
的 code/lib 中查找问题
您还在 div 中输入(?确定 2 退出?):
initial="hidden" exit="pageExit" animate="visible" exit="hidden"
检查 valid motion components。始终尝试从文档中获取示例。
P.S。如果你需要移动“更高”,你只需包装你的父组件,或者你可以将代码包装在你的 _app.js
中。 但是这种方法意味着每个页面都会加载framer lib的AnimatePresence代码。
function MyApp({ Component, pageProps }) {
return (
<AnimatePresence>
<Component {...pageProps} />
</AnimatePresence>
)
}
修改:
我已经检查了 AnimatePresence
行为,它实际上并没有在做他的工作。我检查了我是如何做同样的事情的。这是一个如何做到这一点的想法,代码示例如下。
//npm install this before: npm i react-intersection-observer
import { useInView } from "react-intersection-observer";
//in your hooks part, where you place hooks
const controls = useAnimation();
const [ref, inView] = useInView();
useEffect(() => {
if (inView) {
controls.start("visible");
}
else {
controls.start("hidden");
}
}, [controls, inView]);
//and the component, check how I did it (example)
<motion.div
style={{marginTop: '1000px', marginBottom: '1000px'}}
ref={ref}
animate={controls}
initial="hidden"
transition={{ duration: 2 }}
variants={{
visible: { opacity: 1, scale: 1 },
hidden: { opacity: 0, scale: 0 }
}}
>
<img src="https://super-monitoring.com/blog/wp-content/uploads/2020/03/framer.png"></img>
</motion.div>
由于很多我不记得的原因,我没有使用AnimationPresence。 问题 AnimationPresence
它没有清楚地“理解”用户目前 在页面上的位置。我认为这就是他们在 framer examples 中添加 isVisible
变量的原因。 react-intersection-observer
正在检测用户所在的位置。很抱歉修改部分之前的混乱信息。
P.S。还要检查 this
我试图在下一个 js 中为我的组件设置退出动画,但我只能提供初始动画。
谁能告诉我这里出了什么问题??
这是我的示例代码:
<AnimatePresence >
<motion.div key="modalBackground" className={styles['auth-modal-layout']} key="modalBackground" initial="hidden" animate="visible" variants={
{
hidden:{
opacity:0
},
visible:{
opacity:1,
transition:{
duration:.4,
}
},
}
} >
<motion.div key="modalForm" className={styles['auth-modal-form']} initial="hidden" exit="pageExit" animate="visible" exit="hidden" variants={{
hidden:{
translateY:100,
opacity:0
},
visible:{
translateY:0,
opacity:1,
transition:{
duration:.4
}
},
pageExit:{
opacity:0,
transition:{
when:"afterChildren",
duration:.4
}
}
}} >
{modal()}
</motion.div>
</motion.div>
</AnimatePresence>
<AnimatePresence>
需要包装有条件渲染的组件。它不能在里面。
您需要将 <AnimatePresence>
标记移动到更高级别或将您的条件逻辑移动到组件中。您很可能会选择前者,如下所示:
<AnimatePresence>
{modalIsVisible && <ModalComponent />}
</AnimatePresence>
(在此示例中 ModalComponent
包含您上面显示的代码)。
否则,您需要始终渲染组件并传入一个 prop 以用于有条件地渲染子组件。在你的情况下(模态window)我认为这不是你想要的。
你这样做,更多例子here:
<AnimatePresence>
<motion.div
// initial state opacity
initial={{ opacity: 0 }}
//animation of component appearence
animate={{ opacity: 1 }}
// how your element will appears f.e(duration in seconds)
transition={{ delay: 0.5 }}
// your exit animation
exit={{ opacity: 0 }}
>
{your_content_here}
</motion.div>
</AnimatePresence>
如果您发出一些错误,那不是 nextjs
。尝试在 framer
您还在 div 中输入(?确定 2 退出?):
initial="hidden" exit="pageExit" animate="visible" exit="hidden"
检查 valid motion components。始终尝试从文档中获取示例。
P.S。如果你需要移动“更高”,你只需包装你的父组件,或者你可以将代码包装在你的 _app.js
中。 但是这种方法意味着每个页面都会加载framer lib的AnimatePresence代码。
function MyApp({ Component, pageProps }) {
return (
<AnimatePresence>
<Component {...pageProps} />
</AnimatePresence>
)
}
修改:
我已经检查了 AnimatePresence
行为,它实际上并没有在做他的工作。我检查了我是如何做同样的事情的。这是一个如何做到这一点的想法,代码示例如下。
//npm install this before: npm i react-intersection-observer
import { useInView } from "react-intersection-observer";
//in your hooks part, where you place hooks
const controls = useAnimation();
const [ref, inView] = useInView();
useEffect(() => {
if (inView) {
controls.start("visible");
}
else {
controls.start("hidden");
}
}, [controls, inView]);
//and the component, check how I did it (example)
<motion.div
style={{marginTop: '1000px', marginBottom: '1000px'}}
ref={ref}
animate={controls}
initial="hidden"
transition={{ duration: 2 }}
variants={{
visible: { opacity: 1, scale: 1 },
hidden: { opacity: 0, scale: 0 }
}}
>
<img src="https://super-monitoring.com/blog/wp-content/uploads/2020/03/framer.png"></img>
</motion.div>
由于很多我不记得的原因,我没有使用AnimationPresence。 问题 AnimationPresence
它没有清楚地“理解”用户目前 在页面上的位置。我认为这就是他们在 framer examples 中添加 isVisible
变量的原因。 react-intersection-observer
正在检测用户所在的位置。很抱歉修改部分之前的混乱信息。
P.S。还要检查 this