你们中的大多数人可能正在寻找此类问题的答案和解决方案,我解决了这个问题,尝试了不同的库和在线解决方案,其中大多数都没有按预期工作,最终我使用 gsap3、gsap3 ScrollTrigger 解决了这个问题和 ReactJS,我使用视口滚动映射页面数组,并使用小的 JavaScript 逻辑来捕捉页面以使用滚动触发器查看,这主要解决了我所有的问题,起初使用 gsap 可能看起来有点不知所措,但我向你保证结果将超出预期。
代码示例如下......
const LandingPage = () => {
const pannel_1 = useRef(null);
const pannel_2 = useRef(null);
const pannel_3 = useRef(null);
const pages = [
pannel_1.current,
pannel_2.current,
pannel_3.current,
];
// page animation
useEffect(() => {
function goToSection(i, pannel, anim) {
const tl = gsap.timeline();
if (tl.isActive()) return null;
tl.to(window, {
scrollTo: { y: pannel, autoKill: false },
duration: 0.7,
ease: 'none'
});
if (anim) {
anim.restart();
}
}
pages.map((pannel, i) => {
ScrollTrigger.create({
trigger: pannel,
onEnter: () => goToSection(i, pannel)
});
ScrollTrigger.create({
trigger: pannel,
start: 'bottom bottom',
onEnterBack: () => goToSection(i, pannel)
});
});
});
return (
<div className={styles.container}>
<section ref={pannel_1} className={`${styles.pannel}`}>
<Page pannel_1={pannel_1} />
</section>
<section ref={pannel_2} className={`${styles.pannel} `}>
<Page pannel_3={pannel_3} />
</section>
<section ref={pannel_3} className={`${styles.pannel}`}>
<Page pannel_3={pannel_3} />
</section>
</div>
);
};
export default LandingPage;