首页 > 其他分享 >100%硬核解决前端复杂动画的秘密武器!

100%硬核解决前端复杂动画的秘密武器!

时间:2023-12-15 22:25:19浏览次数:38  
标签:function 动画 anim 秘密武器 100% vue Lottie lottie 硬核

哈喽!大家好!我是程序视点的小二哥。
前端开发中,总会遇到这样一个困境:动画还原。对于前端开发工程师,有的是这样做的。

  • 照着设计动画模仿,猜测动画时长,手创建贝塞尔曲线……
  • 调整细节耗时耗力,效果还差强人意...
  • 好不容易实现了,还原度却达不到要求

在被UI设计折磨一顿后,小二哥找到了解决这个困境的方案。它就是今天的主角:Lottie

Lottie简介

Lottie 是Airbnb开源的一个 面向iOS、Android、React Native 的动画库,能分析 AE 导出的动画(需要用bodymovin导出为json格式),并且能让原生 App 像使用静态素材一样使用这些动画,完美实现动画效果。

下面是Lottie提供的官方效果图。类似下面这种一段动画的播放,非常适合使用Lottie来做。

Lottie流程

我们先来看下整个流程简图。

设计师用AE把动画效果做出来,再用Bodymovin导出相应地json文件给到前端,前端使用Lottie库就可以实现动画效果。功能简单且强大。

至于Adobe Effect和Bodymovin插件的安装与使用...嗯嗯,这是设计师的事情,咱们就不操心啦。

Lottie使用入门

静态URL引入

<script src="https://cdnjs.cloudflare.com/ajax/libs/lottie-web/5.8.1/lottie.min.js" integrity="sha512-V1YyTKZJrzJNhcKthpNAaohFXBnu5K9j7Qiz6gv1knFuf13TW/3vpgVVhJu9fvbdW8lb5J6czIhD4fWK2iHKXA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

调用loadAnimation

var params = {
  container: element, // 容器节点
  renderer: 'svg',
  loop: true,
  autoplay: true,
  path: 'data.json' // JSON文件路径
}
var anim = lottie.loadAnimation(params);

vue中使用Lottie

依赖安装和使用

通过NPM安装vue-lottie

npm install --save vue-lottie

vue-lottie使用

<template>
    <div id="app">
        <lottie :options="defaultOptions" :height="400" :width="400" v-on:animCreated="handleAnimation"/>
        <div>
            <p>Speed: x{{animationSpeed}}</p>
            <input type="range" value="1" min="0" max="3" step="0.5"
                   v-on:change="onSpeedChange" v-model="animationSpeed">
        </div>
        <button v-on:click="stop">stop</button>
        <button v-on:click="pause">pause</button>
        <button v-on:click="play">play</button>
    </div>
</template>

<script>
  import Lottie from './lottie.vue';
  import * as animationData from './assets/pinjump.json';

  export default {
    name: 'app',
    components: {
      'lottie': Lottie
    },
    data() {
      return {
        defaultOptions: {animationData: animationData},
        animationSpeed: 1
      }
    },
    methods: {
      handleAnimation: function (anim) {
        this.anim = anim;
      },

      stop: function () {
        this.anim.stop();
      },

      play: function () {
        this.anim.play();
      },

      pause: function () {
        this.anim.pause();
      },

      onSpeedChange: function () {
        this.anim.setSpeed(this.animationSpeed);
      }
    }
  }
</script>

参数配置

也就是上面的defaultOptions属性传递配置对象:

  • container:在其上呈现动画的 dom 元素
  • animationData:一个带有导出动画数据的对象。
  • path:动画对象的相对路径。(animationData 和 path 是互斥的)
  • loop:默认值为true。可传递需要循环的特定次数
  • autoplay:true / false 它会在准备好后立即开始播放
  • name:动画名称以供将来参考
  • renderer: 'svg' / 'canvas' / 'html' 设置渲染器

Lottie动画监听

Lottie提供了用于监听动画执行情况的事件:

  • complete
  • loopComplete
  • enterFrame
  • segmentStart
  • config_ready(初始配置完成)
  • data_ready(所有动画数据加载完成)
  • DOMLoaded(元素已添加到DOM节点)
  • destroy

可使用addEventListener监听事件

// 动画播放完成触发
anm.addEventListener('complete', anmLoaded);

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

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

Lottie的更多详解,请查阅下方链接。

Lottie 地址:https://github.com/airbnb/lottie-android

Lottie 官网:https://airbnb.design/lottie/

关注同名微信公众号【程序视点】,了解更多有趣、好玩的项目吧~

标签:function,动画,anim,秘密武器,100%,vue,Lottie,lottie,硬核
From: https://www.cnblogs.com/tanggoahead/p/17904274.html

相关文章

  • 解决方案 | pywintypes.com_error: (-2147221005, '无效的类字符串', None, None) --P
     1背景importpythoncomimportwin32com.clientimportmathwincad=win32com.client.Dispatch("AutoCAD.Application")#强制打开cad,该句发生报错信息doc=wincad.ActiveDocumentdoc.Utility.Prompt("Hello!Autocadfrompywin32com.\n")msp=doc.Mode......
  • 设计模式:程序员的秘密武器(高手必备)
    在过去的几十年的职业生涯中,我观察到许多同事在技术方面取得了显著的进步和能力提升。然而,随着时间的推移,他们似乎逐渐遇到了一个发展的瓶颈。尽管大家都渴望以最快的速度提升自己的技能水平,但他们忽视了一个关键的因素,那就是内功修炼。是的,我相信大家都知道我们所说的内功心法指......
  • 设计模式:程序员的秘密武器(高手必备)
    在过去的几十年的职业生涯中,我观察到许多同事在技术方面取得了显著的进步和能力提升。然而,随着时间的推移,他们似乎逐渐遇到了一个发展的瓶颈。尽管大家都渴望以最快的速度提升自己的技能水平,但他们忽视了一个关键的因素,那就是内功修炼。是的,我相信大家都知道我们所说的内功心法指......
  • 猫眼电影TOP100
    一、猫眼电影排行TOP100抓取(小案例)​ 声明:个人源码仅供自己学习记录,他人使用学习中切勿用于非法用途,请自觉遵守国家法律。造成的损失一概与本人无关。​ 本文记录了自己学习途中的代码,主要通过正则提取解析网页内容然后存储到本地。猫眼电影拥有反爬机制,使用爬虫加上延时一样会......
  • 『递归』⇢ 计算1加到100结果
    ......
  • 关于再次出现 Could not open client transport with JDBC Uri: jdbc:hive2://node1:1
    写在最前边——我报错是因为空间不足 当我时隔两个月再次看到这个报错的时候我是感到绝望的————然而当我查了一遍百度发现唯一一个拥有相同报错解决方法的博客出自我之手的时候我的崩溃的————在我发现曾经的方法无法解决现在的我的报错的时候,我觉得我的心都碎了QAQ......
  • 电加热器设计: 1升水温度上升一度要1000卡。
    1升水温度上升一度要1000卡。分析及过程:m=p·V=1.0×10³kg/m³×10-³m³=1kgQ=c·m·△t=4.2×10³J/(kg℃)×1kg×1℃=4200J=1000K∵1卡≈4.2J,∴4200J=1000卡。∴1升水温度上升一度要1000卡。扩展资料:设物体质量为m,在吸收(或放出)热量ΔQ时,温度升高(......
  • 如何解决爬虫10060错误
    爬虫在运行过程中,有时可能会遇到10060错误,这是由于网络连接超时或被阻止所引起的。下面是一些可能导致10060错误的原因以及相应的解决方法:1.网络连接问题原因:10060错误通常是由于爬虫无法建立与目标服务器的连接而引起的。这可能是由于网络连接不稳定、DNS解析问题、代理配置错误等......
  • P1004 [NOIP2000 提高组] 方格取数 题解
    P1004[NOIP2000提高组]方格取数题解题目链接P1004[NOIP2000提高组]方格取数简要思路注意一下输入可以简化为while(std::cin>>x>>y>>val&&x){ //***}运用DP的思想。用一个四维的\(DP\)数组\(dp[i][j][k][l]\)来同时记录两条路径分别走到\((i,j)\)和\((k,......
  • 初中英语优秀范文100篇-026Healthy Food-健康的食物
    PDF格式公众号回复关键字:SHCZFW026记忆树1Healthisveryimportantforourbody.翻译健康对我们的身体非常重要。简化记忆健康句子结构主语:Health(健康)Health作为句子的主语,表示健康这个概念。谓语:is(是)is作为连系动词,用来连接主语和表语,表达等同、状态或......