You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GSAP与ScrollTrigger滚动动画问题求助

着陆页飞行卡片滚动动画问题解决方案

问题1:滚动到底部重置时卡片位置跳动

  • 核心原因是滚动位置重置与卡片动画进度不同步,移动端原生滚动回弹会放大这个问题。
  • 解决步骤:
    1. 放弃直接修改scrollTop,改用GSAP ScrollTrigger的API控制滚动重置,确保动画与滚动同步:
      // 假设滚动触发器已设置id为"scrollLoop"
      const scrollTrigger = ScrollTrigger.getById("scrollLoop");
      scrollTrigger.scroll(0, true); // 第二个参数true启用平滑滚动,避免跳变
      
    2. 给容器添加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的滚动范围。
  • 解决步骤:
    1. 强制将滚动区域完全锁定在.wrapper内:
      html, body {
        margin: 0;
        padding: 0;
        height: 100%;
        overflow: hidden;
        overscroll-behavior: none; /* 彻底禁用全局滚动回弹 */
      }
      .wrapper {
        height: 100vh;
        overflow-y: auto;
        overscroll-behavior: contain; /* 仅在容器内限制滚动溢出 */
      }
      
    2. 确认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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 19:37:24