Lottie使用总结

1,085 阅读2分钟

基础使用

官方文档 lottie

分为两类:命令式和申明式

命令式
// container为lottie放置的dom元素
// renderer为渲染方式。'svg'|'canvas'|'html'  本人项目使用的svg渲染效果较好,性能较佳
// loop 是否渲染播放
// autoplay 是否自动播放
// path 动画的json文件路径
// animationData 动画json对象
lottie.loadAnimation({
  container: element, // the dom element that will contain the animation
  renderer: 'svg',
  loop: true,
  autoplay: true,
  path: 'data.json' // the path to the animation json
  // animationData: animationData 和path是互斥的,取其中一个即可
});
申明式
// 必传属性:class和data-animation-path
// class 必须为lottie 
// data-animation-path 为文件的相对路径
 <div style="width:1067px;height:600px"  class="lottie" data-animation-path="animation/" data-anim-loop="true" data-name="ninja"></div>
 
// 本人项目是react所以采用的是lottie-react 该包对lottie声明式进行了封装
食用方式
 <Lottie
        options={{
          loop: true,
          autoplay: true,
          rendererSettings: {
            progressiveLoad: true,
          },
          animationData: animationData?.json,
        }}
        eventListeners={eventListeners}
        width="100vw"
        isClickToPauseDisabled
        style={{
          height: 'auto',
        }}
        isStopped={isStopped}
      />

API方法

// 仅介绍常用的,具体可以根据业务查看官方文档
// name 可选参数 
lottie.play(name)开始动画
lottie.stop(name) 暂停动画
lottie.setSpeed(name) 设置播放速度
lottie.setDirection(name) 设置动画方向
lottie.destroy(name) 摧毁动画
lottie.resize(name) 对动画尺寸进行重新加载

// 声明式属性
isStopped:boolean 停止动画
isPaused:boolean 暂停动画
eventListeners?: readonly EventListener[] 监听事件数组。具体事件在下方查看
speed?: number 速度
direction?: number 方向
style?: React.CSSProperties css属性
width?: number | string 动画宽度
height?: number | string 动画高度


interface EventListener {
    eventName:
        | "complete" 动画加载完毕事件
        | "loopComplete" 循环一次完毕,可触发多次
        | "enterFrame" 进入页面触发
        | "segmentStart" 动画片段初始
        | "config_ready" 配置加载完毕
        | "data_ready" 动画json数据加载完毕
        | "loaded_images" 图片加载完毕
        | "DOMLoaded" DOM加载完毕
        | "destroy"; 摧毁时触发
    callback: () => void; 事件回调函数
}

lottie容器宽高设置100vh和100vw实现宽高自适应

优化措施

本项目lottie动画Json有12个。

  1. 采用了异步加载+虚拟进度条来提升用户体验

虚拟进度条设置为3s内加载到80%

// 为保证动画顺序,使用promise.all
const loadAllAnimation = async (annualStatements: IAnnualStatement[] = []) => {
  const values = await Promise.all(
    (annualStatements || []).map((item) => {
      return baseRequest({
        method: 'GET',
        url: item.animationDataUrl,
        showLoading: false,
      })
        .then((res) => res?.json())
        .then((json) => ({ json }));
    }),
  );
  return values;
};
// 通过循环loadAllAnimation数组来加载lottie动画,并对lottie动画监听loaded_image事件,当所有图片加载完毕后将虚拟进度条设置为100%
  1. lottie动画通过数组循环渲染,仅对当前视口的lottie动画进行播放,其余视口外的动画通过isStopped暂停,提升性能

  2. AE设计师对动画的图层进行精简复用,压缩json体积,图片尽量复用

总结

优点:lottie兼容性比较好,可以适配不同的浏览器。同时定制化程度高。

缺点:lottie的定制化和一些动态化操作需要设计师进行配合。(如动画内的动态文案,动画的交互等等)