Tween
快速入门
最简用法
// This is a Tween
gsap.to(".box", { rotation: 27, x: 100, duration: 1 });
Tween 是执行所有动画工作的核心 - 就把它想象成一个高性能属性设置器高性能的属性设置器。你提供目标对象(你想动画化的对象)、一个持续时间,以及你想要动画化的任意属性;当它的播放头移动到新的位置时,它会自动计算在该点这些属性值应该是什么,并相应地应用它们。
创建 Tween 的方法(所有这些方法都会返回一个 Tween 实例):
对于简单的动画,上面的方法就是你需要的一切!例如:
//rotate and move elements with a class of "box" ("x" is a shortcut for a translateX() transform) over the course of 1 second.
gsap.to(".box", { rotation: 27, x: 100, duration: 1 });
加载中...
由于 GSAP 可以动画化任何对象的任何属性,你并不局限于 CSS 属性或 DOM 对象。你可以尽情发挥。你可能会惊讶于用 GSAP 能够动画化的对象数量之多,并且“开箱即用”。
可以使用delay
特殊属性,但时间轴(Timeline)它让序列和复杂的编排变得更加简单。Timeline 就像是多个 Tween 实例(或者其他的时间轴(Timeline))的时间容器,在其中你可以按时间定位它们并整体控制它们。请见Timeline 文档了解详情。
如需稍后控制 Tween 实例,请将其赋值给一个变量(GSAP 很方便地是面向对象的):
let tween = gsap.to(".class", { rotation: 360, duration: 5, ease: "elastic" });
//now we can control it!
tween.pause();
tween.seek(2);
tween.progress(0.5);
tween.play();
加载中...
如果只是触发动画并让它运行,无需使用变量。Tween 默认立即播放(虽然你可以设置一个delay
或者paused
值),并且当它们完成时会自动销毁自己。可以随意调用gsap.to()
,无需担心清理工作。
参数
- targets- 你想动画化其属性的对象(们)。这可以是类似
".class"
,"#id"
等的选择器文本(GSAP 内部使用document.querySelectorAll()
),也可以直接引用元素、通用对象,甚至是一个对象数组 - vars- 一个包含你想要动画化的所有属性/值的对象,以及一些特殊属性如
ease
,duration
,delay
,或者onComplete
(如下所列)。
特殊属性
- 所有回调函数(onStart、onUpdate、onComplete 等)使用的执行上下文。
- 将任意数据分配给此属性(字符串、对象引用等),它会被附加到 Tween 实例本身上,这样之后就可以像
yourTween.data
. - 动画开始前的延迟时间(以秒为单位)。
- 动画的持续时间(以秒为单位)。默认值:
0.5
. - 控制动画过程中的变化速率,使其具有特定的感觉。例如,
"elastic"
或者"strong.inOut"
。有关示例,请参见本页的缓动可视化工具查看所有选项的完整列表。ease
可以是一个字符串(最常见),或者是一个接受 0 到 1 之间进度值并返回转换后的标准化值的函数。默认值:"power1.out"
. - 通常,一个 Tween 会等到下一个 tick(更新周期)才首次渲染,除非你指定了 delay。设置
immediateRender: true
强制它在实例化时立即渲染。默认值:false
为了to()Tween,true
为了from()和fromTo()多个 Tween 或者任何拥有scrollTrigger应用效果的对象. - 通常,Tween 会从父 Timeline 的
defaults
对象继承(如果定义了的话),但你可以通过设置inherit: false
. - 当 Tween 第一次渲染并读取其起始值时,GSAP 会尽量将写入值的操作推迟到当前“tick”结束,这可以提升性能,因为它避免了浏览器不喜欢的 read/write/read/write 的布局抖动。要禁用某个 Tween 的懒惰渲染,请设置
lazy: false
。大多数情况下,无需设置lazy
。如需了解更多,请观看此视频. 默认值:true
(零持续时间的 Tween 除外). - 动画完成后调用的函数。
- 传递给 onComplete 函数的参数数组。例如,
gsap.to(".class", {x:100, onComplete:myFunction, onCompleteParams:["param1", "param2"]});
. - 每次动画进入一个新的迭代周期(重复)时调用的函数。显然,只有当你设置了非零的
repeat
. - 传递给 onRepeat 函数的参数数组。
- 当动画从反向方向回到起点时调用的函数(不包括重复)。
- 传递给 onReverseComplete 函数的参数数组。
- 动画开始时调用的函数(当它的播放时间从 0 变为其他值时触发,如果你多次重启 Tween,它可以被多次触发)。
- 传递给onStart函数的参数数组。
- 每次动画更新时(即每次推动播放头的“tick”)调用的函数。
- 传递给onUpdate函数的参数数组。
- 如果
true
,所有相同目标的补间动画将立即被终止,无论它们影响哪些属性。如果设置为"auto"
,当补间动画首次渲染时,它会查找当前动画中可能存在的冲突(即对相同目标的相同属性进行动画处理),并终止这些冲突部分的其他补间动画。非冲突部分保持不变。如果设置为false
,则不使用任何覆盖策略。默认值:false
. - 如果
true
,动画将在创建后立即暂停。默认值:false
. - 动画应重复播放的次数。因此设置为
repeat: 1
将总共播放两次迭代。默认值:0
.repeat: -1
将无限重复。 - 重复之间等待的时间(以秒为单位)。默认值:
0
. - 设置
repeatRefresh: true
会使重复补间动画在invalidate()
每次完整迭代时(不含yoyo效果)重新记录其起始和结束值。这对于你使用动态值(相对、随机或基于函数的值)时非常有用。例如,x: "random(-100, 100)"
在每次重复时都会获得一个新的随机x值。duration
,delay
,以及stagger
do非refresh(刷新)。 - 如果
true
,动画将以播放头反向开始,意味着它将朝向起点方向移动。由于播放头无论如何都是从0时刻开始的,一个反向的补间动画会因为播放头无法向后移动超过起点而看起来初始处于暂停状态。 - 如果
true
,动画将反转其起始和结束值(这正是一个from()补间动画内部所做的事情),但缓动函数不会翻转。换句话说,你可以将一个to()
补间动画转换成一个from()
通过设置runBackwards: true
. - 如果定义了多个目标,你可以轻松地stagger(交错)每个目标的开始时间,比如
stagger: 0.1
的值(每个开始时间之间间隔0.1秒)。或者你可以使用stagger对象来实现更复杂的交错效果。更多信息请参见stagger文档. - 定义任意属性的起始值(即使这些属性没有被动画化)。例如,
startAt: {x: -100, opacity: 0}
- 如果
true
,每隔一次repeat
迭代将反向运行,使得补间动画看起来像是来回运动。这并不会影响到reversed
属性。例如,如果设置为repeat
设置为2
和yoyo
设置为false
,看起来就像:起点 - 1 - 2 - 3 - 1 - 2 - 3 - 1 - 2 - 3 - 终点。但如果设置为yoyo
设置为true
,看起来就像:起点 - 1 - 2 - 3 - 3 - 2 - 1 - 1 - 2 - 3 - 终点。默认值:false
. - 允许你在补间动画的
yoyo
回放阶段修改缓动方式。可以将其设置为特定的缓动函数如"power2.in"
或者设置为true
来简单地反转补间动画原本的ease
缓动曲线。注意:如果你定义了任何yoyo: true
GSAP足够智能地自动设置yoyoEase
,这样你就无需编写太多代码。默认值:false
. - 要将目标动画过渡到多个状态,请使用
keyframes
- 一个由vars对象组成的数组,每一个都作为一个to()
补间动画。例如,keyframes: [{x:100, duration:1}, {y:100, duration:0.5}]
。所有的关键帧将会完美地连续播放,但你可以定义一个delay
值来在每一步之间添加间隔(负延迟将创建重叠)。Keyframes只能用于to()
补间动画。
属性
描述
插件
插件为GSAP核心增加了额外功能。一些插件使你更容易与渲染库如PIXI.js或EaselJS协作,而另一些插件则增加了诸如形变SVG形状、添加拖放功能等超能力。这使得GSAP核心能够保持相对小巧,并且只在你需要的时候才添加功能。查看完整插件列表请点击这里.
基于函数的值
通过为任意值使用函数可以获得极度动态的动画效果,在每个目标第一次渲染时都会调用该函数一次并且函数返回的值将被用作该值。这非常适合应用条件逻辑或随机化处理(虽然GSAP内置也有随机化功能……向下滚动查看)。
gsap.to(".class", {
x: 100, //normal value
y: function(index, target, targets) { //function-based value
return index \* 50;
},
duration: 1
});
该函数接收三个参数:
- index(索引) - 目标在数组中的索引。例如,如果有3个
<div>
具有类".box"的元素,并且你gsap.to(".box", ...)
使用该函数0
第一个调用的索引是0,1
然后是1,2
. - target(目标) - 目标本身(在这个例子中是
<div>
元素) - targets(所有目标) - 目标数组(与传入的
tween.targets()
)
随机值
将随机值定义为字符串格式如"random(-100, 100)"
范围,或像这样"random([red, blue, green])"
对于数组,GSAP将在每个目标上插入一个随机值相应地!这让高级随机化效果变得简单。你甚至可以让随机数四舍五入到任意增量的最接近值!例如:
gsap.to(".class", {
x:"random(-100, 100, 5)" //chooses a random number between -100 and 100 for each target, rounding to the closest 5!
});
或者使用类似数组的值,GSAP将从中随机选择一个:
gsap.to(".class", {
x:"random(\[0, 100, 200, 500\])" //randomly selects one of the values (0, 100, 200, or 500)
});
还有一个gsap.utils.random()
函数,你也可以直接使用它。
相对值
使用"+="
或者"-="
前缀表示一个相对值。例如,gsap.to(".class", {x:"-=20"});
将动画化为比x
20像素更少的值,这个值是补间动画开始时的原始值。{x:"+=20"}
将会变成添加20。
Staggers(交错动画)
如果定义了多个目标,你可以轻松地stagger(交错)(偏移)每个目标的开始时间,通过设置类似stagger: 0.1
的值(每个开始时间之间间隔0.1秒)。或者你可以使用stagger对象来实现更复杂的交错效果。更多信息请参见stagger文档.
序列编排
对于基础的顺序控制,你可以在每个补间动画上使用delay
如gsap.to(".class", {`delay: 0.5,` duration: 1, x: 100})
的回调函数,但我们强烈推荐这样做。否则,使用推荐使用Timeline
来处理除最简单顺序之外的所有任务,因为它提供了更大的灵活性,尤其适合你在调整时间安排时实验使用。它可以让你依次追加补间动画,然后整体控制整个序列。你甚至可以让补间动画按照你需要的程度相互重叠,嵌套时间轴达到你需要的深度,以及许多其他强大功能。
时间线也有方便的方法,因此你可以非常轻松地将它们串联在一起并构建复杂的序列:to(), from(),以及fromTo()如果你发现自己反复对同一个目标进行动画处理,那么一定要看看这个功能,它可以让你的代码更加简洁。它还让你可以轻松地从CSS动画移植动画效果。
let tl = gsap.timeline(); //create the timeline
tl.to(".class1", {x: 100}) //start sequencing
.to(".class2", {y: 100, ease: "elastic"})
.to(".class3", {rotation: 180});
关键帧
了解更多关于关键帧的内容关键帧注意事项 / 小贴士
注意事项 / 小提示
- 随时使用杀死某个特定对象的所有补间动画
gsap.defaults({ease: ...})
你也可以像这样使用选择器文本"power1.out"
. - 你可以杀死所有
gsap.killTweensOf(yourObject)
发送给特定函数的sgsap.killTweensOf("#someID");
- (value:Number):[Number | self]
delayedCall
获取或设置动画的初始延迟,该延迟是动画开始前的秒数。gsap.killTweensOf(myFunction)
方法
delay(value:Number):[Number | self] | 获取或设置动画的持续时间,不包括任何重复或重复延迟。 |
持续时间(value:Number):[Number | self] | endTime |
endTime(includeRepeats:Boolean):Number | Returns the time at which the animation will finish according to the parent timeline's local time. |
根据父时间线的本地时间返回动画结束的时间。(type:String, callback:Function, params:Array):[Function | self] | eventCallback |
globalTime(localTime:Number):Number | 将本地时间转换为对应的gsap.globalTimeline时间(考虑所有嵌套、时间缩放等)。 |
invalidate():self | [覆盖] 清除任何内部记录的起始/结束值,如果你想重新启动动画而不恢复到之前记录的起始值,这会很有用。 |
isActive( ) : Boolean | 表示动画当前是否处于活动状态(意味着虚拟播放头正在此实例的时间范围内主动移动,并且未暂停,也没有其祖先时间线被暂停)。 |
iteration():[Number | self] | 获取或设置补间的迭代次数(当前的重复次数)。 |
kill(target:Object, propertiesList:String):self | 根据参数完全或部分终止动画。杀死意味着立即停止动画,将其从父时间线中移除,并释放它以便垃圾回收。 |
暂停(atTime:Number, suppressEvents:Boolean):self | 暂停实例,可选地跳转到特定时间。 |
paused(值:布尔):[布尔 | 自身] | 获取或设置动画的暂停状态,该状态表示动画当前是否处于暂停状态。 |
play(from:Number, suppressEvents:Boolean):self | 开始向前播放,可选从特定时间开始(默认情况下播放从播放头当前所在的位置开始)。 |
progress(进度)(value:Number, suppressEvents:Boolean):[Number | self] | [覆盖] 获取或设置补间的进度,这是一个介于0和1之间的值,表示虚拟播放头的位置(不包括重复),其中0为开始位置,0.5为完成一半,1为完成。 |
repeat(value:Number):[Number | self] | 获取或设置补间在第一次播放后应重复的次数。 |
repeatDelay(value:Number):[Number | self] | 获取或设置两次重复之间以秒为单位的时间长度。 |
restart(includeDelay:Boolean, suppressEvents:Boolean):self | 重新启动并从开头开始向前播放。 |
resume():self | 恢复播放而不改变方向(向前或向后)。 |
reverse(from:*, suppressEvents:Boolean):self | 反向播放,使动画的所有方面都反向呈现,例如补间的缓动效果。 |
reversed(值:布尔):[布尔 | 自身] | 获取或设置动画的反向状态,该状态表示动画是否应该反向播放。 |
revert():Self | 回退动画并终止它,将目标恢复到动画之前的状态,包括移除由动画添加的内联样式。 |
seek(time:*, suppressEvents:Boolean):self | 跳转到特定时间,不影响实例是否暂停或反向。 |
startTime(value:Number):[Number | self] | 获取或设置动画在其父时间线上的开始时间(定义的延迟之后)。 |
targets( ) : 数组 | |
then(callback:Function):Promise | 返回一个Promise,以便您可以使用Promise跟踪补间或时间线何时完成。 |
time(value:Number, suppressEvents:Boolean):[Number | self] | [覆盖] 获取或设置播放头的本地位置(本质上是当前时间),不包括任何重复或重复延迟。 |
timeScale(value:Number):[Number | self] | 用于在动画中缩放时间的因子,其中1 = 正常速度(默认值),0.5 = 半速,2 = 双倍速度,依此类推。 |
totalDuration(value:Number):[Number | self] | [覆盖] 获取或设置补间的总持续时间(以秒为单位),包括任何重复或重复延迟。 |
totalProgress(value:Number, suppressEvents:Boolean):[Number | self] | [覆盖] 获取或设置补间的totalProgress,这是一个介于0和1之间的值,表示虚拟播放头的位置(包括重复),其中0为开始位置,0.5为完成一半,1为完成。 |
totalTime(time:Number, suppressEvents:Boolean):[Number | self] | 根据包含任何重复和重复延迟的totalDuration获取或设置播放头的位置。 |
哟哟(yoyo)(值:布尔):[布尔 | 自身] | 获取或设置补间的来回播放状态,为 true 时会使补间来回反复播放,每次重复时在反向和正向之间交替。 |
属性
数据: * | 可以存储任何你想要的数据的地方(初始时用 |
比例 | [只读]补间动画的进度(一个介于 0 和 1 之间的值,其中 0.5 是中间点)之后经过 |
scrollTrigger: ScrollTrigger| undefined | 访问与补间动画相关联的 ScrollTrigger 的便捷方式。只有当补间动画有 ScrollTrigger 时才可以访问到。 |
vars: 对象 | 传递给构造函数的配置对象,该对象包含所有你想动画化的属性/值,以及任意的可选特殊属性诸如 |