lottie 导出html,lottie系列文章(二):lottie最佳实践

本文作者:IMWeb zhaopeifei

未经同意,禁止转载

项目中使用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。示例如下:

{% block preloadScript%}{% endblock %}

第三步

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

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的基本用法

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。

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事件。监听方法如下:

animation.addEventListener('data_ready', () => {

console.log('animation data has loaded');

});

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

*complete: 播放完成(循环播放下不会触发)

*loopComplete: 当前循环下播放(循环播放/非循环播放)结束时触发

*enterFrame: 每进入一帧就会触发,播放时每一帧都会触发一次,stop方法也会触发

*segmentStart: 播放指定片段时触发,playSegments、resetSegments等方法刚开始播放指定片段时会发出,如果playSegments播放多个片段,多个片段最开始都会触发。

*data_ready: 动画json文件加载完毕触发

*DOMLoaded: 动画相关的dom已经被添加到html后触发

*destroy: 将在动画删除时触发

lottie-web部分高阶用法

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

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

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

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

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

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

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

尽量减少图层个数。每个图层都会导出成相应的json数据,图层减少能从很大程度上减小json大小。

尽可能所有的图层都是在AE里面画出来的,而不是从其他软件引入的。如果是其他软件引入的,很可能导致描述这个图形的json部分变得很大。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值