当每个在视图中滚动时动画映射项目一次
Animate mapped items once when each is scrolled in view
我在使用 array.map 为 3 div 设置动画时遇到了一些问题。我想让每个 div 使用 framer motion 在视图中设置一次动画。
我 运行 遇到的问题是,当尝试使用 inView 分别为 div 设置动画时,成帧器运动会同时为所有 3 个设置动画。
如果我在父 Div 上设置 inView
ref={ref}
,一旦第一个可见,所有 3 个将一起动画。
或
如果我将 ref={ref}
设置到 3 个映射的 div 上,所有 3 个将仅在第 3 个也是最后一个 div 出现时动画。
我正在尝试找到一种简洁的方法来在 div 中以动画方式显示已映射数据的 Div。
codesandbox Link 供参考。
如果您希望它们单独运行,则需要为每个 div 存储单独的状态和控件。最简单的方法是制作单独的组件:
const ProjectDiv = ({ onClick, item }) => {
const controls = useAnimation();
const [ref, inView] = useInView();
useEffect(() => {
if (inView) {
controls.start('visible');
}
}, [controls, inView]);
return (
<motion.div
ref={ref}
className="project_card"
onClick={onClick}
animate={controls}
initial="hidden"
transition={{ duration: 1 }}
variants={{
visible: { opacity: 1, scale: 1 },
hidden: { opacity: 0, scale: 0 }
}}
>
<img src={item.image} alt="Project" />
<h2>{item.title}</h2>
<p>{item.description}</p>
</motion.div>
);
};
我在使用 array.map 为 3 div 设置动画时遇到了一些问题。我想让每个 div 使用 framer motion 在视图中设置一次动画。
我 运行 遇到的问题是,当尝试使用 inView 分别为 div 设置动画时,成帧器运动会同时为所有 3 个设置动画。
如果我在父 Div 上设置 inView
ref={ref}
,一旦第一个可见,所有 3 个将一起动画。
或
如果我将 ref={ref}
设置到 3 个映射的 div 上,所有 3 个将仅在第 3 个也是最后一个 div 出现时动画。
我正在尝试找到一种简洁的方法来在 div 中以动画方式显示已映射数据的 Div。
codesandbox Link 供参考。
如果您希望它们单独运行,则需要为每个 div 存储单独的状态和控件。最简单的方法是制作单独的组件:
const ProjectDiv = ({ onClick, item }) => {
const controls = useAnimation();
const [ref, inView] = useInView();
useEffect(() => {
if (inView) {
controls.start('visible');
}
}, [controls, inView]);
return (
<motion.div
ref={ref}
className="project_card"
onClick={onClick}
animate={controls}
initial="hidden"
transition={{ duration: 1 }}
variants={{
visible: { opacity: 1, scale: 1 },
hidden: { opacity: 0, scale: 0 }
}}
>
<img src={item.image} alt="Project" />
<h2>{item.title}</h2>
<p>{item.description}</p>
</motion.div>
);
};