Skip to content

Tween 与 Ease:核心方法、属性简写与缓动

基于 GSAP v3.15(npm gsap@3.15.0,2026-04-13 发布)· 2025-04 起全插件 100% 免费(含商业项目)· 核于 2026-07

速查

  • 四大方法to(当前→目标)/ from(起始→当前,immediateRender 默认 true)/ fromTo(显式起止,最可控)/ set(零时长赋值)。
  • 特殊值语法"+=100" 相对增加 / "-=50" 相对减少 / "random(-100,100)" 随机值 / 函数式 (index, target, list) => ... 逐元素动态值。
  • 基础时序 varsduration(默认 0.5)、delayease(默认 "power1.out")、easeReverse(v3.15 新增,反向播放独立缓动,替代已弃用的 yoyoEase)。
  • 重复/往返repeat-1 无限)、repeatDelayrepeatRefresh(每轮重新取值,配合 random() 用)、yoyo(往返播放)。
  • 播放状态pausedreversedrunBackwards
  • 回调族onStart/onUpdate/onComplete/onRepeat/onReverseComplete,均有对应 xxxParams 传参数组,及 callbackScope
  • 高级 varsoverwritetrue/"auto"/false)、immediateRenderlazy(默认 true)、staggerinherit(继承父 timeline 的 defaults)、startAt(隐式初始 from)、id(配合 gsap.getById())、keyframes(单个 .to() 内多阶段关键帧数组)。
  • transform 简写x/y/xPercent/yPercent/scale/scaleX/scaleY/rotation/rotationX/rotationY/skewX/skewY,代替原生 CSS transform 字符串。
  • 固定变换顺序:GSAP 内部固定按 平移 → 缩放 → rotationX → rotationY → 倾斜 → 旋转 的顺序应用,规避原生 CSS transform 因书写顺序不同导致结果不同的坑。
  • autoAlphaopacity + visibility 合体,值为 0 时自动加 visibility:hidden,非 0 时恢复 visibility:inherit
  • 3D 变换transformPerspective(单元素透视)或父容器 CSS perspective(子元素共享视点)+ rotationY/rotationX
  • 不局限于 DOM:可直接动画普通 JS 对象的任意数值属性,也可动画 SVG 专属属性(attr:{ x, cx, r }fillstroke-dashoffset 等)。
  • Ease 内置族none(线性)、power1~power4back(回弹超调)、elastic(弹簧)、bounce(弹跳)、circ/expo/sine(三角/指数曲线)、steps(阶跃);EasePack 扩展 rough/slow/expoScale;自定义插件 CustomEase/CustomBounce/CustomWiggle
  • 修饰符.in(起步慢后加速)/.out(起步快后减速,默认族多用)/.inOut(两端都缓)。
  • 可配置参数back.out(1.7)(超调强度,默认 1.70158)、elastic.out(1, 0.3)(振幅、周期)、steps(12)(阶跃数)。
  • 全局/局部默认gsap.defaults({ ease, duration }) 全局;gsap.timeline({ defaults: {...} }) 局部覆盖。
  • Ease Visualizer:官网交互式曲线编辑器(Alt+点击切换锚点平滑/尖角,Shift+点击多选,Delete 删除锚点,Ctrl+Z 撤销),可视化调参并生成 CustomEase 代码。
  • ⚠️ from/fromTo 默认 immediateRender:true,脚本加载晚或有 SSR 水合延迟时可能先闪一下最终态再跳回起始态(FOUC)。
  • ⚠️ 永远用 GSAP 的独立简写属性(x/rotation/scale),别直接写 CSS transform 字符串。

一、四大核心方法:to / from / fromTo / set

方法语义immediateRender 默认值
gsap.to(targets, vars)当前状态动画到 vars 指定的目标值(最常用)false
gsap.from(targets, vars)从 vars 指定值动画到当前状态(常用于入场动画)true
gsap.fromTo(targets, fromVars, toVars)显式指定起止两端,最精确可控true
gsap.set(targets, vars)零时长立即设置属性(本质是 duration:0 的特例)
js
gsap.to(".box", { x: 100, duration: 1, ease: "power2.out" });
gsap.from(".box", { opacity: 0, y: 50, duration: 1 });          // 常见入场动画写法
gsap.fromTo(".box", { scale: 0 }, { scale: 1, duration: 0.6 }); // 起止都显式声明,避免 FOUC
gsap.set(".box", { transformOrigin: "50% 50%" });               // 无动画,立即设置

from 动画的 FOUC(初始态闪现)

gsap.from()/fromTo() 默认 immediateRender:true 会立即把元素设为起始值,但如果脚本加载较晚或有 SSR 水合延迟,用户可能先看到最终态"闪"一下再跳回起始态。首屏关键动画建议配合服务端/CSS 预先设置好初始不可见态,或用 fromTo 显式声明避免依赖当前 DOM 状态的不确定性。

二、vars 配置对象全解

vars 是传给 to/from/fromTo/set 的第二个(或 fromTo 的第三个)参数,除了要动画的目标属性外,还接受大量控制类配置:

基础时序duration(默认 0.5s)、delayease(默认 "power1.out")、easeReverse(v3.15 新增,反向播放时的独立缓动,替代已弃用的 yoyoEase)。

重复/往返repeat-1 无限循环)、repeatDelayrepeatRefresh(每次重复重新取值,配合 random() 产生每轮不同的随机值)、yoyo(往返播放)。

播放状态pausedreversedrunBackwards

回调族onStart/onUpdate/onComplete/onRepeat/onReverseComplete(均有对应 xxxParams 传参数组)、callbackScope

高级配置overwritetrue/"auto"/false,控制同目标动画冲突时的覆盖策略)、immediateRenderlazy(默认 true,延迟值写入以优化性能)、stagger(详见下一篇)、inherit(继承父 timeline 的 defaults)、startAt(定义初始属性值,等价于内部隐式 from)、id(配合 gsap.getById() 查询)、keyframes(同一目标的多阶段关键帧数组,写单个 .to() 即可完成多段动画)。

特殊值语法是 vars 里最常被忽略的能力——属性值不一定是普通数字,也可以是字符串表达式或函数:

js
gsap.to(".box", { x: "+=100" });              // 相对当前值增加 100
gsap.to(".box", { x: "-=50" });               // 相对当前值减少 50
gsap.to(".box", { x: "random(-100, 100)" });  // 随机值,配合 repeatRefresh 每轮重新随机

gsap.to(".box", {
  x: (index, target, list) => index * 50,     // 函数式:逐元素动态求值
});

三、transform 属性:为什么不用 CSS transform 字符串

transform 简写优势(必考):GSAP 用 x/y/xPercent/yPercent/scale/scaleX/scaleY/rotation/rotationX/rotationY/skewX/skewY 等独立属性代替原生 CSS transform 字符串,原因两点:

  1. 避免"写入字符串 → 浏览器解析生成 matrix() → 再读取"的额外解析开销。
  2. GSAP 内部固定按 平移 → 缩放 → rotationX → rotationY → 倾斜 → 旋转 的顺序应用变换,规避了原生 CSS transform 因书写顺序不同导致结果不同的坑。
js
gsap.to(element, { x: 50 });                     // 而非 { transform: "translateX(50px)" }
gsap.to(element, { autoAlpha: 0, duration: 1 });  // 淡出且脱离交互
gsap.to(myObj, { value: 100, onUpdate: () => draw(myObj.value) }); // 动画任意对象属性

transform 一定要用 GSAP 简写,别用 CSS transform 字符串

直接 { transform: "translateX(50px)" } 会绕开 GSAP 的优化路径(需要解析生成的 matrix),且多属性同时变换时容易因书写顺序产生和预期不同的结果;应始终用 x/y/rotation/scale 等独立简写属性。

除了 transform 简写,还有几个常考的属性能力:

  • autoAlphaopacity + visibility 的合体属性,值为 0 时自动加 visibility:hidden(避免不可见元素仍可交互/被读屏,且合成层可被浏览器优化掉),非 0 时恢复 visibility:inherit
  • 3D 变换transformPerspective(单元素透视)或父容器 CSS perspective(子元素共享同一视点)+ rotationY/rotationX
  • 任意数值对象属性:GSAP 不局限于 DOM,可直接动画普通 JS 对象的任意数值属性(游戏坐标、Canvas 绘制参数、WebGL uniform 等)。
  • SVG 属性:可直接动画 SVG 专属属性如 attr:{ x, cx, r }fillstroke-dashoffset 等。

四、Ease 缓动体系

Ease 决定动画的"手感",是同一段位移在不同曲线下观感截然不同的核心变量。内置族:none(线性)、power1~power4(幂函数,力度递增)、back(回弹超调)、elastic(弹簧)、bounce(弹跳)、circ/expo/sine(三角/指数曲线)、steps(阶跃,动画像逐帧定格)。EasePack 扩展:roughslowexpoScale。自定义插件:CustomEase(任意贝塞尔曲线)、CustomBounceCustomWiggle

修饰符:每种 ease 都可加 .in(起步慢后加速)/.out(起步快后减速,默认族多用 out)/.inOut(两端都缓)。

可配置参数back.out(1.7)(超调强度,默认 1.70158)、elastic.out(1, 0.3)(振幅、周期)、steps(12)(阶跃数)。

js
gsap.to(".box", { x: 300, ease: "power2.out" });
gsap.to(".box", { x: 300, ease: "back.out(1.7)" });
gsap.to(".box", { x: 300, ease: "elastic.out(1, 0.3)" });
gsap.to(".box", { x: 300, ease: "steps(6)" });
gsap.to(".box", { x: 300, ease: "power1.inOut" });

// 全局/局部默认缓动
gsap.defaults({ ease: "power2.out", duration: 1 });
gsap.timeline({ defaults: { ease: "power2.inOut" } });

Ease Visualizer

官网提供交互式曲线编辑器(Alt+点击切换锚点平滑/尖角,Shift+点击多选,Delete 删除锚点,Ctrl+Z 撤销),用于可视化调参并生成 CustomEase 代码,调参时比死记参数表更直观。

v3.15 新增的 easeReverse 值得单独一提:它为反向播放(reverse()/yoyo)单独指定缓动曲线,正式取代了已弃用的 yoyoEase——之前想让往返动画"去程用 power2.out、回程用 power2.in"需要手动监听回调切换 ease,现在一个 vars 字段即可声明。


下一步进入 Timeline 与 stagger:把单个 Tween 编排成有顺序、有重叠、有标签的复杂动画序列,并学会批量交错多个目标。