js动画效果_js动画函数

js动画效果_js动画函数一、setTimeoutVS.requestAnimationFrame传统js动画实现一般使用setTimeout/setInterval等定时方式执行一个动画更新操作,但这种方式在使用中存在一些问题。动画帧间隔interval问题大部分显示器的刷新频率是16.7ms,如果setTimeout的interval小于这个值,就会出现绘制的帧无法在显示器上展现的问题,好像被吞掉了一样。另

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

一、setTimeout VS. requestAnimationFrame

传统js动画实现一般使用setTimeout/setInterval等定时方式执行一个动画更新操作,但这种方式在使用中存在一些问题。

  1. 动画帧间隔interval问题
    大部分显示器的刷新频率是16.7ms,如果setTimeout的interval小于这个值,就会出现绘制的帧无法在显示器上展现的问题,好像被吞掉了一样。
    另外,各个显示器的刷新频率不同,也使得一套代码无法自适应不同频率,难以对动画效果最优化。

  2. 页面不可见时继续执行,浪费资源、电量

而requestAnimationFrame则可以解决这些问题:

  1. 浏览器自动根据当前显示器刷新频率来设置动画每帧的间隔时间interval。例如,显示器是10ms,则interval就是10ms;如果是16.7ms,则interval自动是16.7ms

  2. 浏览器优化动画绘制
    浏览器可以合并requestAnimationFrame的动画操作、CSS动画、CSS变换等各种动画效果到一次渲染周期中完成。并且在页面不可见时,可以选择不进行动画渲染的执行(似乎是暂停动画),节约资源、电量。

二、使用requestAnimationFrame

代码使用上,requestAnimationFrame和setTimeout很相似。

    function renderFrame() { 
   
        // do something
    }

    // setTimeout / setInterval
    var handler = setTimeout(renderFrame, 100);

    // requestAnimationFrame
    var hanlder = requestAnimationFrame(renderFrame);

从上面可以看出,两者的差别在于是否指定interval的值。

三、浏览器兼容性

目前,有些低版本浏览器不支持requestAnimationFrame,这种情况下为了进行兼容,还是需要使用setTimeout/setInterval来实现动画。另外,各厂商浏览器中requestFrameAnimation的名称也有差别,所以可以使用下面的最简单的方法,来进行兼容。

window.requestAnimFrame = (function() {
  return  window.requestAnimationFrame       ||
          window.webkitRequestAnimationFrame ||
          window.mozRequestAnimationFrame    ||
          function( callback ){
            window.setTimeout(callback, 1000 / 60);
          };
})();

如果想更保险,可以参考Opera浏览器的技术师Erik Möller的封装

(function() { var lastTime = 0; var vendors = ['webkit', 'moz']; for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { 
      window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame']; window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame'] || window[vendors[x]+'CancelRequestAnimationFrame']; } if (!window.requestAnimationFrame) window.requestAnimationFrame = function(callback, element) { var currTime = new Date().getTime(); var timeToCall = Math.max(0, 16 - (currTime - lastTime)); var id = window.setTimeout(function() { callback(currTime + timeToCall); }, timeToCall); lastTime = currTime + timeToCall; return id; }; if (!window.cancelAnimationFrame) window.cancelAnimationFrame = function(id) { clearTimeout(id); }; }());

在这里,代码判断了是使用4ms还是16ms的延迟,来最佳匹配60fps。同时还支持cancel方法。

参考资料

  1. https://developer.mozilla.org/zh-CN/docs/Web/API/Window/requestAnimationFrame
  2. http://www.zhangxinxu.com/wordpress/2013/09/css3-animation-requestanimationframe-tween-%E5%8A%A8%E7%94%BB%E7%AE%97%E6%B3%95/
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/181811.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 机器人手眼标定详解

    机器人手眼标定详解手眼标定详解研究现状所谓手眼标定是统一视觉系统和机器人的坐标系,从而可以使视觉系统所确定的物体位姿可以转换到机器人坐标系下,由机械臂完成对物体的作业。最常见的手眼系统包括Eye-to-Hand和Eye-in-Hand两种。在Eye-to-Hand手眼系统中,摄像机与机器人基座的位置是相对固定的,手眼关系式求解摄像机坐标系与机器人基座坐标系之间的转换关系。在Eye-in-Hand手眼系统中,摄像机由于固定在机械臂末端,手眼关系求解的是摄像机坐标系与机械臂末端坐标系之间的转换关系。在机器人处于不同的位置和

    2022年5月2日
  • at中文_the controller has detected a

    at中文_the controller has detected aConstructing Objects at Run Time

    2022年4月21日
  • 菲尼克斯电源模块的安装

    菲尼克斯电源模块的安装这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML图表FLowchart流程图导出与导入导出导入菲尼克斯电源模块的安装QUINT4-PS/1AC/24DC/101.安全规范和安装注意事项警告:电击危险!仅有具备从

    2022年6月22日
  • msdos分区是什么_msdos_partition

    msdos分区是什么_msdos_partition硬盘分区及格式化本例要求熟悉硬盘分区结构,使用fdisk分区工具在磁盘/dev/vdb上按以下要求建立分区:采用默认的msdos分区模式1、第1个分区/dev/vdb1的大小为200MiB2、第2个分区/dev/vdb2的大小为2000MiB3、第3个分区/dev/vdb3的大小为1000MiB,完成分区后4、能够配置开机自动挂载/dev/vdb2分区…

    2022年8月11日
  • G1 收集器调优

    G1 收集器调优翻译:http://www.oracle.com/technetwork/articles/java/g1gc-1984535.html  学习如何适配、调优G1gc以用于评估、分析和性能优化。     G1收集器是用于hotspotJVM的低停顿、适合服务器的分代垃圾收集器。G1GC使用并发和并行阶段来获得目标停顿时间和维持优秀的吞吐量。当G1G

    2022年5月5日
  • 安卓数据转移到iphone很慢_iphone数据迁移中断怎么继续

    安卓数据转移到iphone很慢_iphone数据迁移中断怎么继续如果你刚刚从安卓手机换了新的iPhone或者其他iOS设备,可以按照下面的步骤将数据转移到新设备,实现“无缝”过渡。准备工作在安卓手机上下载安装“转移到iOS”应用,打开安卓设备上的WiFi,并将新iOS设备和安卓设备都插入电源。转移需要在iPhone激活并设置新iOS设备过程进行,如果你已经激活,需要进入“设置”>“通用”>“还原”,然后选择“抹掉所有内容和设…

    2022年9月18日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号