framer-motion
自5.3版本以来已经内置了支持此用例的功能。
这里是演示该模式的 CodeSandbox:https://codesandbox.io/s/framer-motion-animate-in-view-5-3-94j13
相关的代码:
function FadeInWhenVisible({ children }) {
return (
<motion.div
initial="hidden"
whileInView="visible"
viewport={{ once: true }}
transition={{ duration: 0.3 }}
variants={{
visible: { opacity: 1, scale: 1 },
hidden: { opacity: 0, scale: 0 }
}}
>
{children}
</motion.div>
);
}
使用方法:
<FadeInWhenVisible>
<Box />
</FadeInWhenVisible>
之前的版本:
您可以使用命令式动画控件来实现此效果。Intersection observers可用于检测元素是否当前可见。
这是一个演示该模式的CodeSandbox:https://codesandbox.io/s/framer-motion-animate-in-view-gqcc8。
相关代码:
function FadeInWhenVisible({ children }) {
const controls = useAnimation();
const [ref, inView] = useInView();
useEffect(() => {
if (inView) {
controls.start("visible");
}
}, [controls, inView]);
return (
<motion.div
ref={ref}
animate={controls}
initial="hidden"
transition={{ duration: 0.3 }}
variants={{
visible: { opacity: 1, scale: 1 },
hidden: { opacity: 0, scale: 0 }
}}
>
{children}
</motion.div>
);
}