描述
- 性能强大,兼容性强的JS动画框架
功能
- 使得页面元素各种属性进行运动变换
实现
动画方法
具体方法
- gsap.to():从当前状态变化到指定状态
- gsap.from():从指定状态变化到当前状态
- gsap.fromTo():定义开始和结束状态,动画从开始状态变化到结束状态
- gsap.set():立即设置状态,不产生动画效果
方法参数
- 动画方法接受两个参数:目标元素和动画参数
- 目标元素: GSAP底层实际上是使用了document.querySelector( )去选择元素
- 常见动画参数包含:
动画内容
duration: 动画持续的时间
delay: 动画开始前的延迟时间
ease: 控制动画的运动曲线
repeat: 动画重复的次数
repeatDelay: 动画重复之间的延迟时间
yoyo: 如果设置为
true
,则动画在每次重复时会反向播放,创建来回移动的效果 stagger: 如果有多个动画目标,可以设置每个动画开始之间的间隔时间 动画事件 onComplete:动画结束时触发 onStart:动画开始时触发 onUpdate:只要动画运行,每一帧都会触发(元素有属性变化时) onRepeat:每次动画重复时触发 onReverseComplete:当动画反向执行后运动到变化起始点时触发
gsap.to(".box", {
x: 200,
duration: 1,
delay: 0.5,
repeat: 3
});
动画控制
- 对一个动画内部的时间节点进行控制
// 通过一个变量保存对Tween或者Timeline实例的引用
let tween = gsap.to("#logo", {duration: 1, x: 100});
// 暂停
tween.pause();
// 恢复(继续)
tween.resume();
// 反向变化
tween.reverse();
// 直接切换到整个动画变化时长的0.5秒的时间点的状态
tween.seek(0.5);
// 直接切换到整个变化过程的1/4的节点的状态
tween.progress(0.25);
// 让运动减速到0.5倍
tween.timeScale(0.5);
// 让变化加速到原来的2倍
tween.timeScale(2);
// 直接销毁tween实例,让垃圾回收机制可以处理该实例所占用的内存
tween.kill();
时间线
创建对象
- 使用
gsap.timeline()
创建时间线,用于组织和控制多个动画的顺序和同步
// 创建一个Timeline类型的实例
let tl = gsap.timeline()
// 把tween动画添加到timeline实例上
tl.to(".green", { x: 600, duration: 2 });
tl.to(".purple", { x: 600, duration: 1 });
tl.to(".orange", { x: 600, duration: 1 });
默认设置
gsap.timeline({defaults: { }})
中通过参数设置的defaults属性,都会被添加到这个时间线上的tween动画继承
var tl = gsap.timeline({defaults: {duration: 1}});
//这样每个动画都是1秒的时长,不用重复写了
tl.to(".green", {x: 200})
.to(".purple", {x: 200, scale: 0.2})
.to(".orange", {x: 200, scale: 2, y: 20});
position参数
- 在时间线中,动画方法可以再加入第三个参数,来控制该动画再时间线上的位置
- 类型
label
: 动画插入到时间线上对应label的位置number
: 以整个时间线动画的启动时间点为参考, 插入到对应数字的秒数>
: 插入到前面一个动画的结束时间点位置<
: 插入到前面一个动画的开始时间点位置+=
: 以时间线上前一个动画为参数-=
: 以时间线上前一个动画为参数%
: 表示一段时间的占比 - 这些类型可以进行组合
+=1
: 表示当前时间线结束后再过1秒的时间点位置,相当于有个1秒的间隔-=1
: 表示当前时间线结束时间点前1秒的时间点位置,相当于有个1秒的时间重叠myLabel+=2
: 表示在myLable这个标记后过两秒的时间点位置<+=3
: 表示前一个动画起始点后3秒的位置<3
: 和上面一个意思(’<‘和’>‘直接跟数字,其实就是和’<+=3’或者’>+=3’是一样的意思)>-0.5
: 前一个动画的结束时间点前0.5秒的时间点位置-=25%
: 放到前面已经添加的动画总时长的末尾25%的位置+=50%
: 以前面所有动画总时长的50%作为时间间隔<25%
: 以前一个动画启动时间点为时间点,放到前一个动画时长的25%的位置。<+=25%
: 以前一个动画启动时间点为时间点,向后放到全部动画总时长的25%的时间点的位置。myLabel+=30%
: 以myLabel标记位置为起始点,向后挪以整个以添加到时间线上的动画总时长的30%的时长作为插入的时间点。
// 把动画添加到标记所在的位置
var tl = gsap.timeline();
tl.to(".green", {duration: 1, x: 750})
//把blueGreenSpin标记添加到当前时间线末尾之后的1秒的时间点
.add("blueGreenSpin", "+=1")
// 把动画添加到blueGreenSpin这个标记所在的时间点
.to(".purple", {duration: 2, x: 750, rotation: 360}, "blueGreenSpin")
// 把动画添加到blueGreenSpin这个标记所在的时间点之后0.5秒的时间点
.to(".orange", {duration: 2, x: 750, rotation: 360}, "blueGreenSpin+=0.5");
关键帧
- 对时间线上的每一点进行描述,而不是将一段段动画通过时间串起来
- GSAP提供了多种关键帧的写法
Object keyframes
- 给keyframes属性传入一个数组,这个数组里面是多个对象,这些对象的效果是依次执行
gsap.to(".elem", {
keyframes: [ // 注意这里是数组
{x: 100, duration: 1, ease: 'sine.out'}, // 定义这个分段动画自己的ease曲线
{y: 200, duration: 1, delay: 0.5}, // 产生和前个分段动画0.5秒的间隔
{rotation: 360, duration: 2, delay: -0.25} // 和前一个分段动画产生0.25秒的重叠
],
ease: 'expo.inOut' // 设置整个关键帧动画的曲线
});
Percentage keyframes
- 不需要给每一段动画单独设置时长和延时,只要给整体设置一个时长,然后确定每个分段动画的时间比例
gsap.to(".elem", {
keyframes: { // 注意这里是对象
"0%": { x: 100, y: 100},
"75%": { x: 0, y: 0, ease: 'sine.out'}, // 指定这个分段的动画曲线
"100%": { x: 50, y: 50 },
easeEach: 'expo.inOut' // 每个分段的动画曲线
},
ease: 'none' // 整个关键帧动画的动画曲线
duration: 2,
})
Simple Array-based keyframes
- 通过数组的方式,各个分段自动平均分总时长
gsap.to(".elem", {
keyframes: { // 注意这里是对象
x: [100, 0, 50], // 数组分段,也就是两段动画,100-0,,0-50
y: [100, 0, 50]
easeEach: 'sine.inOut' // 每个分段都设置成这个动画曲线
ease: 'expo.out' // 关键帧整体的动画曲线设置
},
duration: 2, // 总时长2秒,这里有两段,平均分就是每段的时长是1秒
})
Last updated on