位置: IT常识 - 正文

前端使用lottie-web,使用AE导出的JSON动画贴心教程(前端使用vue)

编辑:rootadmin
前端使用lottie-web,使用AE导出的JSON动画贴心教程 Lottie简介

推荐整理分享前端使用lottie-web,使用AE导出的JSON动画贴心教程(前端使用vue),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:前端使用的框架,前端使用docker,前端使用了什么技术,前端使用了什么技术,前端使用vue,前端使用了什么技术,前端使用什么语言,前端使用什么语言,内容如对您有帮助,希望把文章链接给更多的朋友!

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

Lottie的优点动画由设计使用专业的动画制作工具AE来实现,使动画实现更加方便,且效果更好前端可以方便的调用动画,并对动画进行控制,减少前端动画工作量设计制作动画,前端展现动画,分工明确使用lottie方案,json文件大小比gif文件小很多,性能也会更好lottie-web 在前端的使用安装lottie-webnpm install lottie-web复制代码lottie-web的基本用法import lottie from 'lottie-web'const animation = lottie.loadAnimation({ container: document.getElementById('domId'), // 绑定dom节点 renderer: 'svg', // 渲染方式:svg、canvas loop: true, // 是否循环播放,默认:false autoplay: true, // 是否自动播放, 默认true animationData: // AE动画使用bodymovie导出为json数据})json简单解释{ "v": "5.1.13", // bodymovin 版本 "fr": 30, // 帧率 "ip": 0, // 起始关键帧 "op": 20, // 结束关键帧 "w": 150, // 视图宽 "h": 130, // 视图高 "nm": "鹅头收起动画", // 名称 "ddd": 0, // 3d "assets": [], // 资源集合 "layers": [], // 图层集合 "masker": [] // 蒙层集合}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使用vite跑vuenpm init @vitejs/app <project-name>复制代码安装lottie-webnpm install lottie-web复制代码封装一个基础的组件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>

复制代码

基于上面的组件,我们封装一个更具象一点的组件clickIcon,这个组件也是通用组件,增加了点击后,动画交互需要怎么走向等逻辑.<template> <div class="clickIcon"> <div class="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>前端使用lottie-web,使用AE导出的JSON动画贴心教程(前端使用vue)

<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> <lottie class="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文件那个窗口下面的进度去看到的.

使用喜欢组件<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, 然后在写组件的时候,添加一个插槽作为一个默认组件.

写在最后

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

本文链接地址:https://www.jiuchutong.com/zhishi/297517.html 转载请保留说明!

上一篇:小满nestjs(第二十七章 nestjs typeOrm关系)(小满内容)

下一篇:yolox改进--添加Coordinate Attention模块(CVPR2021)(yolo改进方法)

  • 怎样用视频网络推广呢(怎样用视频网络直播)

    怎样用视频网络推广呢(怎样用视频网络直播)

  • 小天才摇一摇加好友怎么关闭(小天才摇一摇加好友)

    小天才摇一摇加好友怎么关闭(小天才摇一摇加好友)

  • 微信怎么设置消息免打扰(微信怎么设置消息隐藏)

    微信怎么设置消息免打扰(微信怎么设置消息隐藏)

  • 苹果xr微信如何调夜间模式(苹果xr微信如何分身)

    苹果xr微信如何调夜间模式(苹果xr微信如何分身)

  • 红米k30如何设置呼吸灯(红米k30如何设置永不锁屏)

    红米k30如何设置呼吸灯(红米k30如何设置永不锁屏)

  • 计算机突然停电什么数据会丢失(计算机突然停电了怎么办)

    计算机突然停电什么数据会丢失(计算机突然停电了怎么办)

  • 微信上附近人为什么别人看不到我(微信附近人为什么不能用了怎么办)

    微信上附近人为什么别人看不到我(微信附近人为什么不能用了怎么办)

  • 为什么实名认证不通过(为什么实名认证刷脸不成功)

    为什么实名认证不通过(为什么实名认证刷脸不成功)

  • 微信昵称无法保存特殊符号(微信昵称无法保存)

    微信昵称无法保存特殊符号(微信昵称无法保存)

  • nova65g上市时间(nova65g手机什么时候上市的)

    nova65g上市时间(nova65g手机什么时候上市的)

  • 两个系统怎么选择启动(两个系统怎么选一个系统)

    两个系统怎么选择启动(两个系统怎么选一个系统)

  • 无声鼠标真的无声吗(无声鼠标是什么意思)

    无声鼠标真的无声吗(无声鼠标是什么意思)

  • 华为手机开机时间太长怎么办(华为手机开机时出现英文字母)

    华为手机开机时间太长怎么办(华为手机开机时出现英文字母)

  • 微信没有红包功能是怎么回事(微信没有红包功能关闭了怎么办)

    微信没有红包功能是怎么回事(微信没有红包功能关闭了怎么办)

  • 拼多多免拼券怎么获得(拼多多免拼券怎么用)

    拼多多免拼券怎么获得(拼多多免拼券怎么用)

  • qq如何不加好友直接发消息(qq如何不加好友发消息)

    qq如何不加好友直接发消息(qq如何不加好友发消息)

  • 微信如何设置来新信息没有内容(微信如何设置来电视频铃声)

    微信如何设置来新信息没有内容(微信如何设置来电视频铃声)

  • 电脑qq音乐怎么退出来(电脑qq音乐怎么下载到桌面)

    电脑qq音乐怎么退出来(电脑qq音乐怎么下载到桌面)

  • 华为nova5耳机插哪(华为nova5耳机插孔)

    华为nova5耳机插哪(华为nova5耳机插孔)

  • 淘宝下单怎么备注快递(淘宝下单怎么备注图片)

    淘宝下单怎么备注快递(淘宝下单怎么备注图片)

  • iphone11锁屏相机怎么打开(iphone11锁屏相机怎么关闭)

    iphone11锁屏相机怎么打开(iphone11锁屏相机怎么关闭)

  • 什么是三层交换机(什么是三层交换技术)

    什么是三层交换机(什么是三层交换技术)

  • iphonexsmax有nfc功能么(iphonexsmax nfc怎么用)

    iphonexsmax有nfc功能么(iphonexsmax nfc怎么用)

  • 电脑右下角弹窗广告彻底关闭教程(如何彻底关闭电脑右下角弹窗)

    电脑右下角弹窗广告彻底关闭教程(如何彻底关闭电脑右下角弹窗)

  • vue3 组件响应式v-model 失效,实践踩坑,一文搞懂组件响应式原理,对初学者友好(vue中响应式是什么意思)

    vue3 组件响应式v-model 失效,实践踩坑,一文搞懂组件响应式原理,对初学者友好(vue中响应式是什么意思)

  • Vue使用axios用post方式将表单中的数据以json格式提交给后端接收(vue-axios详细介绍)

    Vue使用axios用post方式将表单中的数据以json格式提交给后端接收(vue-axios详细介绍)

  • 原生JS的拖拽属性draggable(详解)(js实现拖拽选区的功能)

    原生JS的拖拽属性draggable(详解)(js实现拖拽选区的功能)

  • 开外经证需要预缴税几个点
  • 公司给员工代办失业证
  • 税金及附加要计入本年利润吗
  • 销项税额的计算方法
  • 应付账款周转率和存货周转率公式
  • 收益性支出包括哪些内容
  • 月中入职新公司社保谁交
  • 公司刻一套章子多少钱
  • 土地增值税预征率
  • 购买商品赠送
  • 房地产企业内部查账查什么
  • 特许权使用费代扣代缴增值税
  • 电话费开专票可抵扣吗
  • 企业购买商品
  • 海关进口增值税专用缴款书如何抵扣
  • 帮对方公司垫付违法吗
  • 办公用品包括啥
  • 行政单位缴纳罚款如何记账
  • 运输费未取得运输专用发票怎么抵扣?
  • 如何关闭windows10自动更新
  • 如何使用u盘安装软件
  • mac os x 10.0
  • 高新企业政府补贴怎么入账
  • 固态硬盘什么牌子性价比高
  • 出租固定资产取得的净收益计入什么科目
  • 耕地占用费与耕地的区别
  • 对公账户转私人账户有限额吗
  • 电脑开机显示屏显示无信号黑屏怎么办
  • staruml教程
  • PHP:pcntl_sigprocmask()的用法_PCNTL函数
  • 提高stable diffusion速度
  • easyui给下拉框赋值
  • laravel框架实现增删改查
  • 前端面试题目100及最佳答案
  • 微信小程序获取地理位置
  • vuemvvm模式
  • python标准库在哪个目录
  • 后浪是什么意思网络用语
  • python极客项目编程 豆瓣
  • 什么是对公账户和个人账户
  • 可供出售金融资产的会计处理
  • 本年利润在借方代表亏损吗
  • 发生售后维修领用材料分录
  • 关于DEDECMS移动data后网站地图无法生成的解决方法
  • 营业执照是如何年审的
  • 航空电子客票行程单是发票吗
  • 劳务报酬和工资薪金有什么区别
  • 收到一张普通发票怎么做账
  • 开承兑需要多少手续费
  • 股东打给公司的投资款
  • 企业变更地址需要几天
  • 印花税不小心申报几次怎么办
  • 进项转出的原因是什么
  • 哪些业务可以进入共享服务中心
  • 暂估成本以后也没有票回来了
  • 报关单不在海关信息中
  • 密码区出框
  • 城建税教育费附加会计分录
  • sql如何实现
  • sqlserver字符串切割
  • 使用mysql进行模糊查询
  • mysql解压版怎么使用
  • xbox预览系统
  • Internet Explorer 8(IE8)简体中文版de 卸载
  • solaris配置ip地址
  • 没有系统盘怎么修复系统
  • winxp回收站在哪里
  • mac屏幕共享软件
  • win7无法删除d盘
  • 禁用远程桌面服务登录
  • win1021h2正式版
  • linux用c语言实现命令功能
  • javascript 快速入门
  • python 脚本编写
  • eclipse项目导入后有红叉
  • 佛山国家税务局招聘
  • 进口设备如何交税
  • 福建闽江人才服务中心可靠吗
  • 深圳增值税勾选平台网址
  • 新三步走和旧三步走的异同点
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设