Lottie简介

Lottie是一个用于Android,iOS,Web和Windows的库,用于解析使用Bodymovin导出为json的Adobe After Effects动画,并在移动设备和网络上呈现它们!
Snipaste_2022-04-06_11-29-46.png

官方文档:

GitHub:

CDN:

CodePen示例:

目前,阿里巴巴图标库已经支持Lottie了。
Snipaste_2022-04-06_11-27-09.webp

使用AE导出动画

安装插件

  1. 安装AE(Adobe After Effect)
  2. 安装ZXP,下载地址:https://aescripts.com/learn/zxp-installer/
  3. 安装bodymovin,下载地址:https://github.com/airbnb/lottie-web/blob/master/build/extension/bodymovin.zxp

配置AE

安装好后,在AE中进行设置:
在“编辑 -> 首选项 -> 常规 -> 脚本与表达式”中开启“允许脚本写入文件和访问网络”
Snipaste_2022-04-06_11-18-09.png

导出json动画文件

在“窗口 -> 扩展 -> Bodymovin”可以导出动画
Snipaste_2022-04-06_11-33-57.png
勾选需要导出的动画,设置导出路径,
Snipaste_2022-04-06_11-36-45.png
在设置中可以设置导出参数:
Snipaste_2022-04-06_11-38-29.png
点击“渲染动画”开始导出
Snipaste_2022-04-06_11-39-22.png

导出后,可以看到导出的文件 data.json,由于我勾选了“转成Base64”选项,只导出了一个json文件。如果未勾选此选项,会生成一个images文件夹,用于存放动画中的图片资源。

实际上,导出的json文件是用来描述动画位置、节点、运动信息的一个文件,可以用Lottie进行加载。

在Web中使用

引入

通过CDN引入:

  1. lottie:
  2. <script src="https://cdnjs.cloudflare.com/ajax/libs/bodymovin/5.9.1/lottie.min.js"></script>
  3. lottie-player:
  4. <script src="https://unpkg.com/@lottiefiles/lottie-player@latest/dist/lottie-player.js"></script>

通过NPM引入:

  1. npm install lottie-web

创建动画

创建动画的方式有两种。

第一种:使用lottie.min.js

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="./lottie.min.js"></script>
  9. </head>
  10. <body>
  11. <div id="container" style="width: 300px; height: 300px;"></div>
  12. <script>
  13. let container = document.querySelector("#container")
  14. lottie.loadAnimation({
  15. container: container, // the dom element that will contain the animation
  16. renderer: 'svg',
  17. loop: true,
  18. autoplay: true,
  19. path: './data.json' // the path to the animation json
  20. });
  21. </script>
  22. </body>
  23. </html>

lottie.loadAnimation接收以下参数:

名称 描述
container 用于渲染的容器,一般使用一个 div 即可
renderer 渲染器,可以选择 ‘svg’ / ‘canvas’ / ‘html’,个人测试发现 svg 效果和兼容性最好
name 动画名称,用于 reference
loop 循环
autoplay 自动播放
path json 路径,页面会通过一个 http 请求获取 json
animationData json 动画数据,与 path 互斥,建议使用 path,因为 animationData 会将数据打包进来,会使得 js bundle 过大

第二种:使用lottie-player.js

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="./lottie-player.js"></script>
  9. </head>
  10. <body>
  11. <lottie-player src="./data.json" background="transparent" speed="1" style="width: 600px; height: 600px;" loop controls autoplay></lottie-player>
  12. </body>
  13. </html>

Lottie拥有加载网络资源的能力,可以直接加载一个来源于网络的json动画:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://unpkg.com/@lottiefiles/lottie-player@latest/dist/lottie-player.js"></script>
  9. </head>
  10. <body>
  11. <lottie-player src="https://assets8.lottiefiles.com/private_files/lf30_wpyddzzi.json" background="transparent" speed="1" style="width: 600px; height: 600px;" loop controls autoplay></lottie-player>
  12. </body>
  13. </html>

常用方法

使用lottie.loadAnimation创建的动画返回一个实例,可以调用以下方法:

名称 参数 描述
stop 停止动画
play 播放动画
pause 暂停
setSpeed Number 设置播放速度,1 表示1倍速度,0.5 表示 0.5倍速度
setDirection Number 正反向播放,1 表示 正向,-1 表示反向
goToAndStop Number, [Boolean] 跳到某一帧或某一秒停止,第二个参数 iFrame 为是否基于帧模式还是时间,默认为 false
goToAndPlay Number, [Boolean] 跳到某一帧或某一秒开始,第二个参数 iFrame 为是否基于帧模式还是时间,默认为 false
playSegments Array, [Boolean] 播放片段,参数1为数组,两个元素为开始帧和结束帧;参数2为,是否立即播放片段,还是等之前的动画播放完成
destroy 销毁

示例:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="./lottie.min.js"></script>
  9. </head>
  10. <body>
  11. <div id="container" style="width: 300px; height: 300px;"></div>
  12. <button onclick="play()">播放</button>
  13. <button onclick="stop()">停止</button>
  14. <button onclick="pause()">暂停</button>
  15. <script>
  16. let container = document.querySelector("#container")
  17. let anim = lottie.loadAnimation({
  18. container: container,
  19. renderer: 'svg',
  20. loop: true,
  21. autoplay: true,
  22. path: './data1.json'
  23. });
  24. function play() {
  25. anim.play()
  26. }
  27. function stop() {
  28. anim.stop()
  29. }
  30. function pause() {
  31. anim.pause()
  32. }
  33. </script>
  34. </body>
  35. </html>

事件监听

可以设置以下事件监听函数:

  • onComplete 创建时将loop设置为false的时候,播放完后出发
  • onLoopComplete 单次循环结束触发
  • onEnterFrame 每进入一帧就会触发,播放时每一帧都会触发一次,stop方法也会触发
  • onSegmentStart 播放指定片段开始时触发,playSegments、resetSegments等方法刚开始播放指定片段时会发出,如果playSegments播放多个片段,多个片段最开始都会触发。


可以通过 addEventListener绑定以下事件:

  • completeonComplete
  • loopCompleteonLoopComplete
  • enterFrameonEnterFrame
  • segmentStartonSegmentStart
  • config_ready (when initial config is done)
  • data_ready 动画json文件加载完毕触发
  • DOMLoaded 动画相关的dom已经被添加到html后触发
  • destroy将在动画删除时触发

示例:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="./js/lottie.min.js"></script>
  9. </head>
  10. <body>
  11. <div id="container" style="width: 300px; height: 300px;"></div>
  12. <button onclick="play()">播放</button>
  13. <button onclick="stop()">停止</button>
  14. <button onclick="pause()">暂停</button>
  15. <div id="loop"></div>
  16. <script>
  17. let container = document.querySelector("#container")
  18. let anim = lottie.loadAnimation({
  19. container: container,
  20. renderer: 'svg',
  21. loop: true,
  22. autoplay: true,
  23. path: './data/data.json'
  24. })
  25. anim.onLoopComplete = function(e) {
  26. console.log(e)
  27. document.getElementById("loop").textContent = `播放了${e.currentLoop}次`
  28. if (e.currentLoop > 3) {
  29. anim.stop()
  30. }
  31. }
  32. function play() {
  33. anim.play()
  34. }
  35. function stop() {
  36. anim.stop()
  37. }
  38. function pause() {
  39. anim.pause()
  40. }
  41. </script>
  42. </body>
  43. </html>

Lottie事件支持事件对象,第28行的事件对象结构如下:

  1. {
  2. currentLoop: 1, // 当前循环次数
  3. direction: 1, // 方向
  4. totalLoops: 73, // 总时长,只在"enterFrame"中有效,
  5. type: "loopComplete" // 事件类型
  6. }

当播放停止后,如果再次开始播放,则currentLoop从1重新计数。

其他平台相关库

参考资料