前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >lottie系列文章(二):lottie最佳实践

lottie系列文章(二):lottie最佳实践

作者头像
IMWeb前端团队
发布2019-12-03 16:44:42
5K0
发布2019-12-03 16:44:42
举报
文章被收录于专栏:IMWeb前端团队IMWeb前端团队

本文作者:IMWeb zhaopeifei 原文出处:IMWeb社区 未经同意,禁止转载

项目中使用lottie-web的流程

第一步

新建src/assets/lottie/文件夹,并将bodymovin_light.min.js文件和设计师给的动画json文件统一放到src/assets/lottie/文件夹中。

另外,请更新@tencent/im-webpack-common,因为需要把src/assets/lottie/中的json文件打包成单独的文件。如果项目的webpack配置在项目内,需要自行进行配置或者联系payton。

第二步

在需要使用lottie的页面中,在其index.html中引入bodymovin.js。示例如下:

代码语言:javascript
复制
{% block preloadScript%}
<script src="../../assets/lottie/bodymovin.min.js" async></script>
{% endblock %}

第三步

而设计师给的json文件,我们也需要统一放到src/assets/lottie/文件夹中。并且通过require去获取json文件的url。通过loadAnimation方法即可将加载动画。

代码语言:javascript
复制
const animateJsonPath = require('assets/lottie/treasurebox.path.json');

if (window.bodymovin) {
  this.animation = window.bodymovin.loadAnimation({
    container: this.box,
    renderer: 'svg',
    loop: true,
    autoplay: true,
    path: animateJsonPath,
  });
}

lottie的js文件及json文件加载方案的考量

使用lottie-web的解决方案,需要加载lottie-web的js文件以及动画相应的json文件,这两个文件的大小都比较大,所以我们应该根据需要,确定其加载方式。

lottie库使用

lottie-web的npm版本是lottie-web,其对应的cdn外链版则是bodymovin.js

即使是gzip压缩后的lottie-web轻量版的js文件,大小仍然有40kb的大小。如果使用npm包的形式进行加载,那么vendor.js会增加40kb的大小,这样会使页面性能下降。

所以,我们会采用script标签的形式来加载lottie文件,并且使用defer或async属性来进行异步加载。一般情况下,我们只需要svg格式的动画,所以可以使用lottie_light版本(仅支持svg渲染)。

json文件

通过bodymovin插件导出的动画json文件大小也可能比较大(可能达到几十kb,负责的动画也可能上百kb),所以不建议将json数据内联到页面中,而最好是当做一个json文件来进行下载。

lottie的使用

下面讲一些lottie的常用方法。

lottie-web的基本用法

代码语言:javascript
复制
const animation = window.bodymovin.loadAnimation({
  container: element, // 要包含该动画的dom元素
  renderer: 'svg', // 渲染方式,svg、canvas、html(轻量版仅svg渲染)
  loop: true, // 是否循环播放
  autoplay: true, // 是否自动播放
  path: animateJsonPath, // 动画json文件路径
});

lottie-web常用方法

lottie-web提供了很多的控制动画播放的方法,下面是一些常用的方法。animation等于上面代码中的animation

代码语言:javascript
复制
animation.play(); // 播放该动画,从目前停止的帧开始播放
animation.stop(); // 停止播放该动画,回到第0帧
animation.pause(); // 暂停该动画,在当前帧停止并保持

animation.goToAndStop(value, isFrame); // 跳到某个时刻/帧并停止。isFrame(默认false)指示value表示帧还是时间(毫秒)
animation.goToAndPlay(value, isFrame); // 跳到某个时刻/帧并进行播放
animation.goToAndStop(30, true); // 跳转到第30帧并停止
animation.goToAndPlay(300); // 跳转到第300毫秒并播放

animation.playSegments(arr, forceFlag); // arr可以包含两个数字或者两个数字组成的数组,forceFlag表示是否立即强制播放该片段
animation.playSegments([10,20], false); // 播放完之前的片段,播放10-20帧
animation.playSegments([[0,5],[10,18]], true); // 直接播放0-5帧和10-18帧

animation.setSpeed(speed); // 设置播放速度,speed为1表示正常速度
animation.setDirection(direction); // 设置播放方向,1表示正向播放,-1表示反向播放
animation.destroy(); // 删除该动画,移除相应的元素标签等。在unmount的时候,需要调用该方法

lottie-web常用的事件

我们在lottie-web中可能也需要监听一些事件,比如加载完动画json文件时的data_ready事件。监听方法如下:

代码语言:javascript
复制
animation.addEventListener('data_ready', () => {
  console.log('animation data has loaded');
});

除了data_ready事件,下面还有一些其他常用的事件可以监听:

代码语言:javascript
复制
* complete: 播放完成(循环播放下不会触发)
* loopComplete: 当前循环下播放(循环播放/非循环播放)结束时触发
* enterFrame: 每进入一帧就会触发,播放时每一帧都会触发一次,stop方法也会触发
* segmentStart: 播放指定片段时触发,playSegments、resetSegments等方法刚开始播放指定片段时会发出,如果playSegments播放多个片段,多个片段最开始都会触发。
* data_ready: 动画json文件加载完毕触发
* DOMLoaded: 动画相关的dom已经被添加到html后触发
* destroy: 将在动画删除时触发

lottie-web部分高阶用法

  1. 在制作AE动画时,将图层命名为#svgId格式,前端加载该动画后,相应的图层的id会被设置为svgId,可以通过dom方法获取该元素并做相应的操作;
  2. 在制作AE动画时,将图层命名为.svgClass格式,前端加载该动画后,相应的图层的class会被设置为svgClass,可以通过dom方法获取这些元素并做相应的操作;

动画json文件制作及导出规范

使用该方案制作动画时,有些动画效果lottie-web暂不支持,有些则会影响json文件的大小。

下面这些效果,lottie暂不支持:

  1. 描边动效不支持,因为这个属性会导致lottie性能问题,所以后来lottie去掉了对该属性的支持。

遵循下面的方案,会使json文件减小:

  1. 尽量减少图层个数。每个图层都会导出成相应的json数据,图层减少能从很大程度上减小json大小。
  2. 尽可能所有的图层都是在AE里面画出来的,而不是从其他软件引入的。如果是其他软件引入的,很可能导致描述这个图形的json部分变得很大。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-06-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 项目中使用lottie-web的流程
    • 第一步
      • 第二步
        • 第三步
        • lottie的js文件及json文件加载方案的考量
          • lottie库使用
            • json文件
            • lottie的使用
              • lottie-web的基本用法
                • lottie-web常用方法
                  • lottie-web常用的事件
                    • lottie-web部分高阶用法
                    • 动画json文件制作及导出规范
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档