因此,我想实现相同的目标并尝试使用 onLoad 事件。nextJs 的 Image 组件接受这个作为道具,所以这是我的结果:
const animationVariants = {
visible: { opacity: 1 },
hidden: { opacity: 0 },
}
const FadeInImage = props => {
const [loaded, setLoaded] = useState(false);
const animationControls = useAnimation();
useEffect(
() => {
if(loaded){
animationControls.start("visible");
}
},
[loaded]
);
return(
<motion.div
initial={"hidden"}
animate={animationControls}
variants={animationVariants}
transition={{ ease: "easeOut", duration: 1 }}
>
<Image
{...p}
onLoad={() => setLoaded(true)}
/>
</motion.div>
);
}
但是,图像并不总是淡入,如果图像尚未缓存,onLoad 事件似乎被触发得太早。我怀疑这是一个将在未来的 nextJS 版本中修复的错误。如果其他人找到解决方案,请让我更新!
然而,上面的解决方案经常工作,并且由于每次都会触发 onLoad,它不会破坏任何东西。
编辑:此解决方案对动画使用 framer-motion。这也可以被任何其他动画库或原生 CSS 转换替换