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

如何使GSAP中Overlay时间线的起始点与主时间线text2阶段对齐?

实现GSAP ScrollTrigger滚动动画时同步Overlay时间线到主时间线的text2阶段

现有需求:使用GSAP的ScrollTrigger插件实现滚动驱动动画,主时间线tl包含多个文本元素的过渡动画,其中标记了text2阶段;需要让Overlay对应的时间线tl2在主时间线的text2阶段启动时同步开始动画。

当前实现代码:

gsap.registerPlugin(ScrollTrigger)
const tl = gsap.timeline({
  scrollTrigger: {
    trigger: '.section',
    markers: true,
    pin: true, // 激活时固定触发元素
    start: 'top top', // 触发元素顶部碰到视口顶部时开始
    end: 'bottom top', // 触发元素底部碰到视口顶部时结束
    scrub: true
  }
})

tl.to('.text-1', { x: -400 });
tl.to('.text-2', { opacity: 1 }, "<");
tl.to('.text-2', { opacity: 0 }, "text2");
tl.to('.text-3', { opacity: 1 }, "<");
tl.to('.text-3', { opacity: 0 });
tl.to('.text-4', { opacity: 1 }, "<");

const tl2 = gsap.timeline({
  scrollTrigger: {
    trigger: '.section',
    start: 'top top', // 触发元素顶部碰到视口顶部时开始
    end: 'bottom top', // 触发元素底部碰到视口顶部时结束
    scrub: true
  }
})
tl2.to('.overlay', { opacity: 0.2 })

gsap.timeline()
        .add(tl)
        .add(tl2)

问题分析

当前代码中两个时间线各自绑定了ScrollTrigger,并且通过新时间线先后添加tl和tl2,导致tl2会在tl完全结束后才开始动画,无法实现和text2阶段同步启动的需求。

解决方案

不需要给tl2单独设置ScrollTrigger,直接将Overlay的动画嵌套到主时间线tl的text2标记点即可,主时间线的ScrollTrigger会驱动所有嵌套动画的进度。

方案一:直接在主时间线添加Overlay动画

gsap.registerPlugin(ScrollTrigger)
const tl = gsap.timeline({
  scrollTrigger: {
    trigger: '.section',
    markers: true,
    pin: true,
    start: 'top top',
    end: 'bottom top',
    scrub: true
  }
})

tl.to('.text-1', { x: -400 });
tl.to('.text-2', { opacity: 1 }, "<");
tl.to('.text-2', { opacity: 0 }, "text2");
// 在text2标记点同步启动Overlay动画
tl.to('.overlay', { opacity: 0.2 }, "text2");
tl.to('.text-3', { opacity: 1 }, "<");
tl.to('.text-3', { opacity: 0 });
tl.to('.text-4', { opacity: 1 }, "<");

方案二:嵌套tl2到主时间线的text2位置

如果需要保留tl2独立时间线的结构,可以用add方法将其插入到主时间线的指定标记点:

gsap.registerPlugin(ScrollTrigger)
const tl = gsap.timeline({
  scrollTrigger: {
    trigger: '.section',
    markers: true,
    pin: true,
    start: 'top top',
    end: 'bottom top',
    scrub: true
  }
})

tl.to('.text-1', { x: -400 });
tl.to('.text-2', { opacity: 1 }, "<");
tl.to('.text-2', { opacity: 0 }, "text2");
tl.to('.text-3', { opacity: 1 }, "<");
tl.to('.text-3', { opacity: 0 });
tl.to('.text-4', { opacity: 1 }, "<");

// 移除tl2的ScrollTrigger,因为主时间线已经驱动
const tl2 = gsap.timeline()
tl2.to('.overlay', { opacity: 0.2 })

// 将tl2插入到主时间线的text2标记点
tl.add(tl2, "text2");

两种方案都能实现Overlay动画和主时间线的text2阶段同步启动的效果,其中方案一更简洁,适合逻辑简单的场景;方案二更灵活,适合Overlay动画包含多个步骤的情况。

内容的提问来源于stack exchange,提问作者user1434702

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 13:43:19