vue 使用lottie-web创建动画

lottie是一个跨平台的动画库,通过AE(After Effects)制作动画,再通过AE插件Bodymovin导出Json文件,最终各个终端解析这个Json文件,还原动画。本文中我只介绍前端用到的库lottie-web。

对比三种常规的制作动画方式

1.Png序列帧
2.Gif图
3.前端Svg API

先对位图与矢量图有一个基本的概念。

矢量图就是使用直线和曲线来描述的图形,构成这些图形的元素是一些点、线、矩形、多边形、圆和弧线等,它们都是通过数学公式计算获得的,具有编辑后不失真的特点。
位图是由称作像素(图片元素)的单个点组成的,放大会失真。

Png序列帧

用Png序列帧是也容易理解,用css keyframes操作每一帧需要展示的图片,缺点也很明显,每一帧都是一张图片,占比较大的体积。当然也可以将图片合并成精灵图(Sprites Map),可参考这个方案,使用 gka 一键生成帧动画。Png也是位图,放大会失真,不过可以通过增大图片尺寸,避免模糊。

Gif图

如果之前没有用过动画,用Gif图是最简单的,只需要引入一张图。但是Gif图是位图,不是矢量图,放大会虚。

前端Svg API

Svg API对于动画初学者不太友好,你要实现一个自定义的动画,需要了解Svg的所有的API,虽然它的属性与css的动画有一些相似。它是矢量图,不失真。

安装lottie-web

npm install lottie-web

然后就是在项目中引用

<template>
  <div class="box">
    <h1>{{ msg }}</h1>
    <button @click="startFun">播放</button>
    <button @click="suspendFun">暂停</button>
    <div id="lottie_box"></div>
  </div>
</template>

<script>
import lottieWeb from 'lottie-web';
import * as animationData from '../assets/拆红包.json'; // 导出的动效json文件
export default {
  name: 'HelloWorld',
  props: {
    msg: String
  },
  data() {
    return {
      lottie:{}
    }
  },
  methods:{
    suspendFun:function(){
    	//动画暂停
      this.lottie.pause();
    },
    startFun:function(){
    	//动画播放
      this.lottie.play()
    }
  },

  mounted() {
  	// 这里一定要写,这个是图片资源的路径
    animationData.assets.forEach(item => {
      item.u = "";
      if (item.w && item.h) {
        item.p = require(`@/assets/images/${item.p}`);
      }
    });

    let data = {
      container: document.getElementById('lottie_box'),
      renderer: 'svg',
      loop: true,
      autoplay: true,
      animationData: animationData.default  // 这里一定要加.default
    }
    this.lottie = lottieWeb.loadAnimation(data)

    this.lottie["addEventListener"]("complete", () => {
      /** 销毁lottie动画对象; */
      this.lottie["destroy"]();
    });

  }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
  .box{
    width: 100%;
    height: 100%;
  }
  #lottie_box{
    width: 400px;
    height:800px;
    margin: 0px auto;
  }
</style>

container:当前需要渲染的DOM
renderer:渲染方式,默认是Svg,还有Html和Canvas方案。
loop:是否循环播放
autoplay:是否自动播放
animationData:AE导出的Json,注意,这里不是路径
assetsPath:Json文件里资源的绝对路径,webpack项目需要配合这个参数。
动画的播放与暂停,如果动画需要用户触发与暂停,需要有一个切换操作(toggle)

this.animation.play();
this.animation.pause();

动画执行过程中的钩子,可以对动画有一定的控制权

complete
loopComplete
enterFrame
segmentStart
config_ready(初始配置完成)
data_ready(所有动画数据加载完成)
DOMLoaded(元素已添加到DOM节点)
destroy
// 动画播放完成触发
anm.addEventListener('complete', anmLoaded);

// 当前循环播放完成触发 
anm.addEventListener('loopComplete', anmComplete);

// 播放一帧动画的时候触发 
anm.addEventListener('enterFrame', enterFrame);

打包时图片资源路径

webpack工程需要注意Json文件如果有图片资源(Png或者Svg),需要将文件放在项目的根目录的static下。这样打包的时候,图片会被打包,并且后缀名不会被改变,当然需要配合assetsPath这个参数,设置图片的绝对路径。而CDN的路径可以通过process.env.CDN_URL从webpack传到前端代码中。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3中使用Lottie-web相对简单。首先,你需要确保已经安装了Lottie-web库,你可以通过npm或yarn来安装它。一旦安装完成,你就可以在Vue 3项目中使用它了。 在你的Vue 3项目中,首先需要在你的组件中导入Lottie-web库。你可以在组件的头部添加以下代码来导入Lottie-web: import lottie from 'lottie-web'; 接下来,你可以在组件的methods或mounted函数中使用Lottie-web来加载和播放动画。例如,你可以在mounted函数中添加以下代码: mounted() { this.loadAnimation(); }, methods: { loadAnimation() { const element = document.getElementById('lottie-animation'); if (element) { const animation = lottie.loadAnimation({ container: element, renderer: 'svg', loop: true, autoplay: true, path: 'path/to/your/animation.json' // 你的动画文件的路径 }); } } } 在上面的代码中,我们首先通过getElementById获取到一个DOM元素,它将用作动画的容器。然后,我们使用Lottie-web的loadAnimation函数来加载动画,传递了一些选项参数,比如renderer,loop和autoplay。最后,我们指定了动画文件的路径。 这只是一个简单的例子,你可以根据你的需求来调整代码。请确保在你的组件模板中有一个对应的DOM元素,它将被用作动画的容器,例如: <template> <div id="lottie-animation"></div> </template> 这样你就可以在Vue 3中使用Lottie-web了。记得根据你的具体需求来进行相应的配置和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值