GSAP与ScrollTrigger滚动动画问题求助
着陆页飞行卡片滚动动画问题解决方案
问题1:滚动到底部重置时卡片位置跳动
- 核心原因是滚动位置重置与卡片动画进度不同步,移动端原生滚动回弹会放大这个问题。
- 解决步骤:
- 放弃直接修改
scrollTop,改用GSAP ScrollTrigger的API控制滚动重置,确保动画与滚动同步:// 假设滚动触发器已设置id为"scrollLoop" const scrollTrigger = ScrollTrigger.getById("scrollLoop"); scrollTrigger.scroll(0, true); // 第二个参数true启用平滑滚动,避免跳变 - 给容器添加CSS禁用移动端原生回弹干扰:
body, html { height: 100%; overflow: hidden; touch-action: none; } .wrapper { height: 100vh; overflow-y: auto; touch-action: pan-y; }
- 放弃直接修改
问题2:父容器body自动滚动导致跳动
overscroll-behavior无效通常是因为未完全限制body的滚动范围。- 解决步骤:
- 强制将滚动区域完全锁定在
.wrapper内:html, body { margin: 0; padding: 0; height: 100%; overflow: hidden; overscroll-behavior: none; /* 彻底禁用全局滚动回弹 */ } .wrapper { height: 100vh; overflow-y: auto; overscroll-behavior: contain; /* 仅在容器内限制滚动溢出 */ } - 确认ScrollTrigger的
scroller属性严格指向.wrapper,避免误监听窗口滚动:ScrollTrigger.create({ scroller: ".wrapper", // 必须指定该容器 trigger: ".wrapper", start: "top top", end: "bottom bottom", // 其他配置项 });
- 强制将滚动区域完全锁定在
问题3:实现动画自动播放,滚动时双向加速
- 取消
scrub: true,改用滚动事件控制动画的播放速度与方向: - 示例代码:
// 1. 创建无限循环的卡片动画时间线 const cardTimeline = gsap.timeline({ repeat: -1, // 无限循环 defaults: { duration: 6, ease: "linear" // 线性动画适配匀速飞行效果 } }); // 给每个卡片添加随机起点到随机终点的动画 document.querySelectorAll(".card").forEach(card => { cardTimeline.to(card, { x: () => gsap.utils.random(0, window.innerWidth - card.offsetWidth), y: () => gsap.utils.random(0, window.innerHeight - card.offsetHeight) }, 0); // 0表示所有卡片同时启动动画 }); // 2. 用ScrollTrigger监听滚动,动态调整动画速度 ScrollTrigger.create({ scroller: ".wrapper", onUpdate: self => { const scrollVelocity = Math.abs(self.getVelocity()); // 根据滚动速度切换动画状态:滚动时加速,静止时恢复自动播放 if (scrollVelocity > 30) { // 向下滚动加速正放,向上滚动加速倒放 cardTimeline.timeScale(self.direction > 0 ? 2.5 : -2.5); } else { cardTimeline.timeScale(1); } } });
内容的提问来源于stack exchange,提问作者Fernanda Ruiz
相关产品推荐
相关产品推荐

