GSAP-动画库入门
GSAP(GreenSock Animation Platform)是一款强大的JavaScript动画库,用于在Web应用程序中创建高性能、流畅的动画效果。GSAP 提供了灵活且易于使用的 API,允许开发者在网页上创建各种动画,包括位移、旋转、缩放、透明度变化等。其具有高性能、跨浏览器兼容性、简单易用的API、灵活性、丰富的插件系统、以及强大的社区支持的优势,让开发者写动画的困难度直线下降。
安装
1 | 通过pnpm安装 |
开始使用
tween
gsap.to
先写一个简单的 div 设置 class 为 box,在 <script>
标签内添加一个 tween
1 | gsap.to(".box", { |
这样 box 就会向右移动 200px,这里的 x 控制水平移动,同理 y 可以控制垂直移动
当 x 的值为’+’时向右移动,为’-‘时向左移动,y 的值为’+’时向下移动,为’-‘时向上移动(有一说一我觉得很变扭,为什么不是极坐标系那样)
gsap.from
from 和 to 的区别,可以简单理解为二者相反
‘to’会从元素当前状态过渡到 tween
‘from’会从 tween
过渡到元素的状态
1 | gsap.from(".box", { |
gsap.fromTo
fromTo 则是需要指定动画的初始位置和终止位置
1 | gsap.fromTo( |
gsap.set
set 是一个立刻属性,意思是没有过渡动画(这意义何在)
1 | gsap.set(".box", { |
target
GSAP 选择元素的方式有多种,除了上面使用的 class 选择还可以使用 id 选择
1 | gsap.to("#box4", { |
特殊选择器
1 | gsap.to("section > .box5", { |
因为是 javascript 语法所以还可以通过 document.querySelecto
使用变量选择元素
1 | #单个元素 |
变量
简写
GSAP 将原有的 css 写法转换成了 GSAP 的简写写法
GSAP | CSS | 作用 |
---|---|---|
x:100 | translateX(100px) | 向右移动 100px |
y: 100 | translateY(100px) | 向下移动 100px |
xPercent: 50 | translateX(50%) | 向右移动 50% |
yPercent: 50 | translateY(50%) | 向下移动 50% |
scale: 2 | scale(2) | 逐渐变大 |
scaleX: 2 | scaleX(2) | 水平方向增长 |
scaleY: 2 | scaleY(2) | 垂直方向增长 |
rotation: 90 | rotate(90deg) | 顺时针旋转 90deg |
rotation: “1.25rad” | no css | 顺时针旋转 1.25rad |
skew: 30 | skew(30deg) | 倾斜旋转 30deg |
skewX: 30 | skewX(30deg) | 水平倾斜旋转 30deg |
skewY: “1.23rad” | no css | 垂直倾斜旋转 1.25rad |
transformOrigin: “center 40%” | transform-origin: center 40% | 更改旋转的原点 |
opacity: 0 | adjust the elements opacity | 可见度 |
autoAlpha: 0 | shorthand for opacity & visibility | 不透明度 |
duration: 1 | animation-duration: 1s | 动画时长 1S |
repeat: -1 | animation-iteration-count: infinite | 重复(一直重复) |
repeat: 2 | animation-iteration-count: 2 | 重复(重复 1+2 次) |
delay: 2 | animation-delay: 2 | 延迟 2S 播放动画 |
yoyo: true | animation-direction: alternate | 从头到尾再到头,配合 repeat 使用 |
一般来说,GSAP 可以使用任意常用单位,例如:px,deg,vw,rad 甚至 js 计算或相对值
1
2
3
4
5
6
7 x: 200, // 默认使用px
x: "+=200" // 相对值
x: '40vw', // 传入带单位的字串符
x: () => window.innerWidth / 2, // 使用函数计算!
rotation: 360 // 默认deg
rotation: "1.25rad" // 使用弧度
CSS 属性
GSAP 支持几乎所有的原生 CSS 样式,只需要使用驼峰命名法!
例如 background-color
=> backgroundColor
1 | gsap.to(".box", { |
SVG 属性
像 CSS 一样,你可以直接放进 tween
中使用,也可以使用对象
1 | gsap.to(".box", { |
Easing
ease: "none.out"
可以给动画加一个缓和的效果
第一个值 none
需要填写 GSAP 官方提供的几种动画类型名称,例如 power1
,back
,bounce
;
第二个值 out
可以更换为 in
或者 inOut
,三个值的区别在于 in
是动画开头时开始缓和效果,out
是动画结束时开始缓和效果(直白一点就是把函数正反表示)
Staggers
(说真的官方的命名真的很抽象,我真的不知道该怎么翻译他们)
Staggers
这个变量可以让多个元素按顺序触发
1 | <div class="box red"></div> |
配合 Grid 网格布局的高级用法
Staggers
可以配合 Grid 网格布局使用,做出很惊艳的群体动画效果
1 | stagger: { |
TimeLines
标题比较显而易见,是时间线。时间线可以让多个元素的动画调整变得更加的容易。
1 | // 要使用时间线,不能直接使用gsap.to或者gsap.timeline().to,必须要声明一个变量。 |
如果你需要给动画添加一点点的延迟,只需要使用变量 delay
即可
1 | tl.to(".div1", { |
位置参数
gsap.timeline()
还提供了一个位置参数,可以用来调整元素动画在时间轴中播放的位置
1 | tl.to( |
特殊参数
timeline()
和补间一样可以写入一些变量
1 | let tl = gsap.timeline({ |
Control
GSAP 官方提供了八个控制函数,用于控制动画的效果
1 | <div class="box"></div> |
当然,直接把函数写进标签里虽然方便简洁,但是并不适合后期维护管理,可以尝试一下官方的写法。
1 | <button id="play">play()</button> |
Callbacks
在 tween
里使用,可以在动画的各个状态调用各种函数
1 | let tween = gsap.to(".box", { |
可以结合
Callbacks
和 js 原生的特性实现一些基于鼠标事件的动画效果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 // 这是官方的例子
// 先把 .information 元素向下移动100px,以达到隐藏元素的效果
gsap.set(".information", { yPercent: 100 });
// 使用GSAP提供的utils.toArray方法,将所有的.container元素转换为数组,方便后续操作
gsap.utils.toArray(".container").forEach((container) => {
// 获取 ".information" 元素,并创建一个名为tl的时间轴,默认暂停
let info = container.querySelector(".information"),
tl = gsap.timeline({ paused: true });
// 添加动画到tl中。个把 yPercent 设置为0,让元素复位,以达到元素出现的效果.
tl.to(info, { yPercent: 0 }));
// 使用原生js的方法调用鼠标事件触发动画事件
container.addEventListener("mouseenter", () => tl.timeScale(1).play());
container.addEventListener("mouseleave", () => tl.timeScale(3).reverse());
});