我正在我的网站上创建一个功能,当您滚动经过某个 div 元素(即不再在视图中,使用react-intersection-observer
)时,另一个元素会在其中动画(使用framer-motion
useAnimation()
钩子)
我在 nextjs 工作,页面是服务器端渲染的
const topViewVariants = {
hide: {
y: "-100%",
},
show: {
y: "0",
},
};
const TopView = ({ inView }: { inView: boolean }) => {
const controls = useAnimation();
useEffect(() => {
if (inView) {
controls.start("hide");
} else {
controls.start("show");
}
}, [inView, controls]);
return (
<MotionMyBox
variants={topViewVariants}
animate={controls}
initial="hide"
position="fixed"
top="0"
w="100%"
zIndex="30"
display={{
base: "block",
md: "none",
}}
>
<HStack p="4">
<MyImage
src="/images/home/header/4.jpg"
alt=""
boxSize={{
base: "20",
md: "20",
lg: "20",
}}
quality=""
/>
<VStack
alignSelf="start"
justifyItems="start"
alignItems="start"
spacing="1"
>
<Heading
textTransform="uppercase"
fontWeight="thin"
fontSize="lg"
display="inline-flex"
justifyContent="center"
w="100%"
>
xtreme torpe
<Badge colorScheme="red" alignSelf="start" ml="2">
E
</Badge>
</Heading>
<Text fontSize="sm" fontWeight="semibold">
{dayjs(new Date()).format("h:mm A, dddd MMMM D")}
</Text>
<Text fontStyle="italic" fontSize="xs" opacity="0.8">
Hosted by Damien
</Text>
</VStack>
</HStack>
</MotionMyBox>
);
};
const Event = ({}: Party) => {
const [infoRef, infoInView] = useInView({
threshold: 0,
});
return (
<TopView inView={infoInView} />
<div ref={infoRef}></div>
)
}
我还使用了一个名为的 UI 库chakra-ui
我真的没有得到这个错误,因为逻辑很简单,如果<div>
在视图中然后开始这个动画。