前端动画的另一种方式 json动画

news2025/7/20 21:00:22

前言

一谈到前端动画,最先想到的就是css3,当然这是其中一种方式,甚至有许多动画库,aniamte.css就是其中的一种。

我之前也谈到过三种做前端动画的方式 https://blog.csdn.net/glorydx/article/details/116102127

但现在,再补充一种,由设计师将动画设计好,形成json文件,前端直接渲染的动画。当然gif也可以,但json相对来说体积更好,更不容易失真。

言归正传,前端如何渲染json动画?

简单介绍

前端最普遍使用的渲染json的插件是lottie,我也不对它多做文字介绍,感兴趣的同学前往官网进一步了解https://airbnb.design/lottie/

根据项目的不同,lottie分为几个不同的平台,分别是
lottie-web: https://github.com/airbnb/lottie-web
lottie-android: https://github.com/airbnb/lottie-android
lottie-ios: https://github.com/airbnb/lottie-ios
lottie-react-native: https://github.com/lottie-react-native/lottie-react-native

vue通常使用lottie-web,今天以lottie-web为例,介绍这个插件。

安装

npm install lottie-web

vue组件使用

先准备好一些json的动画,用js导出,这里这样做是因为vue eslint 导入的限制。
在这里插入图片描述

<template>
  <div
    class="dx-icon-animaiton-warpper"
    :class="IconClass"
    @mouseenter="handlePlay"
    @mouseleave="handleStop"
    ref="animation"
    :style="{ width, height }"
    :id="randomID"
  ></div>
</template>

<script>
import { defineComponent, ref, onMounted, nextTick } from 'vue'
// 引入json文件,我放在js里面导出
import * as iconSource from './iconSource/animation.js'
import lottie from 'lottie-web'
import { randomString } from '@/common/index'

export default defineComponent({
  name: 'Lottie',
  props: {
    width: {
      type: String,
      default: '100px'
    },
    height: {
      type: String,
      default: '100px'
    },
    src: {
      type: String,
      default: ''
    },
    jsonData: {
      type: Object,
      default: undefined
    },
    /** 是否自动播放,false则只会在hover状态下播放,true为自动播放 */
    autoplay: {
      type: Boolean,
      default: true
    },
    /** 是否循环播放,false只会播放一次 */
    loop: {
      type: Boolean,
      default: true
    },
    jsonDataName: {
      type: String,
      default: ''
    },
    color: {
      type: String,
      default: ''
    },
    // 执行动画的速度,1为1秒
    speed: {
      type: Number,
      default: 1
    }
  },
  setup(props) {
    const animation = ref(null)
    let lottieControl = {}

    const randomID = randomString(6)
    const IconClass = ref('')

    if (props.color) {
      IconClass.value = 'dx-icon-color-warpper'
    }

    onMounted(() => {
      if (animation.value) {
      	// lottie.loadAnimation的返回值是用来控制该动画的实例
        lottieControl = lottie.loadAnimation({
          // name是控制具体某一个动画的关键
          name: randomID,
          container: animation.value,
          renderer: 'svg',
          // 是否循环播放 默认为true,如果是false,每次启动播放,只会播放一次
          loop: props.loop,
          // 是否在一开始就启动播放
          autoplay: props.autoplay,
          path: props.src,
          // animationData只能加载本地json,优先级高于path
          animationData: props.jsonData || iconSource[props.jsonDataName]
        })
        // 比如来控制播放速度
        lottieControl.setSpeed(props.speed)
      }

      nextTick(() => {
        try {
          const svgDom = document.querySelector(`#${randomID} > svg`)
          if (svgDom && props.color) {
            svgDom.style.filter = `drop-shadow(${props.color} 0px -10000px)`
          }
        } catch (error) {}
      })
    })

    const handlePlay = () => {
      if (!props.autoplay) {
      	// 控制动画的播放
        lottieControl.play(randomID)
      }
      // lottieControl.goToAndStop(props.jsonDataName)
    }

    const handleStop = () => {
      if (!props.autoplay) {
      	// 停止播放
        lottieControl.stop(randomID)
      }
    }

    return {
      animation,
      IconClass,
      handlePlay,
      handleStop,
      randomID
    }
  }
})
</script>

<style lang="scss">
.dx-icon-animaiton-warpper {
  cursor: pointer;
  display: inline-block;
}

.dx-icon-color-warpper {
  overflow: hidden;
  svg {
    overflow: hidden;
    transform: translate(0px, 10000px) !important;
  }
}
</style>

相关内容

也许你会感到为难,你不是设计师,没有那么多动画json可以为你提供,
https://icons8.com/free-animated-icons该网站提供了几百种免费的json动画可以供你选择

你可以去我自己的网站查看这个组件封装使用的具体效果
http://www.dxyx-together.cn/#/home/animationIcon

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/7892.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux笔记(2):vscode插件remote WSL远程使用交叉编译工具链(全志D1-H)

文章目录1.前期准备1.1 Windows有对WSL文件读写的权限1.2 WSL的C语言编译环境已经搭建完毕2.在windows的vscode安装remoteWSL插件3.从ubuntu启动windows端的vscode4.使用vscode编译ubuntu端的c文件4.1 在《tasks.json》指定可视化make命令4.2编写Makefile文件4.3 开始编译4.3.1…

27服务-安全访问状态转换

诊断协议那些事儿 诊断协议那些事儿专栏系列文章&#xff0c;本文将介绍安全访问状态图——作为UDS27服务的规范性附件。 可参考前两篇文章&#xff1a; 27服务-SecurityAccess UDS - 深论Security Access Service 27服务的初衷就是防止无权限人员进行非法数据操作&#xff…

Day801.内存问题排查方案 -Java 性能调优实战

内存问题排查方案 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于内存问题排查方案。 碰到内存持续上升的情况&#xff0c;其实很难从业务日志中查看到具体的问题&#xff0c;那么面对多个进程以及大量业务线程&#xff0c;该如何精准地找到背后的原因呢&#xff1…

STM8S903K3基于ST Visual Develop开发定时器1中断示例

STM8S903K3基于ST Visual Develop开发定时器1中断示例 &#x1f4cc;相关篇《STM8S903K3T6C基于IAR开发GPIO点灯示例》 &#x1f389;在基于STVP环境下和IAR环境下&#xff0c;如果都使用寄存器操作&#xff0c;那么差异不大&#xff0c;主要在中断函数的书写上有差异。 &#…

QSystemTrayIcon——实现系统托盘

QSystemTrayIcon类 QSystemTrayIcon QSystemTrayIcon是qt中专门用于处理系统托盘的类 头文件#include qmakeQT widgetsSinceQt 4.2InheritsQObject QSystemTrayIcon 支持Windows、macos和部分Linux桌面环境&#xff0c;可以通过 QSystemTrayIcon::isSystemTrayAvailable()方…

0基础学习——了解操作符的那些事(一)

小叮当的任意门操作符分类1. 算数操作符2. 移位操作符二进制&#xff08;小插曲&#xff09;左移动操作符右移操作符3. 位操作符& 按位与 &按位或 |按位异或 ^赋值操作符复合赋值符单目操作符操作符分类 在这里我们有&#xff1a;算数操作符 移位操作符 等 今天我们就先…

uni-App获取地图address与高德地图API配合

现在使用获取地图&#xff0c;不需要再去安装sdk&#xff0c;只需要和我一样执行下方代码可以解决问题&#xff08;这里会从先获取经纬度&#xff0c;再到经纬度转成具体的地址&#xff0c;最后补充定位当前位置&#xff09;&#xff0c;并且当中会提及到很多&#xff0c;自己开…

深度学习模型的参数、计算量和推理速度统计

在没有过拟合的情况下&#xff0c;相同模型结构下&#xff0c;一般模型的参数量和计算量与最终的性能成正比&#xff0c;在比较不同模型性能时&#xff0c;最好能保持模型参数量和计算量在相同水平下&#xff0c;因此相应参数的统计很重要。这里只进行理论计算&#xff0c;最终…

MySQL的下载与安装

1. 下载地址 官网&#xff1a;https://www.mysql.com 2. 打开官网&#xff0c;点击DOWNLOADS 然后&#xff0c;点击 MySQL Community(GPL) Downloads 3. 点击 MySQL Community Server 这里在Windows 系统下推荐下载 MSI安装程序 &#xff1b; 点击 My Go to Download Page…

中国医药院外流通市场分析

医药流通行业概览 医药流程市场主要分为院内、院外。 与院内市场终端相比&#xff0c;院外市场终端(特别是基层医疗层级终端)数量更多、规模更 小以及分布分散。此外&#xff0c;院外市场终端的服务区域半径有限&#xff0c;仅服务于一定地理区域内的 终端客户。因此&#xff…

【面试题】 ES6 类聊 JavaScript 设计模式之行为型模式(二)

本文是《ES6 类聊 JavaScript 设计模式》的第四篇&#xff0c;介绍第三种类型的设计模式行为设计模式&#xff0c;其特别关注对象之间的通信。 在软件工程中&#xff0c; 行为型模式为设计模式的一种类型&#xff0c;用来识别对象之间的常用交流模式并加以实现。如此&#xff0…

【Linux】进程控制

目录&#x1f308;前言&#x1f338;1、进程创建&#x1f361;1.1、概念&#x1f362;1.2、fork()之后执行顺序&#x1f367;1.3、fork()返回值&#x1f368;1.4、写时拷贝&#x1f369;1.5、fork创建失败问题&#x1f341;2、进程终止&#x1f372;2.1、概念&#x1f371;2.2、…

【附源码】Python计算机毕业设计数据学院工作量管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

力扣刷题day48|583两个字符串的删除操作、72编辑距离

文章目录583. 两个字符串的删除操作动态规划思路一动态规划思路二动态规划五部曲72. 编辑距离思路动态规划五部曲583. 两个字符串的删除操作 力扣题目链接 给定两个单词 word1 和 word2 &#xff0c;返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符…

K_A05_001 基于 STM32等单片机驱动8X8点阵模块(MAX7219)显示0-9

目录 一、资源说明 二、基本参数 1、参数 2、引脚说明 三、通信协议说明 工作时序 对应程序: 四、部分代码说明 1、接线说明 1.1、STC89C52RC8X8点阵模块&#xff08;MAX7219&#xff09; 1.2、STM32F103C8T68X8点阵模块&#xff08;MAX7219&#xff09; 2、亮度调节 五、基…

Python中内置数据库!SQLite使用指南!

&#x1f4a1; 作者&#xff1a;韩信子ShowMeAI &#x1f4d8; Python3◉技能提升系列&#xff1a;https://www.showmeai.tech/tutorials/56 &#x1f4d8; 本文地址&#xff1a;https://www.showmeai.tech/article-detail/390 &#x1f4e2; 声明&#xff1a;版权所有&#xf…

Docker数据卷

Docker数据卷、Docker安全Docker数据卷Docker数据卷管理bind mountdocker数据卷两种方式不同和相同卷插件简介convoy卷插件实践Docker数据卷 主要解决存储问题、容器数据滞留 Docker数据卷管理 bind mount “-v”宿主机路径容器内nginx发布目录 新建一个首页 现在容器内目录…

猿创征文|工具百宝箱-编辑器-笔记工具-日常小工具-原型设计工具

这篇文主要介绍了开发者工具之外的一些日常小工具&#xff0c;我用这些小工具主要完成什么工作。分享给大家 官方活动入口&#xff1a;「猿创征文 」第四季 | 2022 年我的开发者工具 猿创征文&#xff5c;工具百宝箱-代码编辑器-版本控制工具-终端神器-项目与事务跟踪工具-SFTP…

pdf文件转txt怎么转?这几个方法你值得收藏

平时我们在网络上搜索资料的时候&#xff0c;会发现很多资料都是以PDF格式显示的&#xff0c;虽然这种文件格式很方便我们查看&#xff0c;但是如果将其保存到手机中&#xff0c;又太占用内存了。其实我们可以将其转换成txt格式&#xff0c;因为我发现它不仅不占空间&#xff0…

助力数据中心双碳发展,存储如何变得越来越绿?

2022年11月10日&#xff0c;我看到曙光发了首款液冷存储&#xff0c;目标锁定数据中心PUE1.1以下。在“双碳”发展趋势下&#xff0c;聚焦液冷存储与液冷服务器的创新&#xff0c;曙光对绿色数据中心的可持续发展将带来行业引领效应。 双碳大趋势下&#xff0c;绿色存储呼之欲出…