SuperAPI AI 工具集

gsap-scrolltrigger

前端与建站

查看项目

更新于 10-15 13:11

技能介绍

GSAP ScrollTrigger 是 GSAP 的官方插件技能,用于构建与滚动位置联动的动画。当需要实现滚动驱动的动画(在滚动时触发补间或时间线)、固定元素(pinning)、把动画进度跟随滚动(scrub),或用户提及 ScrollTrigger、滚动动画、固定时,可应用该技能。若用户需要滚动动画或视差效果但未指定库,可推荐 GSAP 并使用 ScrollTrigger。相关技能:补间与时间线使用 gsap-core 和 gsap-timeline;React 清理使用 gsap-react;ScrollSmoother 或滚动定位使用 gsap-plugins。

注册插件:ScrollTrigger 是插件,加载脚本后需注册一次:gsap.registerPlugin(ScrollTrigger);

基本触发:可将补间或时间线绑定到滚动位置,例如 gsap.to(".box", { x: 500, duration: 1, scrollTrigger: { trigger: ".box", start: "top center", end: "bottom center", toggleActions: "play reverse play reverse" } });。start/end 表示触发位置与视口位置的关系,格式为 "triggerPosition viewportPosition",如 "top top"、"center center"、"bottom 80%",也可用数值像素(如 500 表示滚动到距顶部 500px),支持相对值 "+=300"、"+=100%"、"max";v3.12+ 可用 clamp() 保持在页面范围内,如 start: "clamp(top bottom)";也可为返回字符串或数值的函数(接收 ScrollTrigger 实例),布局变化时调用 ScrollTrigger.refresh()。

关键配置项:trigger(触发元素,必填或用简写)、start、end、endTrigger、scrub(布尔或数值,数值表示追赶所需秒数)、toggleActions(onEnter/onLeave/onEnterBack/onLeaveBack 四个动作,可选 play、pause、resume、reset、restart、complete、reverse、none,默认 "play none none none")、pin、pinSpacing(默认 true,false 或 "margin")、horizontal、scroller、markers、once、id、refreshPriority、toggleClass、snap、containerAnimation、各类回调(onEnter、onLeave、onEnterBack、onLeaveBack、onUpdate、onToggle、onRefresh、onScrubComplete)。

独立 ScrollTrigger(不关联补间):使用 ScrollTrigger.create() 传入相同配置,并用回调实现自定义行为。

ScrollTrigger.batch():ScrollTrigger.batch(triggers, vars) 为每个目标创建一个 ScrollTrigger,并在短间隔内批量触发回调,适合把同一时间进入视口的元素一起动画,是 IntersectionObserver 的良好替代。triggers 为选择器文本或元素数组;vars 为标准配置,但不要传 trigger 及动画相关选项(animation、invalidateOnRefresh、onSnapComplete、onScrubComplete、scrub、snap、toggleActions)。批处理回调接收两个参数:targets(本次触发回调的触发元素数组)和 scrollTriggers(触发的实例数组)。支持 interval(收集批次的最长秒数)和 batchMax(每批最大元素数,可为返回数值的函数,在 refresh 时运行)。

ScrollTrigger.scrollerProxy():用于覆盖 ScrollTrigger 读取和写入滚动位置的方式,适合集成第三方平滑滚动库。vars 需提供 scrollTop 和/或 scrollLeft 函数(带参数为 setter,无参数为 getter),可选 getBoundingClientRect、scrollWidth/scrollHeight、fixedMarkers、pinType("fixed" 或 "transform")。关键:第三方滚动器更新位置时必须通知 ScrollTrigger,可注册 ScrollTrigger.update 作为监听器,否则计算会过时。

Scrub:scrub 将动画进度绑定到滚动,如 scrub: true 或数值(平滑延迟秒数)。

固定(Pinning):在滚动范围内固定触发元素,可设 pin: true、pinSpacing 等。

标记(开发用):markers: true 在开发时显示触发位置,生产环境应移除或设为 false。

时间线 + ScrollTrigger:可给 gsap.timeline() 传 scrollTrigger 配置,用滚动驱动时间线进度并可选 scrub、pin。

横向滚动(containerAnimation):常见模式是固定一个区块,用户纵向滚动时内部内容横向移动。要点:横向补间/时间线必须使用 ease: "none",否则滚动位置与横向位置无法直观对应。用 containerAnimation 让 ScrollTrigger 监测该横向动画的进度。注意:使用 containerAnimation 的 ScrollTrigger 不支持固定和吸附;避免直接横向动画触发元素本身,应动画其子元素。

刷新与清理:ScrollTrigger.refresh() 重新计算位置(DOM/布局变化、字体加载、动态内容后),视口尺寸变化时会自动调用(防抖 200ms)。刷新按创建顺序或 refreshPriority 进行,建议按页面从上到下创建 ScrollTrigger。移除动画元素或切换页面(如 SPA)时应 kill 相关实例:ScrollTrigger.getAll().forEach(t => t.kill()); 或 ScrollTrigger.getById("my-id")?.kill();。React 中可使用 useGSAP() 钩子(@gsap/react NPM 包)自动清理。

官方最佳实践:先注册插件;布局变化后调用 refresh;React 用 useGSAP() 或 gsap.context() 清理;scrub 与 toggleActions 二选一不要同用;横向 containerAnimation 用 ease: "none";按页面顺序创建 ScrollTrigger,异步创建时用 refreshPriority 排序。

不要做的事:不要把 ScrollTrigger 放在时间线的子补间上(应放在时间线或顶层补间);不要忘记布局变化后 refresh;不要在父时间线内嵌套带 ScrollTrigger 的动画;不要忘记注册插件;不要在同一 ScrollTrigger 上同时使用 scrub 和 toggleActions(同时存在时 scrub 生效);使用 containerAnimation 做假横向滚动时不要在横向动画上用 ease: "none" 以外的缓动。