阅读大约需要 12-15 分钟, 主要简单介绍 lottie 动画概况和一些优化方案, 主要的优化方案针对React h5 的优化方案
lottie 是 Aribnb 开源一个主要面向 Web、iOS、Android、React Native、Windows 的动画库,可以实时渲染After Effects动画,并以Bodymovin作为json导出,允许应用程序像使用静态图像一样轻松使用动画,一款协同合作的高效软件。
简单来讲就是 UI 设计师用 AE 解析出 JSON 动画,前端工程师使用 JSON 文件在 lottie-web 等框架下进行 svg (canvas/html) 渲染
来看看 bodymovin 动画的渲染基本流程
registerAnimation
AnimationItem
的容器,把我们的节点element
和 animationData
json数据进行初始化animationData
设置基础值, 来确定数据来源并初始化数据,解析 svg/canvas/html 渲染方式function loadAnimation(params){
var animItem = new AnimationItem();
setupAnimation(animItem, null);
animItem.setParams(params);
return animItem;
}
复制代码
npm install react-lottie
import Lottie from "lottie-react";
import groovyWalkAnimation from "./groovyWalk.json";
const Example = () => {
return <Lottie animationData={groovyWalkAnimation} />;
};
export default Example;
复制代码
实现比较简单
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>
}
复制代码
基于 lottie 动画的原理特性充分的利用 requestAnimationframe 特性
window.requestAnimationFrame(callback);
requestAnimateFrame
想必前端同学在做一些 js 动画的时候已经比较了解了;告诉浏览器您希望执行动画并请求浏览器调用指定的函数在下一次重绘之前更新动画;
// 处理兼容性问题
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();
复制代码
下面看看掘金主页的加载速度
Frame Timing API 是 Web Performance Timing API 标准中的其中一位成员。
- Web Performance Timing API 是 W3C 推出的一套性能 API 标准,用于帮助开发者对网站各方面的性能进行精确的分析与控制,提升 Web 网站性能。
var rendererEvents = window.performance.getEntriesByType("renderer");
// 下面可以看到 render 的时间
{
sourceFrameNumber: 120,
startTime: 1342.549374253
cpuTime: 6.454313323
}
但是这个 api 还在试验阶段,各大浏览器都不支持所以只是暂时讨论和了解一下就可以了,不能正式的开发使用;