Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >React: Lottie 动画初体验和优化策略

React: Lottie 动画初体验和优化策略

作者头像
西南_张家辉
发布于 2021-02-02 02:23:12
发布于 2021-02-02 02:23:12
4.1K01
代码可运行
举报
文章被收录于专栏:张家辉的树屋张家辉的树屋
运行总次数:1
代码可运行

阅读大约需要 12-15 分钟, 主要简单介绍 lottie 动画概况和一些优化方案, 主要的优化方案针对React h5 的优化方案

1、什么是 LOTTIE

lottie 是 Aribnb 开源一个主要面向 Web、iOSAndroidReact NativeWindows 的动画库,可以实时渲染After Effects动画,并以Bodymovin作为json导出,允许应用程序像使用静态图像一样轻松使用动画,一款协同合作的高效软件。

简单来讲就是 UI 设计师用 AE 解析出 JSON 动画,前端工程师使用 JSON 文件在 lottie-web 等框架下进行 svg (canvas/html) 渲染

2、看几个简单的 DEMO

3、为什么选择 LOTTIE 动画,比较同样类型和选择

  • 同样类型的复杂动画实现的方案现在有如下几个
      1. png 序列帧:
      • 优点:兼容性好,工程师可控,操作性强
      • 缺点:它需要大量图片素材支持,动画播放时占用的内存较多
      1. 视频:
      • 优点:兼容性好,适配工作少
      • 缺点:交互弱,加载成本高
      1. gif:
      • 优点:实现简单。
      • 缺点:部分手机掉帧非常严重,体验不流畅,严重影响用户体验
  • lottie 动画就解决了这一问题:Lottie 只需要解析导出的 JSON 文件及所需要的图片,就能在各个平台上实现相同的动画效果,它实现成本低,上线后只需要动态替换对应的 JSON 文件就能实现可配置、可运营

4、简单的原理解析

来看看 bodymovin 动画的渲染基本流程

  • 1、 registerAnimation
    • 注册动画,创建一个AnimationItem容器,把我们的节点elementanimationData json数据进行初始化
  • 2、 setData,setParams
    • animationData 设置基础值, 来确定数据来源并初始化数据,解析 svg/canvas/html 渲染方式
  • 3、 configAnimation
    • 挂载动画数据的参数
  • 4、 loadAnimation
    • load 动画
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function loadAnimation(params){
    var animItem = new AnimationItem();
    setupAnimation(animItem, null);
    animItem.setParams(params);
    return animItem;
}
复制代码
  • 其实lottie是用了 requestAnimationFrame----在于充分利用显示器的刷新机制,比较节省系统资源。

5、React 项目实现

  • 设计同学设计动画, AE 导出 zip 动画包,这里我们先使用 lottiefiles一下,然后可以根据情况来使用动画资源,一般是直接使用 json 文件即可;具体 React 项目如下,安装 `react-lottie
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install react-lottie
  • 导入 json 文件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import Lottie from "lottie-react";
import groovyWalkAnimation from "./groovyWalk.json";

const Example = () => {
  return <Lottie animationData={groovyWalkAnimation} />;
};

export default Example;
复制代码

实现比较简单

6、优化策略

  • 1、监控用户滑动事件,按页加载当前动画
  • 2、设计师侧优化(减少动画帧数,和动画数量)
  • 3、虚拟 DOM (react virtual dom)[https://swiperjs.com/api/#virtual] 减少页面的渲染压力;
  • 4、可视范围监控 (可视范围 开启动画 inview 显示)[https://github.com/bitmap/react-hook-inview]
  • 5、根据手机性能,优雅降级
    • (requestAnimationFrame)[http://zhangchen915.com/index.php/archives/675/]
    • window.performance
    • Frame API
    • react native 相关的可以获取更多手机信息做个别低端手机黑名单,完全禁止动画

7、实践

  • 1、2 可以在大部分场景实现,这里只讨论上诉 3,4,5 的可行性

7.3、虚拟 dom

7.4、使用 inview

  • 可视范围的监控这里主要使用了 Intersection Observer API
    • 其中这个 api 最主要使用了 Intersection Observer API 会注册一个回调函数,每当被监视的元素进入或者退出另外一个元素时(或者 viewport ),或者两个元素的相交部分大小发生变化时,该回调方法会被触发执行。这样,我们网站的主线程不需要再为了监听元素相交而辛苦劳作,浏览器会自行优化元素相交管理。
    • 解决了资源懒加载——当图片滚动到可见时才进行加载
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { useInView } from 'react-intersection-observer';
import Lottie from 'react-lottie';
import LOTTIE_ANIM_JSON from './lottie.json';

const Anim = ()=>{
  const { ref: $LOTTIE_ANIM_JSON_REF; View: $LOTTIE_ANIM_JSON_VIEW } = useInView();
  const $ANIM = (
    <Lottie
    options={{
      loop: true,
      autoplay: true,
      animationData: LOTTIE_ANIM_JSON,
    }}
    isPaused={!LOTTIE_ANIM_JSON_VIEW}
    />
    );

  return  <div className="lottie" ref={$LOTTIE_ANIM_JSON_REF}>
    {$ANIM}
  div>
}
复制代码

7.5、几种测算 web FPS 的方法

  • 7.5.1 requestAnimateFrame

基于 lottie 动画的原理特性充分的利用 requestAnimationframe 特性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
window.requestAnimationFrame(callback);
  • requestAnimateFrame 想必前端同学在做一些 js 动画的时候已经比较了解了;告诉浏览器您希望执行动画并请求浏览器调用指定的函数在下一次重绘之前更新动画;
  • 具体的实现如下,测算浏览器页面渲染的动画 FPS
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 处理兼容性问题
var rAF = function () {
    return (
        window.requestAnimationFrame ||
        window.webkitRequestAnimationFrame ||
        function (callback) {
            window.setTimeout(callback, 1000 / 60);
        }
    );
}();
 
var frame = 0;
var allFrameCount = 0;
var lastTime = Date.now();
var lastFameTime = Date.now();
 
var loop = function () {
    var now = Date.now();
    var fs = (now - lastFameTime);
    var fps = Math.round(1000 / fs);
 
    lastFameTime = now;
    // 不置 0,在动画的开头及结尾记录此值的差值算出 FPS
    allFrameCount++;
    frame++;
 
    if (now > 1000 + lastTime) {
        var fps = Math.round((frame * 1000) / (now - lastTime));
        console.log(`${new Date()} 1S内 FPS:`, fps); 
        frame = 0;
        lastTime = now;
    };
 
    rAF(loop);
}

loop();
复制代码

下面看看掘金主页的加载速度

  • 值得注意的是,这个方法计算的结果和真实的帧率肯定是存在误差的,因为它是将每两次主线程执行 javascript 的时间间隔当成一帧,而非上面说的主线程加合成线程所消耗的时间为一帧。但是对于现阶段而言,算是一种可取的方法。
  • 7.5.2 chrome 开发者工具
    • 控制台-> perfmance -> 刷新页面开启监控性能,然后就能看到 frames 这项性能指标(右上角有 fps 的帧率控制)
  • 7.5.3 Frame API
    • 什么是 Frame Timing API ?

Frame Timing API 是 Web Performance Timing API 标准中的其中一位成员。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- Web Performance Timing APIW3C 推出的一套性能 API 标准,用于帮助开发者对网站各方面的性能进行精确的分析与控制,提升 Web 网站性能。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var rendererEvents = window.performance.getEntriesByType("renderer");

// 下面可以看到 render 的时间
{
  sourceFrameNumber: 120,
  startTime: 1342.549374253
  cpuTime: 6.454313323
}

但是这个 api 还在试验阶段,各大浏览器都不支持所以只是暂时讨论和了解一下就可以了,不能正式的开发使用;

参考

邀请

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
前端监测浏览器渲染帧率fps
在前端性能优化中,尤其是动画绘制中,我们需要关注浏览器的渲染频率FPS(每秒传输帧数(Frames Per Second)),在Chrome浏览器上我们可以通过Performance 查看渲染Fps:
伯爵
2020/05/21
3.4K0
156. 精读《react-intersection-observer 源码》
IntersectionObserver 可以轻松判断元素是否可见,在之前的 精读《用 React 做按需渲染》 中介绍了原生 API 的方法,这次刚好看到其 React 封装版本 react-intersection-observer,让我们看一看 React 封装思路。
黄子毅
2022/03/14
1.1K0
【JS】1691- 重学 JavaScript API - Performance API
Performance API 提供了「访问和测量浏览器性能相关信息」的方法。通过 Performance API,开发人员可以获取关于「页面加载时间」、「资源加载性能」、「用户交互延迟」等方面的详细信息,以便进行性能分析和优化。
pingan8787
2023/09/01
5710
【JS】1691- 重学 JavaScript API - Performance API
lottie系列文章(二):lottie最佳实践
新建src/assets/lottie/文件夹,并将bodymovin_light.min.js文件和设计师给的动画json文件统一放到src/assets/lottie/文件夹中。
IMWeb前端团队
2019/12/03
5.5K0
盒子端 CSS 动画性能提升研究
不同于传统的 PC Web 或者是移动 WEB,在客厅盒子端,接大屏显示器下,许多能流畅运行于 PC 端、移动端的 Web 动画,受限于硬件水平,在盒子端的表现的往往不尽如人意。
dodott
2018/11/28
4280
盒子端 CSS 动画性能提升研究
不同于传统的 PC Web 或者是移动 WEB,在客厅盒子端,接大屏显示器下,许多能流畅运行于 PC 端、移动端的 Web 动画,受限于硬件水平,在盒子端的表现的往往不尽如人意。
w4979的博客
2020/06/01
6600
深度剖析Lottie动画原理
导语 本文主要挖掘、弄懂lottie动画背后的原理。lottie动画是如何让30FPS流畅运行? 动画原理 工作以来,处理过css、js、canvas、骨骼动画,这些背后的原理都是通过把每一帧(瞬间)的静止图像组合起来,以一定频率(速率)播放这些图像形成动画。 详细一点解析:动画可以拆分成每一帧,当前帧(静态)图像的属性数据或者形态(形状)的变更,把这样很多帧连贯起来,就形成动画。 lottie动画 原理其实也是这样。但为什么它能做到如此流畅,让众多用户,开发,设计师情有独钟。下面从几个方面对lottie
腾讯VTeam技术团队
2020/10/21
5.8K1
Lottie-页面动画100%硬核还原
被设计师折磨一顿后,大师兄找到了解决这个困境的方案。它就是今天的主角:Lottie
程序员老鱼
2022/12/02
1.1K0
【前端性能】Web 动画帧率(FPS)计算
我们知道,动画其实是由一帧一帧的图像构成的。有 Web 动画那么就会存在该动画在播放运行时的帧率。而帧率在不同设备不同情况下又是不一样的。 有的时候,一些复杂或者重要动画,我们需要实时监控它们的帧率,或者说是需要知道它们在不同设备的运行状况,从而更好的优化它们,本文就是介绍 Web 动画帧率(FPS)计算方法。 流畅动画的标准 首先,理清一些概念。FPS 表示的是每秒钟画面更新次数。我们平时所看到的连续画面都是由一幅幅静止画面组成的,每幅画面称为一帧,FPS 是描述“帧”变化速度的物理量。 理论上说,F
Sb_Coco
2018/05/28
1.6K0
Lottie与LottieFiles:快速为前端Web开发注入精美动画的利器
作者:watermelo37 涉及领域:Vue、SpingBoot、Docker、LLM、python等 --------------------------------------------------------------------- 温柔地对待温柔的人,包容的三观就是最大的温柔。 ---------------------------------------------------------------------
watermelo37
2025/03/11
1770
Lottie与LottieFiles:快速为前端Web开发注入精美动画的利器
从设计师和开发的角度使用 lottie
lottie 是一个可以轻易的给各种 native app 添加高质量动画的类库。可以在 iOS、Android 和 React Native 实时渲染 After Effects 动画,就像使用静态图片一样容易。上图即为 lottie 的 logo。
零式的天空
2022/03/28
3.4K0
从设计师和开发的角度使用 lottie
使用强大的 AirBnb Lottie 让你的 React APP 炫酷起来
Lottie 是 Airbnb 开发的一款能够为原生应用添加动画效果的开源工具。能够实时渲染 After Effects 动画特效。Lottie 目前提供了 iOS, Android, 和 React 版本。( https://airbnb.design/lottie/ )
前端修罗场
2022/07/29
2K0
使用强大的 AirBnb Lottie 让你的 React APP 炫酷起来
HarmonyOS 开发实践 —— 基于lottie的动画资源加载
lottie是一个适用于HarmonyOS的动画库,它可以解析json格式的动画,并在移动设备上进行本地渲染。
小帅聊鸿蒙
2024/12/18
2670
HarmonyOS 开发实践 —— 基于lottie的动画资源加载
bodymovin 的使用场景初步调研
本文主要介绍了bodymovin,包括它的使用场景、使用方法、事件、性能等方面,并分析了在低端android设备上的表现。
腾讯IVWEB团队
2017/07/10
3.9K0
bodymovin 的使用场景初步调研
lottie系列文章(一):lottie介绍
企鹅辅导是一款处于快速上升期的产品,目前在快速迭代中。作为一款K12青少年教育产品软件,动画对于吸引其用户注意力和提高用户体验有着重要的作用。特别是在目前开放了小学教育内容之后,动画能力的丰富和完善更是迫在眉睫。
IMWeb前端团队
2019/12/03
4.6K0
lottie系列文章(一):lottie介绍
盒子端 CSS 动画性能提升研究
对于 Web 动画的性能问题,仅仅停留在感觉已经优化的OK之上,是不够的,想要在盒子端跑出高性能接近 60 FPS 的流畅动画,就必须要刨根问底,深挖每一处可以提升的方法。
Sb_Coco
2018/01/15
2.3K9
盒子端 CSS 动画性能提升研究
聊一聊H5营销页面的性能优化
我来自机票BU,目前负责机票营销的业务开发,众所周知营销业务的普遍特点是:访问量很大。每次营销活动,对于不同角色的同学,关注的点也不一样。
前端森林
2022/12/10
1K0
聊一聊H5营销页面的性能优化
盒子端 CSS 动画性能提升研究
不同于传统的 PC Web 或者是移动 WEB,在腾讯视频客厅盒子端,接大屏显示器(电视)下,许多能流畅运行于 PC 端、移动端的 Web 动画,受限于硬件水平,在盒子端的表现的往往不尽如人意。 基于此,对于 Web 动画的性能问题,仅仅停留在感觉已经优化的OK之上,是不够的,想要在盒子端跑出高性能接近 60 FPS 的流畅动画,就必须要刨根问底,深挖每一处可以提升的方法。 流畅动画的标准 理论上说,FPS 越高,动画会越流畅,目前大多数设备的屏幕刷新率为 60 次/秒,所以通常来讲 FPS 为 60fra
Sb_Coco
2018/05/28
7610
又来了!实现微信 “炸屎”大作战
大家好,我是秋风,近日,微信又发布了新功能(更新到微信8.0.6)。最火热的非"炸屎"功能莫属了,各种群里纷纷玩起了炸屎的功能。
秋风的笔记
2021/07/09
1.4K0
Lottie在手,动画我有:ios/Android/Web三端复杂帧动画解决方案
本文编辑于OS X系统,之前出现过windows下看不到部分图片的情况,如有请大家告知
啦啦啦321
2019/09/29
3.6K0
Lottie在手,动画我有:ios/Android/Web三端复杂帧动画解决方案
推荐阅读
相关推荐
前端监测浏览器渲染帧率fps
更多 >
LV.0
这个人很懒,什么都没有留下~
作者相关精选
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验