位置: IT常识 - 正文

前端动画实现以及原理浅析(前端动画库)

编辑:rootadmin
背景 如今的前端是一个涉猎领域很广的职业。作为一名前端,我们不仅要开发管理系统、数据中台、还要应对年报开发、节日活动等场景。不仅要会增删改查,编写表单,还要具备开发动画、H5 游戏等能力。能做出很 Cool 的动画效果,也是一种前端特有的成就感。所以,我们从动画的实现方法入手,了解浏览器的渲染,以及 ... 背景

推荐整理分享前端动画实现以及原理浅析(前端动画库),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:前端酷炫动画,前端 入门 动画 canvas,前端动画库,前端动画引擎,前端动画库,前端动画引擎,前端动画制作,前端动画制作,内容如对您有帮助,希望把文章链接给更多的朋友!

如今的前端是一个涉猎领域很广的职业。作为一名前端,我们不仅要开发管理系统、数据中台、还要应对年报开发、节日活动等场景。不仅要会增删改查,编写表单,还要具备开发动画、H5 游戏等能力。能做出很 Cool 的动画效果,也是一种前端特有的成就感。所以,我们从动画的实现方法入手,了解浏览器的渲染,以及如何提升动画的性能。

我们先来看 2 个 H5 案例 :【一镜到底】

<->手机扫码体验

【年报】

【其他 H5 优秀案例】https://www.h5anli.com

第一部分 常见的动画实现手段1.1 gif 实现

定义:GIF 文件的数据是一种基于 LZW 算法的连续色调的无损压缩格式,gif 格式的特点是一个 gif 文件可以存多幅彩色图像,当数据逐幅读出并展示都在屏幕上,就可以构成一个简单的动画。最高支持 256 种颜色。由于这种特性,GIF 比较适用于色彩较少的图片,比如页面卡通 icon、标志等等。

使用:

![file](https://www.yuucn.com/wp-content/uploads/2022/08/1660320389-6446d860dbbfe54.png)

优点:1.制作的成本很低;2.兼容性好;3.方便开发使用。

缺点:1.画质上:色彩支持少,图像毛边严重;2.交互上:不能控制动画的播放暂停,没有灵活性;3.大小上:由于是无损压缩,每帧被完整的保存下来,导致文件很大。

1.2 css3 补帧动画1.2.1 transition 过渡动画

使用:

.box { border: 1px solid black; width: 100px; height: 100px; background-color: #0000ff; transition: width 2s, height 2s, background-color 2s, transform 2s;}.box:hover { background-color: #ffcccc; width: 200px; height: 200px; transform: rotate(180deg);}

场景:

常与 :hover, :active 等伪类使用,实现相应等动画效果。

1.2.2 animation 关键帧动画

使用:

.bounce1 { left: -40px; animation: bouncy1 1.5s infinite;}.bounce2 { left: 0; animation: bouncy2 1.5s infinite;}.bounce3 { left: 40px; animation: bouncy3 1.5s infinite;}@keyframes bouncy1 { 0% { transform: translate(0px, 0px) rotate(0deg); } 50% { transform: translate(0px, 0px) rotate(180deg); } 100% { transform: translate(40px, 0px) rotate(-180deg); }}

场景:比如:loading 展示,代码如上。

优点:1、无需每一帧都被记录,通过关键帧设置,方便开发;2.实现简单,通常 UI 可以直接给到 css 文件,前端只需要导入即可【移动端注意屏幕适配】。

缺点:1.css 没法动画交互,无法得知当前动画执行阶段;2.transition: 需要触发,无法自动播放;3.animation 兼容性需要加前缀,导致代码量成倍增长;4.对于复杂动画的实现,导入的 css 文件过大,影响页面的渲染树生成,从而阻塞渲染。比如实现一个摇钱树的效果,css 文件达到百 kb,就要采取一些必要的压缩手段,缩减文件大小。

1.3 js 逐帧动画

JS 动画的原理是通过 setTimeout 或 requestAnimationFrame 方法绘制动画帧,从而动态地改变网页中图形的显示属性(如 DOM 样式,canvas 位图数据,SVG 对象属性等),进而达到动画的目的。

demo1:------- js 实现一个正方形从左到右的移动动画 -----

setTimeout 实现const element2 = document.getElementById('raf2');const btn2 = document.getElementById('btn2');let i = 0;let timerId;function move () { element2.style.marginLeft = i + 'px' timerId = setTimeout(move, 0) i++; if (i > 200) { clearTimeout(timerId) }}btn2.addEventListener('click',function () { move()})requestAnimationFrame 实现const element = document.getElementById('raf');const btn1 = document.getElementById('btn1');let r = 0;let rafId;function step () { element1.style.marginLeft = r+ 'px'; rafId = window.requestAnimationFrame(step); r++; if (r > 200) { // 在两秒后停止动画 cancelAnimationFrame(rafId); }}btn1.addEventListener('click', function () { step();})

可以看出,实现的方式都是控制 dom 的 margin-left 样式,执行动画。

问题 1.1:demo1 中看出 setTimeout 的执行很快。这是为什么呢?请接着往后看~

第二部分 浏览器如何渲染与动画的渲染2.1 浏览器的帧原理

问题 2:当 url 输入到一个页面展示出来经过了哪些过程?

这里我们忽略 http 请求静态文件之前的步骤,着重看浏览器渲染帧是怎么做的,从而找到浏览器是如何渲染动画的。

借助 chrome-performance【执行 raf.html】 同样可以看出上图不同阶段在 performance 里面的标注。⚠️注意:不是每帧都总是会经过管道每个部分的处理。实际上,不管是使用 JavaScript、CSS 还是网络动画,在实现视觉变化时,管道帧对指定帧的运行通常有三种方式:

【以下截图是以时间线为主轴,进行绘制】

-当修改一些会触发 layout 的属性,则会导致后面的同样被更新。

当修改只改变 paint 的属性, 则不会重新 layout。

如果改一些不涉及布局也不涉及重绘的数据,则可以直接进行合成渲染。

像 CSS 属性具体可以查询这个网站 ,去查阅哪些属性会引起怎样的帧管道:https://csstriggers.com/

例如:transform 变换,它是一个不会触发布局与绘制的变化的,所以使用它的时候,直接进入第三种状态,在合成之后,直接进入 Composite 阶段,是一个很好的优化手段。

前端动画实现以及原理浅析(前端动画库)

问题 3: 控制台上显示出 requestAnimationFrame(rAF)的执行,那么这个 rAF 执行与浏览器帧有什么关系呢?我们接着往下看。

2.2 requestAnimationFrame 执行

我们还是运行 demo1 的代码:

可以看到 rAF 执行在 layout 与 paint 之前,在每帧只执行了一次 rAF,调用回调函数执行动画。

从 rAF 的执行时机,可以看出 setTimeout 的执行时机与 rAF 的不同。

我们通过对不同方式实现方块移动动画的 performance 抓取,可以看到:

setTimeout 单位帧截图:

rAF 单位帧截图:

对比两者可以看出,在 16.7ms 的时间里,seTimeout 执行了 4 次,导致此时设置的 marginLeft 和上一次渲染前 marginLeft 的差值要大于 1px 的。

而 raf 可以看出 marginLeft 和上一次渲染前 marginLeft 的差值要等于 1px 的。

从 rAf 的性能,可以看出 setTimeout 的性能会较差一点

那么如果 JS 执行的时间过长,导致在本该绘制一帧的时候,没有绘制,延迟到下一帧的执行绘制的时候,就会造成动画的卡顿。【这里可以跳到第三部分性能问题,就知道直观的看到卡顿】

从而可以总结出:

1.setTimeout 时间不准确,因为他的执行取决于主线程执行的时间。

2.如果计时器频率高于浏览器刷新的频率,即使代码执行了,浏览器没有刷新,也是没有显示的,出现掉帧情况,不流畅。

而 raf 解决了 setTimeout 动画带来的问题:

1.浏览器刷新屏幕时自动执行,无需设置时间间隔和 setTimeout 一样是 n 毫秒之后再执行,但这个 n 毫秒,自动设置成浏览器刷新频率,浏览器刷新一次,执行一次,不需要手动设置;浏览器不刷新,就不执行,没有排队掉帧的情况。

2.高频函数节流对于 resize、scroll 高频触发事件来说,使用 requestAnimationFrame 可以保证在每个绘制区间内,函数只被执行一次,节省函数执行的开销。如果使用 setTimeout、setInterval 可能会在浏览器刷新间隔中有无用的回调函数调用,浪费资源。

第三部分 性能分析以及高效能的动画3.1 性能分析

通过 chrome-performance 可以看整体的 fps、GPU 的情况,也可以逐帧去分析影响 scripting\rendering\painting 时间的因素,从而有针对性的提高动画的性能。

demo3:----- 小方块的上下运动 -----

demo 的在线地址:https://googlechrome.github.io/devtools-samples/jank/

源码截图:

未优化【每个方块都需要强制 layout 去计算 position】:

点击 Optimize 按钮优化后【只读一次,并存在 pos 变量中】:

再次优化【添加 transform:translateZ(0),提高层级】:

以上就是一个动画逐步优化的小案例:具体操作可以查看原文:https://developer.chrome.com/docs/devtools/evaluate-performance/

3.2 如何优化动画性能

根据上文的渲染机制的讨论,我们可以看出,影响动画渲染的因素就是帧管道所经历的各个阶段,从中我们可以总结一些用来优化动画性能的手段:

提升每一帧的性能避免频繁的重排避免大面积的重绘优化 JS 的性能fps 稳定,避免掉帧,跳帧的情况不在连续动画中,添加高耗能的操作如果无法避免,看可以在动画的开头或者结尾进行操作开启 GUP 加速第四部分 常用的动画库

综上的实现方式可以支持部分的动画开发,比如点击交互,轮播器、以及纯动画的展示,比如摇钱树、烟花等。

如果需要强交互,或者是需要一个重力世界的时候,原生 JS 的实现相对于困难。可以利用一些动画库,来进行开发,这些动画基于 canvas 与 webGL 实现的。

Pixi.js添加场景添加玩家添加自身动作添加交互

phaser.js物理系统、重力系统可以模仿下落状态

其他:create.js、three.js 3d 渲染、layaAir、Egret 3d 游戏引擎等,可以根据不同的场景需要,选择不同的框架使用。

总结动画的实现手段

浏览器渲染的简单流程

开发动画分析性能参考 performance 的使用鸣谢

非常感谢木杪、千寻对本文的校正与建议,同时感谢琉易、霜序等伙伴在业务产品技术上帮助与支持。

本文链接地址:https://www.jiuchutong.com/zhishi/312017.html 转载请保留说明!

上一篇:phpcms怎么更改后台登录地址(php网站修改)

下一篇:Python中的线程和多线程是什么(python线程和协程)

  • 微信如何从相册添加单个表情包(微信如何从相册发原图)

    微信如何从相册添加单个表情包(微信如何从相册发原图)

  • 海康威视录像机怎么恢复出厂设置(海康威视录像机网络配置)

    海康威视录像机怎么恢复出厂设置(海康威视录像机网络配置)

  • 荣耀30s有耳机孔吗(荣耀30s耳机孔和充电孔是一个吗)

    荣耀30s有耳机孔吗(荣耀30s耳机孔和充电孔是一个吗)

  • 小米手机怎么找到隐藏应用(小米手机怎么找私密相册)

    小米手机怎么找到隐藏应用(小米手机怎么找私密相册)

  • 手机弯曲怎么恢复平直(手机弯曲怎么恢复正常)

    手机弯曲怎么恢复平直(手机弯曲怎么恢复正常)

  • 夏普打印机h3代码消除(夏普打印机h4-01)

    夏普打印机h3代码消除(夏普打印机h4-01)

  • 输入网络凭据是什么(输入网络凭据是因为共享文件设置了密码吗)

    输入网络凭据是什么(输入网络凭据是因为共享文件设置了密码吗)

  • 申请微信号怎么申请(申请微信号怎么做)

    申请微信号怎么申请(申请微信号怎么做)

  • 双清和恢复出厂设置有区别吗(双清和恢复出厂的区别)

    双清和恢复出厂设置有区别吗(双清和恢复出厂的区别)

  • 微信清空聊天记录对方能看到吗(微信清空聊天记录是清理内存吗)

    微信清空聊天记录对方能看到吗(微信清空聊天记录是清理内存吗)

  • 笔记本机械硬盘和台式一样吗(笔记本机械硬盘突然消失只剩固态)

    笔记本机械硬盘和台式一样吗(笔记本机械硬盘突然消失只剩固态)

  • 红米k30pro和小米10的区别(红米k30pro和小米11青春版哪个好)

    红米k30pro和小米10的区别(红米k30pro和小米11青春版哪个好)

  • flash测试影片的快捷键是什么(flash测试影片的方法有哪些)

    flash测试影片的快捷键是什么(flash测试影片的方法有哪些)

  • photo shop是什么软件(photoo shop)

    photo shop是什么软件(photoo shop)

  • 小米手机传送门是什么功能

    小米手机传送门是什么功能

  • 怎样在电脑上下载excel软件(怎样在电脑上下载谷歌浏览器并安装)

    怎样在电脑上下载excel软件(怎样在电脑上下载谷歌浏览器并安装)

  • 手机触屏的原理(手机触屏的原理李永乐)

    手机触屏的原理(手机触屏的原理李永乐)

  • 怎样把快手视频存本地(怎样把快手视频保存到相册)

    怎样把快手视频存本地(怎样把快手视频保存到相册)

  • 抖音撤回消息对方有显示吗(抖音撤回消息对方有提示吗)

    抖音撤回消息对方有显示吗(抖音撤回消息对方有提示吗)

  • xr长多少厘米(xr长多少cm)

    xr长多少厘米(xr长多少cm)

  • 金正音响蓝牙在哪里(金正手提蓝牙音响使用说明书)

    金正音响蓝牙在哪里(金正手提蓝牙音响使用说明书)

  • 京东申请退款怎么撤销(京东申请退款怎么修改金额)

    京东申请退款怎么撤销(京东申请退款怎么修改金额)

  • 抖音没有浏览量怎么回事(抖音没有浏览量的视频要删除吗)

    抖音没有浏览量怎么回事(抖音没有浏览量的视频要删除吗)

  • 华为mate30pro分辨率(华为mate30pro分辨率怎么调)

    华为mate30pro分辨率(华为mate30pro分辨率怎么调)

  • 怎么把视频剪掉一部分(怎么把视频剪掉一块)

    怎么把视频剪掉一部分(怎么把视频剪掉一块)

  • oppor9闪充多少w(oppor9s闪充是多少w)

    oppor9闪充多少w(oppor9s闪充是多少w)

  • emlaloo是什么型号(em la l 00)

    emlaloo是什么型号(em la l 00)

  • 苹果手机爱思助手卸载了怎么恢复(苹果手机爱思助手验机准确吗)

    苹果手机爱思助手卸载了怎么恢复(苹果手机爱思助手验机准确吗)

  • 非营利组织免税资格认定申请表
  • 实验耗材计入什么科目
  • 印花税的计税依据为各种应税凭证上所记载的计税金额
  • 增值税发票选择确认平台勾选注意事项
  • 纳税人销售自产门窗并负责安装
  • 员工一次性伤残补助金
  • 购买折让
  • 银行承兑汇票到期日后多久可以承兑
  • 应收账款增值税专用发票
  • 公司的钱转到个人账户用途写什么
  • 未开票收入结转成本年利润怎么算
  • 退回以前年度费用怎么做帐
  • 收购农产品销售会计分录怎么写
  • 油品沥青消费税征收范围
  • 免征增值税和附加税区别
  • 财税〔2017〕39号
  • 个人所得税成本费用包括哪些
  • 单位给员工交社保怎么交怎么计算
  • 增资有哪些途径
  • 贷款减值损失的计提规则
  • 设备升级改造如何开发票
  • 个人部分公积金可以抵扣个税吗
  • 六税两费减半会延期吗
  • 专项储备通俗理解
  • 新买的电脑如何激活windows
  • 系统安装的步骤
  • sudo命令无法执行
  • 企业注销时无力缴纳社保
  • 息税前利润和税前净利润的关系
  • 现金解款单怎么读
  • 潘塔纳尔湿地位于巴拉圭盆地
  • 企业销售折扣在计征所得税时如何处理
  • 工程结算结算gbq文件怎么做
  • 知识图谱ui
  • 毕业设计教程
  • yolov5画框重复、大框包小框问题解决,c++、python代码调用onnx
  • yum命令详解
  • 工程没结算能否竣工验收
  • dd命令拷贝磁盘
  • 生产企业出口退税政策
  • 支付版权费用账号是什么
  • 以前年度收入如何调账
  • 企业接受捐赠怎么入账
  • 公司活动举办属于哪个部门
  • 个人向企业借贷违法吗
  • 小企业销售收入分录
  • 未分配利润为负数可以分红吗
  • 提取维简费分录
  • 建安企业用什么会计制度
  • 信用减值损失和公允价值变动的区别
  • 费用分摊怎么开口说好
  • 什么是投资性房地产具体包括哪些内容
  • sqlserver响应好慢
  • win8键盘f1到f12取消按fn
  • 修改windows host文件
  • win10 server2008
  • linux系统中可用于添加用户账号
  • iTunesHelper.exe是什么进程?iTunesHelper.exe系统错误怎么解决?
  • unins000.exe - unins000是什么意思
  • windows不能打开此文件result:31
  • win10edge浏览器如何切换到ie
  • centos查看inode
  • 电脑超频以后变得很卡
  • win8系统怎么直接进入桌面
  • win10web服务器在哪打开
  • window10 蓝牙鼠标
  • win7怎样解除无线连接限制
  • nodejs require原理
  • insmod: init_module 'hello.ko' failed (Exec format error)
  • 文件夹怎么变成
  • Javascript Global对象
  • javascript教程chm
  • 12366纳税服务平台人工时间
  • 上海市个人所得税计算
  • 余额宝出现问题怎么办?
  • 上海税务ca证书更新
  • 税局实地调查准备什么
  • 合伙企业取得的专利权属于合伙企业财产吗
  • 纳税人销售免征增值税
  • 国税车购税征收标准
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设