Lottie简介

官方介绍:Lottie是一个库,可以解析使用AE制作的动画(需要用bodymovie导出为json格式),支持web、ios、android、flutter和react native。 在web端,lottie-web库可以解析导出的动画json文件,并将其以svg或者canvas的方式将动画绘制在我们的页面上.

Lottie的优点

  1. 动画由设计使用专业的动画制作工具AE来实现,使动画实现更加方便,且效果更好
  2. 前端可以方便的调用动画,并对动画进行控制,减少前端动画工作量
  3. 设计制作动画,前端展现动画,分工明确
  4. 使用lottie方案,json文件大小比gif文件小很多,性能也会更好

lottie-web 在前端的使用

  1. 安装lottie-web
npm install lottie-web
复制代码
  1. lottie-web的基本用法
import lottie from 'lottie-web'const animation = lottie.loadAnimation({container: document.getElementById('domId'), // 绑定dom节点renderer: 'svg', // 渲染方式:svg、canvasloop: true, // 是否循环播放,默认:falseautoplay: true, // 是否自动播放, 默认trueanimationData: // AE动画使用bodymovie导出为json数据
})
  1. json简单解释
{"v": "5.1.13",       // bodymovin 版本"fr": 30,            // 帧率"ip": 0,             // 起始关键帧"op": 20,            // 结束关键帧"w": 150,            // 视图宽"h": 130,            // 视图高"nm": "鹅头收起动画",  // 名称"ddd": 0,             // 3d"assets": [],        // 资源集合 "layers": [],        // 图层集合"masker": []         // 蒙层集合
}
  1. lottie-web 常用方法 前面我们就初始化了一个lottie对象了. 然后我们介绍它的一些常用方法
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(); // 删除该动画,移除相应的元素标签等。

Lottie-web 常用的事件

animation.addEventListener('data_ready', () => {}) // 动画数据加载完毕
animation.addEventListener('config_ready', () => {}) // 完成初始配置后
animation.addEventListener('data_failed', () => {}) // 加载动画数据失败
animation.addEventListener('loaded_images', () => {}) // 所有图片加载成功或者失败
animation.addEventListener('DOMLoaded', () => {}) // 将元素添加到DOM后
* complete: 播放完成(循环播放下不会触发)
* loopComplete: 当前循环下播放(循环播放/非循环播放)结束时触发
* enterFrame: 每进入一帧就会触发,播放时每一帧都会触发一次,stop方法也会触发
* segmentStart: 播放指定片段时触发,playSegments、resetSegments等方法刚开始播放指定片段时会发出,如果playSegments播放多个片段,多个片段最开始都会触发。
* data_ready: 动画json文件加载完毕触发
* DOMLoaded: 动画相关的dom已经被添加到html后触发
* destroy: 将在动画删除时触发

Lottie的免费资源

之前我们说过Lottie的动画是通过AE制作好了动画后,再使用bodymovie导出为json格式。其实有一个网站,它提供了一些免费的动画(当然也有付费的)直接有我们需要的动画json数据.

如下面的动图, 我们找到我们想要的动画,然后点击后,弹出窗口,点击下载,格式为JSON。然后就能把这个动画的json数据用到我们自己的项目里边去了.

好了介绍完了它的用法后,我们现在就去vue中去做一个实战

在vue中使用lottie

  1. 使用vite跑vue
npm init @vitejs/app <project-name>
复制代码
  1. 安装lottie-web
npm install lottie-web
复制代码
  1. 封装一个基础的组件lottie.vue, 主要就是初始化好lottie对象,然后把对象传递出去给其他组件用
<template><div :style="style" ref="lavContainer"></div>
</template>

<script>
import lottie from ‘lottie-web’

export default {
name: ‘lottie’,
props: {
options: {
type: Object,
required: true,
},
height: Number,
width: Number,
},

computed: {
style() {
return {
width: this.width ? <span class="hljs-subst">${<span class="hljs-variable language_">this</span>.width}</span>px : ‘100%’,
height: this.height ? <span class="hljs-subst">${<span class="hljs-variable language_">this</span>.height}</span>px : ‘100%’,
}
},
},

mounted() {
this.anim = lottie.loadAnimation({
container: this.KaTeX parse error: Expected 'EOF', got '}' at position 798: …ta</span>, }̲) <span cla…emit(‘animCreated’, this.anim)
},

unmounted () {
this.anim && this.anim.destroy()
}
}
</script>

复制代码

  1. 基于上面的组件,我们封装一个更具象一点的组件clickIcon,这个组件也是通用组件,增加了点击后,动画交互需要怎么走向等逻辑.
<template><div class="clickIcon"><divclass="iconBox":style="{ width: width + 'px', height: height + 'px' }"><slot name="svg" v-bind:data="{ toggle, flag, iconWidth, iconHeight }"></slot><lottie@click="toggle":class="{ show: flag === true || !defaultSlot }"class="like"style="display: none;":options="options":height="height":width="width"v-on:animCreated="handleAnimation"/></div></div>
</template>

<script>
import { computed, ref, defineComponent } from “vue”;
import Lottie from “./lottie.vue”;
let anim = null
/**

  • 点击icon然后播放一段动画的组件
  • 适合收藏、点赞等小功能
    */

export default defineComponent({
name: “clickIcon”,
props: {
// 宽度
width: {
type: Number,
default: 100,
},
// 高度
height: {
type: Number,
default: 100,
},
// 初始化Lottie需要的参数
options: {
type: Object,
default: () => {},
},
// 是否需要一个插槽,显示一个默认的图标
defaultSlot: {
type: Boolean,
default: true
},
// 从外面传递的一个点击后需要的交互效果
toggleFun: {
type: Function,
default: null
}
},
components: {
lottie: Lottie,
},
emits: [‘init’],
setup(props, { emit }) {
// 动画速度
const animationSpeed = 2
// 点击交互标识
let flag = ref(false);
// 图标高度
const iconWidth = computed(() => {
return props.width;
});
// 图标宽度
const iconHeight = computed(() => {
return props.height;
});
// 点击图标交互
const toggle = function() {
if (!props.defaultSlot) {
props.toggleFun && props.toggleFun(anim)
} else {
flag.value = !flag.value;
if (flag.value) {
anim.play();
} else {
anim.stop();
}
}
};
// 获取anim对象
const handleAnimation = function(animated) {
anim = animated;
onSpeedChange()
emit(‘init’, animated)
}
// 停止动画
const stop = function() {
anim.stop();
}
// 播放动画
const play = function() {
anim.play();
}
// 暂停动画
const pause = function() {
anim.pause();
}
// 控制播放速度
const onSpeedChange = function() {
anim.setSpeed(animationSpeed);
}
return {
iconWidth,
iconHeight,
handleAnimation,
flag,
toggle,
stop,
play,
pause
};
},
});
</script>

<style scoped>
.iconBox {
position: relative;
}
.show {
display: inline-block !important;
}
.hidden {
display: none !important;
}
.like {
cursor: pointer;
}
.icon {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
</style>
复制代码

接下来我们就写一个喜欢组件like.vue,如之前我们看到的效果 先把下载的动画json文件,放到资源文件目录,然后我们再用代码调用它使用.

<template><lottieclass="like":options="defaultOptions":height="height":defaultSlot="false":width="width"@init="init":toggleFun="toggle"ref="lottie"></lottie>
</template>

<script>
import Lottie from “…/common/clickIcon.vue”;
import animationData from “/public/like.json”;

export default {
name: “app”,
components: {
lottie: Lottie,
},
props: {
width: {
type: Number,
default: 60,
},
height: {
type: Number,
default: 60,
},
},
methods: {
init (animation) {
animation && animation.goToAndStop(0, true)
},
toggle (animation) {
if (this.toggleFlag) {
animation.playSegments([50, 90], true); // 从50帧播放到最后
} else {
animation && animation.playSegments([0, 50], true); // 从第0帧播放到50帧
}
this.toggleFlag = !this.toggleFlag
}
},
data() {
return {
toggleFlag: false,
defaultOptions: {
name: “like”,
animationData: animationData,
autoplay: false,
loop: false,
}
};
}
};
</script>

<style scoped>
.hidden {
display: none;
}
</style>

复制代码

上边的效果之所以这样做,是因为我们下载的‘喜欢’动画的json文件,它是由两个状态组成的, 0-50帧是由未选中到选中状态的动画,50->90帧是选中状态->未选中状态的动画. 具体多少帧到多少帧可以从网站下载json文件那个窗口下面的进度去看到的.

  1. 使用喜欢组件
<template><div id="app"><like></like></div>
</template>

<script>
import { defineComponent } from “vue”;
import like from “./components/like/index.vue”;

export default defineComponent({
components: {
like,
},
});
复制代码

具体效果如下

结语

以上就是利用Lottie在vue中实现一个喜欢组件了。 其实目前只是写了这么一个demo而已,大家有兴趣的话,可以把它再实现完一下,现在组件还没有去记录一下组件的默认状态, 它可能默认就是被选中的状态. 另外我们这一次拿到的动画组件刚好是有选中和未选中两种状态的,在之前给大家介绍的免费下载动画json文件的网站里边还有一些动画是只给到一个选中的动画效果,并没有未选中的状态,这时候我们可以自己去找一个类似的svg图标,然后作为默认的图标,点击后,触发选中的动画效果. 这种场景碰到的极少,如果是公司项目的话,可以要求美工去做两个状态的动画效果,如果是自己的个人项目,然后碰到了很喜欢的免费动画,然而它只提供了一个状态的话,这时候才有用。 我在组件其实也把这种情况考虑进去了,就是defaultSlot把这个属性设置成true, 然后在写组件的时候,添加一个插槽作为一个默认组件.

写在最后

大家可以给个点赞鼓励一下萌新嘛? 哈哈哈, 先谢过了~

前端使用lottie-web,使用AE到处的JSON动画贴心教程相关推荐

  1. lottie 导出html,Lottie Web动效基本原理

    前段时间在<Lottie Web动效在React中的构建>一文中和大家聊了如何通过lottie-web将AE导出来的JSON文件自动生成动效.在该文中,聊的主要是设计软件Figma.Ske ...

  2. ae制h5文字动画_大杀器Bodymovin和Lottie:把AE动画转换成HTML5/Android/iOS原生动画

    前段时间听部门老大说,Airbnb出了个移动端的动画库Lottie,可以和一个名叫Bodymovin的AE插件结合起来,把在AE上做好的动画导出为json文件,然后以Android/iOS原生动画的形 ...

  3. android 2048 动画,大杀器Bodymovin和Lottie:把AE动画转换成HTML5/Android/iOS原生动画

    前段时间听部门老大说,Airbnb出了个移动端的动画库Lottie,可以和一个名叫Bodymovin的AE插件结合起来,把在AE上做好的动画导出为json文件,然后以Android/iOS原生动画的形 ...

  4. 前端实现lottie动画

    前端实现lottie动画 ul通过AE生成的json文件 ,前端通过lottie实现动画简单快捷 <div class="box"></div> 引入 &l ...

  5. 什么人适合学习web前端?怎样学好web前端开发?

    web前端在IT互联网行业的发展前景是非常可观的,越来越多的人都在学习web前端技术,那么什么人适合学习web前端?怎样学好web前端开发?相信大家都想了解这些问题,我们来看看下面的详细介绍. 什么人 ...

  6. 开发web前端_移动前端开发和web前端开发的区别?

    如果说非要有区别的话应该就是开发的软件和方式不同,因为他们本来就不属于一端的东西,具体来看看下面: web前端开发 用最简单粗暴的方式来讲,就是用html + css + javascript来构建一 ...

  7. 移动web前端开发框架_移动前端开发是Web前端开发吗?

    移动端开发并不是Web前端开发,但移动前端开发和web前端开发其实都属于前端开发的范围,目前前端发展的趋势就是大前端,可以说是包罗万象.但不论趋势如何发展,目前来看HTML.CSS和JavaScrip ...

  8. 好程序员web前端干货之web前端开发框架汇总

    好程序员web前端干货之web前端开发框架汇总,其实一个前端开发框架其实就是一系列产品化的HTML/CSS/JavaScript组件的集合,我们可以在设计中使用它们.前端开发框架有很多,其中有一些写得 ...

  9. 前端VS后端Web开发

    前端VS后端-Web开发 介绍 前端开发 后端开发 如果您是一名开发人员,则只是学习编码而希望专注于Web开发,但对走上哪条道路感到困惑.是前端Web还是后端Web开发,或者您是否已经开始了自己的旅程 ...

最新文章

  1. 人工神经外网络中为什么ReLu要好过于Tanh和Sigmoid Function?
  2. 当当优酷纽交所上市,来钱还需看长久
  3. 修改Cmder命令提示符
  4. suse linux 查看cpu,Suse Linux zmd 耗用100% CPU
  5. php 判断网络图片是否存,PHP判断远程图片或文件或url是否存在-180
  6. Android studio的UI组件
  7. 直播课:5G来了,互联网百亿级创新的机遇在哪里?
  8. 一直在构建版本_教你如提升Gradle90%的构建速度
  9. swing中在JTextPane中的输入窗口出现乱码的问题
  10. 与技术无关,犯错了,希望大家帮下
  11. 你爱我,我爱你,IP被封很头疼【Python爬虫实战:ip代理js逆向采集】
  12. 【Teradata】tdlocaledef修改默认日期配置
  13. java虚拟机是什么?
  14. 实战 - Nexus搭建Maven私服
  15. iOS关于应用出现未验证应用的解决方法
  16. 2021上海交大网络安全保研夏令营经验
  17. 必要的系统组件未能正常运行,请修复Adobe Flash Player
  18. mysql 序系列化_J2SE中的序默认序列化_MySQL
  19. 京东云服务器搭建php开发环境
  20. fgetc、fputc、fputs、fgets的使用

热门文章

  1. VisualRules
  2. 手机客户端添加设备时需要扫描二维码,如何查找二维码
  3. Kafka Eagle Consumers不显示
  4. 多叉路口交通灯问题,输入任意道口数输出排序解决方案
  5. 读1968图灵奖获得者 哈明演讲的感悟
  6. 如何将MyEclipse项目导入eclipse
  7. eNSP启动一直出#号的一种参考方法
  8. 音频增强工具:DeskFX Plus Mac
  9. 【RFC2663 IP 网络地址转换器 (NAT) 术语和注意事项】(翻译)
  10. 高价值制造创新智慧工厂新型能力,制造业大数据应用场景