手写动画库

  目录

简单实现一个动画库

本动画库学习参考winter老师教程实现

思维导图

img
通过上面的思维导图,动画库有Timeline,Animate,Easing三个类构成,对应三个文件。

使用案例

案例代码在vite环境下构建

index.html文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite App</title>
<style>
#el1 {
width: 100px;
height: 100px;
background-color: aqua;
}
#el2 {
position: relative;
width: 100px;
height: 100px;
background-color: rgb(13, 50, 146);
}
.btns {
margin-top: 50px;
}
</style>
</head>
<body>
<div id="el1"></div>
<div id="el2"></div>
<div class="btns">
<button id="startBtn">start</button>
<button id="pauseBtn">pause</button>
<button id="resumeBtn">resume</button>
</div>
<script type="module" src="/main.js"></script>
</body>
</html>

main.js文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import animate, { Linear, QuadraticIn, QuinticIn } from "./animate";
// 使用方法
// 获取时间线的实例
let tl = animate();
// 向时间线中加入动画实例
tl.add({
el: '#el1', // 动画元素,可以是string或dom元素
property: 'transform', // 动画的属性
startValue: 0, // 动画初始值
endValue: 500, // 动画的结束值
duration: 2, // 动画持续时间 秒单位
delay: 0, // 动画的延迟 秒单位
timingFunction: QuadraticIn, // 动画的移动效果,可以查看Easing.js文件
template: v=> `translate(${v}px)`, // 动画执行的每一帧,返给属性加工后得知,比如返回“500px”等
startTime: new Date('2024-2-20 9:36:00'), // 可以指定具体的时间让动画执行
loop: 'reverse', // 动画是否循环 loop值真时正常动画 reverse反向动画
});
// 下面是对同一个元素el2的两个属性添加动画效果
tl.add({
el: '#el2',
property: 'top',
startValue: 0,
endValue: 500,
duration: 2,
delay: 0,
timingFunction: Linear,
template: v=> `${v}px`,
loop: true
});
tl.add({
el: '#el2',
property: 'left',
startValue: 0,
endValue: 500,
duration: 2,
delay: 0,
timingFunction: Linear,
template: v=> `${v}px`,
loop: true
});

// 按钮事件
document.querySelector('#startBtn').addEventListener('click', ev=> {
tl.start();
}, false);
// document.querySelector('#resetBtn').addEventListener('click', ev=> {
// tl.reset();
// }, false);
document.querySelector('#pauseBtn').addEventListener('click', ev=> {
tl.pause();
}, false);
document.querySelector('#resumeBtn').addEventListener('click', ev=> {
tl.resume();
}, false);

源码

sourceCode