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方案需要用到大量图片,还不如使用gif

1、安装lottie-web

npm install lottie-web

2、处理资源文件

1、将所有图片文件压缩一遍
2、在根目录下的public文件夹下创建static文件,存放图片文件,如果有多个不同动画,可以根据情况进行分文件存放
3、在src目录中assets创建animation文件夹,存放json文件`

3、封装Lottie.vue组件

<template>
    <div v-if="show_up" class="lottie-up" ref="showUpContainer"></div>
</template>
<script setup lang="ts">
// 引入lottie
import lottie from 'lottie-web'
import { ref, watch, nextTick } from 'vue'
import show_up from '../assets/animation/data_6.json'
const showUpContainer = ref<any>(null)
const anim_up = ref<any>(null)
const props = defineProps({
    show_up: {
        type: Boolean,
        default: false
watch(
    () => props.show_up,
    (val) => {
        if (val) {
            anim_up.value = lottie.loadAnimation({
                    container: showUpContainer.value, // 绑定dom节点
                    renderer: 'svg', // 渲染方式:svg、canvas
                    loop: true, // 是否循环播放,默认:false
                    autoplay: true, // 是否自动播放, 默认true
                    animationData: show_up, // AE动画使用bodymovie导出为json数据
                    assetsPath: 'https://xxx.xxx.com/static-h5-pro/202212/vacation/static/images_6/' // json文件中的图片路径会基于这里的路径
        immediate: true,
        deep: true
</script>

4、使用动画组件

<template>
<!-- 这里判断显示条件,进行传参显示即可 -->
<Lottie
    :show_up="show_up"
    ref="refLottie_up"
</template>
<script lang="ts" setup>
// 预加载图片
const perviewLoadImg = (): void => {
    const path = `https://xxx.xxx.com/static-h5-pro/202212/vacation/static/images_${props.rabbit_level}/`
    const count = 89
    const cur_image = new Image()
    cur_image.src = `${path}img_${img_num.value}.png`
    cur_image.onload = () => {
        if (img_num.value < count) {
            img_num.value++
            perviewLoadImg()
        } else {
            allLoad.value = true
</script>

5、构造条件,即可在页面中显示动画了

1、图片过多情况下,合理规划图片加载情况,保证用户首次进入页面体验,例如:五个等级兔子动画特效,每个动画90张大小100K左右的图片,

首次进入页面最好不要全部加载完成,这样的话时间会很长才能显示动画,所以只加载当前等级的兔子动画图片,既能保证动画效果,又能快速展示动画,保证用户体验

2、需要使用预加载,预加载过程中可以使用菊花图,必须保证当前动画所有图片都加载完成后再显示动画效果,要不然会有卡顿的现象

3、动画渲染完成后,不能动态切换其他动画,所以如果有多个动画的情况下,需要初始化不同的lottie实例

4、尽量避免动画效果图片过多,可以使用别的方案代替,例如:gif图

其他同类型方案对比

优点:简单

缺点:掉帧严重,体验不流畅,对于小icon可以接受,对于大面积动画效果不行

Video:

优点:兼容性好,体积小

缺点:很多平台(微信、部分安卓浏览器)禁止自动播放问题,隐藏视频控制条,IOS 视频自动全屏播放,oppo 机视频播放自动悬浮置顶,PC端有色差等

移动端 web 对于 video 自动播放的兼容性是在太差,尤其安卓,一些浏览器对 video 标签进行拦截,并以自己的方式实现,或是悬浮置顶播放,或是两个视屏播放冲突,或是控制条无法隐藏,或是播放默认全屏,如果用其它方式可以实现动画尽量还是用其它方式

对于 video 的自动播放,考虑一些浏览器限制必须通过用户交互才能使用,如果视屏是在第一屏则有点难度,还是需要用户通过点击才能播放,如果不是第一屏则可通过 touch 事件来触发,毕竟用户下拉滚动还是会触发 touch 事件

video 的 play 方法返回的 promise 存在华为荣耀8 微信里返回 play 成功,但是却没有播放视频

APNG:

基于 PNG 格式扩展的一种动画格式,增加了对动画图像的支持,为了替代老旧的 GIF 格式,但部分浏览器不支持,兼容性严重,需要考虑兼容

Lottie:

颜色、数字倾斜度、虚线的透视都不到预期

  • 私信