什么是Lottie ,以及前端如何使用

背景

主要是解释下Lottie动画的使用,以及如何获取资源,如何前端引入及控制他的播放

什么是Lottie

Lottie 是 Airbnb 开发的一种跨平台动画格式,它基于 JSON 格式存储动画数据,能够直接在移动设备(iOS/Android)、网页(Web)和桌面应用中渲染高质量动画。

其核心原理是:设计师使用 After Effects 制作动画后,通过 Lottie 插件(如 Bodymovin)将动画导出为 JSON 文件,开发者无需额外编码,直接调用 Lottie 库(如 lottie-web、lottie-ios 等)即可加载和播放动画,无需依赖传统的图片格式(如 PNG、GIF)或视频。

Lottie 动画 vs SVG、PNG 的优点

对比维度 Lottie 动画 SVG PNG
文件体积 极小。基于 JSON 描述动画逻辑,无像素数据,复杂动画体积也远小于同等效果的 SVG/PNG 序列。 较小,但复杂图形(如渐变、路径)体积会显著增加;若包含动画(如 SMIL),体积进一步变大。 大。基于像素存储,分辨率越高、色彩越丰富,体积越大;动态效果需多张 PNG 序列,体积呈倍数增长。
动态表现力 极强。支持复杂动画(如路径动画、形变、透明度过渡、3D 效果等),且流畅度不受分辨率影响。 有限。仅支持简单动画(如 SMIL 规范的缩放、平移),复杂动画需结合 JS 实现,性能较差。 极差。静态图片,动态效果需通过多张 PNG 逐帧切换(类似 GIF),流畅度低,且会产生卡顿。
分辨率适配 无损适配任意分辨率。矢量渲染,在高清屏幕(如 Retina)上不会模糊,无需为不同设备准备多套资源。 无损适配任意分辨率(矢量特性),但复杂图形在放大后可能出现边缘锯齿。 有损适配。基于像素,放大后会模糊;需为不同分辨率设备准备多套图片(如 @1x、@2x),增加开发成本。
开发效率 高。设计师导出 JSON 后,开发者直接调用 Lottie 库即可加载,无需手动处理动画逻辑;跨平台通用(一套资源支持多端)。 中等。需手动处理 SVG 代码(如优化路径、兼容动画),且不同平台对 SVG 动画的支持度不一致(如 iOS 对 SMIL 支持差)。 低。静态图片需手动拼接成动态效果(如用 JS 切换帧),且多分辨率适配需额外开发,工作量大。
性能 优秀。通过硬件加速渲染,占用 CPU / 内存资源少,复杂动画也能保持流畅(帧率稳定)。 一般。复杂 SVG 或动画可能导致渲染卡顿,尤其是在低端设备上。 较差。逐帧切换 PNG 会频繁触发重绘,占用大量 CPU 资源,容易出现掉帧。

如何获取 Lottie的json文件

iconfont-阿里巴巴矢量图标库

lottiefiles

进入仓库 打开刚才保存的详情

以react为例 前端如何引入

基础引入

js 复制代码
import Lottie from 'lottie-react'

import groovyWalkAnimation from '@/assets/lottie/Success.json'

const AnimationComponent = () => {
  return (
    <Lottie
      animationData={groovyWalkAnimation}
      autoplay={true}
      loop={true}
      style={{ width: 300, height: 300 }}
    />
  )
}

export default AnimationComponent

默认播放最后一帧 鼠标滑过则播放动画

js 复制代码
import Lottie from 'lottie-react'
import React, { useRef, useEffect, useState } from 'react'

import groovyWalkAnimation from '@/assets/lottie/Success.json'

const AnimationComponent = () => {
  const lottieRef = useRef<any>(null)
  // 状态:标记动画是否正在播放(初始为false)
  const [isPlaying, setIsPlaying] = useState(false)

  // 初始跳转到最后一帧
  useEffect(() => {
    const lottieInstance = lottieRef.current
    if (lottieInstance) {
      const totalFrames = lottieInstance.getDuration(true)
      lottieInstance.goToAndStop(totalFrames, true)
    }
  }, [])

  // 鼠标悬停触发动画(仅当未在播放时)
  const handleMouseOver = () => {
    if (!isPlaying && lottieRef.current) {
      setIsPlaying(true) // 锁定:标记为正在播放
      lottieRef.current.goToAndPlay(0, true) // 开始播放
    }
  }

  // 动画播放完成后解锁
  // const handleComplete = () => {
  //   setIsPlaying(false) // 解锁:允许下次触发
  //   // 确保动画停在最后一帧(可选,根据需求)
  //   const totalFrames = lottieRef.current?.getDuration(true)
  //   lottieRef.current?.goToAndStop(totalFrames, true)
  // }

  return (
    <Lottie
      animationData={groovyWalkAnimation}
      autoplay={false}
      loop={false}
      lottieRef={lottieRef}
      onMouseLeave={() => {
        setIsPlaying(false)
      }}
      onMouseEnter={handleMouseOver}
      // onComplete={handleComplete} // 监听动画完成事件
      style={{ width: 300, height: 300 }}
    />
  )
}

export default AnimationComponent

总结

Lottie 动画的核心优势在于极小的体积、无损的分辨率适配、强大的动态表现力 ,以及跨平台的便捷开发,完美解决了 SVG 动画能力有限、PNG 体积大且动态效果差的问题,尤其适合需要高质量动态交互的场景(如 App 引导页、UI 动效、数据可视化等)。

以后我们做动画的时候 多一种选择

相关推荐
天蓝色的鱼鱼14 小时前
关于 CSS 你可能不知道的属性,但关键时刻很有用
前端·css
泯泷15 小时前
第 2 篇:设计第一套字节码:Opcode、Instruction 与 Constant Pool
前端·javascript·安全
妙码生花15 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(十五):优化细节、网络请求封装
前端·后端·ai编程
泯泷15 小时前
第 1 篇:从 1 + 2 开始:亲手写出第一台 JSVM
前端·javascript·安全
团团崽_七分甜15 小时前
Spring Boot 核心知识点总结
前端
lichenyang45315 小时前
从一个按钮开始,理解 ASCF 框架到底在做什么
前端
古夕16 小时前
第三方 SSO 接入实践:redirect_uri 编码、回调一致性与跨项目联调
前端·vue.js
朦胧之16 小时前
页面白屏卡住排查方法
前端·javascript
用户5936087414016 小时前
Playwright 黑魔法:用 ClipboardEvent 绕过 React 富文本编辑器
前端
石山岭16 小时前
自己动手写了一个 Android 虚拟定位 App:GPSSimulate 技术实
android·前端