javascript中实现动画是setTimeout(递归)还是用setinterval好呢

之前,在研究js作用动画的东东,之前的做动画,的核心基本就是 setTimerout 和我们的 setInterval,但是现在的选择就比较多了可以使用我们的css3 还我们的html5的requestAnimationFrame。

所以,现在我来回到,做动画,setTimerout 和 setInterval 两种做法都不太好;

 requestAnimationFrame采用系统时间间隔,保持最佳绘制效率,不会因为间隔时间过短,造成过度绘制,增加开销;也不会因为间隔时间太长,使用动画卡顿不流畅,让各种网页动画效果能够有一个统一的刷新机制,从而节省系统资源,提高系统性能,改善视觉效果

requestAnimationFrame会把每一帧中的所有DOM操作集中起来,在一次重绘或回流中就完成,并且重绘或回流的时间间隔紧紧跟随浏览器的刷新频率

  【2】在隐藏或不可见的元素中,requestAnimationFrame将不会进行重绘或回流,这当然就意味着更少的CPU、GPU和内存使用量

  【3】requestAnimationFrame是由浏览器专门为动画提供的API,在运行时浏览器会自动优化方法的调用,并且如果页面不是激活状态下的话,动画会自动暂停,有效节省了CPU开销

下面我们就分别使用这三种方式来实现,一个进度条的功能滴呀;

requestAnimationFrame的用法与settimeout很相似,只是不需要设置时间间隔而已。requestAnimationFrame使用一个回调函数作为参数,这个回调函数会在浏览器重绘之前调用。它返回一个整数,表示定时器的编号,这个值可以传递给cancelAnimationFrame用于取消这个函数的执行

//基本用法;
//
// 就是你每次运行的针和路程是长度一直滴呀;
function showInfo(){console.log("infoq");
}var timer=requestAnimationFrame(showInfo);cancelAnimationFrame(timer);//这个是我们基本setInterval 时间设置;
var progressTimer;
var btn=document.getElementById("btn");
var obj=document.getElementById("fuck");
var speed=5;
btn.onclick=function (){clearInterval(progressTimer); //清零的时候,我们额长度也清零地呀;obj.style.width = '0';progressTimer=setInterval(function (){if(parseInt(obj.style.width)<500){ //直接这样做是误差的,我们在js的运中是有提高过滴呀;obj.style.width=parseInt(obj.style.width)+speed+'px';obj.innerHTML=parseInt(obj.style.width)/5+"%";}else{clearInterval(progressTimer);}},16)
}//在来看看我们的setTimeout的做法;var progressTimer1;
var speed=5;
var shitBtn=document.getElementById("shitBtn");
var shitObj=document.getElementById("shit");
shitBtn.onclick=function (){clearTimeout(progressTimer1);shitObj.style.width='0';progressTimer1=setTimeout(function fn(){//临界值;if(parseInt(shitObj.style.width)<500){shitObj.style.width=parseInt(shitObj.style.width)+speed+'px';shitObj.innerHTML=parseInt(shitObj.style.width)/5+"%";timer = setTimeout(fn,16); //这里我们进行重复调用抵押;}else{clearTimeout(progressTimer1) }},16)}//然后var timer;
var speed=5;
var gangBtn=document.getElementById("gangBtn");
var gangObj=document.getElementById("gang");
gangBtn.onclick = function(){gangObj.style.width = '0';cancelAnimationFrame(timer);timer = requestAnimationFrame(function fn(){if(parseInt(gangObj.style.width) < 500){gangObj.style.width = parseInt(gangObj.style.width) + 5 + 'px';gangObj.innerHTML =     parseInt(gangObj.style.width)/5 + '%';timer = requestAnimationFrame(fn);}else{cancelAnimationFrame(timer);}    });
}// 后面,我们要通过面向对象的方式,来进行改造滴啊;

结果图:

这里再给出JavaScript 高性能编程中的一些关于js动画的性能优化的建议,效果还是挺好的;

这里再提供一个链接,关于js动画运算的:

https://segmentfault.com/a/1190000002416071

转载于:https://www.cnblogs.com/mc67/p/5239592.html

javascript中实现动画是settimeout(递归)还是用setinterval好?相关推荐

  1. javascript中for循环和setTimeout同时使用,出现的问题

    javascript中for循环和setTimeout同时使用,出现的问题 for循环代码 <!DOCTYPE html> <html lang="en"> ...

  2. 一篇文章带你了解JavaScript中的函数表达式,递归,闭包,变量,this对象,模块作用域

    作者 | Jeskson 来源 | 达达前端小酒馆 定义函数的方式: 第一种为 函数声明: 第二种为 函数表达式. 语法: function functionName(arg0, arg1, arg2 ...

  3. 对象不支持属性或方法dbzz.html,JavaScript 中 setTimeout()的用法 ZZ

    第一篇 setTimeout()在js类中的使用方法 setTimeout (表达式,延时时间) setTimeout(表达式,交互时间) 延时时间/交互时间是以豪秒为单位的(1000ms=1s) s ...

  4. 原生JavaScript中动画与特效的实现原理

    现如今,许多页面上均有一些动画效果.适当的动画效果可以在一定程度上提高页面的美观度,具有提示效果的动画可以增强页面的易用性. 实现页面动画的途径一般有两种. 一种是通过操作JavaScript间接操作 ...

  5. javascript中setTimeout()函数

    javascript中setTimeout()函数 大家都知道javascript中的setTimeput()函数的作用,一般会用他来处理一些连续的事情,们先看一个例子: <head>   ...

  6. JavaScript中递归使用

    递归的概念 在程序中函数直接或间接调用自己 直接调用自己 简介调用自己 跳出结构,有了跳出才有结果 递归的思想 递归的调用,最终还是要转换为自己这个函数 如果有个函数foo,如果他是递归函数,到最后问 ...

  7. 递归javascript_使用freeCodeCamp挑战解释了JavaScript中的递归

    递归javascript In this article I will touch on a few important ideas to help you understand Recursion ...

  8. javascript中实例对象和构造函数关系、原型语法、原型链、call实现继承、apply调用函数、bind拷贝函数、拷贝继承、class类、super、严格模式、高阶函数、闭包、递归、es6简介

    实例对象和构造函数的关系及原型: 实例对象是通过构造函数创建出来的,实例对象的构造器constructor就是指向构造函数的:每个实例对象中的同一方法的指向是各不相同的,但是其属性值相同的属性可以相同 ...

  9. Javascript中递归造成的堆栈溢出及解决方案

    Javascript中递归造成的堆栈溢出及解决方案 参考文章: (1)Javascript中递归造成的堆栈溢出及解决方案 (2)https://www.cnblogs.com/cuew1987/p/4 ...

最新文章

  1. 这套完美的Java环境安装教程,完整,详细,清晰可观,让你一目了然,简单易懂。⊙﹏⊙...
  2. spark streaming 接收 kafka 数据java代码WordCount示例
  3. EDM营销之邮件投递篇
  4. java 打印日志log_java如何LOG打印出日志信息
  5. YEP共享平台释放宜人贷无限潜力
  6. C51单片机各种名词英文全称汇总
  7. 一轮项目冲刺——移山小分队(2)
  8. GDB 修改当前判断函数的返回值(即修改寄存器的值)的方法
  9. Linux Shell之一 Shell简介
  10. jQuery中this与$(this)区别
  11. java 判断 框架类型_第10章-验证框架 --- 验证器类型
  12. tail,more查看日志(定点和翻页)
  13. Android之Input子系统事件分发流程
  14. php array_walk和array_map区别
  15. “大雪无情,卡巴有情”,卡巴斯基赠送一年免费正版激活码
  16. MOSFET的特性曲线及特性方程
  17. 单片机计算机基础知识总结,自学单片机第九篇:基础知识--计算机基础操作
  18. 实现网上购物系统的后台管理(增、删、改、查图书)。
  19. 【Linux常用服务器配置——Samba服务】
  20. 信泰人寿总裁谭宁:中小险企发展一定要顺应市场变化

热门文章

  1. asp.net控件全部清空、全部启用、全部禁用方法
  2. c语言上机实验作业答案,第十二次C语言上机实验参考答案
  3. 如何快速调出软键盘_*小星推荐*—如何快速的制作模具3D装配档
  4. 3. 吴恩达机器学习课程-作业3-多分类和神经网络
  5. vue使用ajax库,Vue 中使用Ajax请求
  6. 移植笔记——【MCU程序移植注意事项】
  7. C语言:对包含10个整数的数组进行如下的操作,从下标为0的元素开始到最后一个元素,依次向前移动一个位置。
  8. hive获取本周第几天
  9. presto cube等复杂聚合函数
  10. 【手把手教你全文检索】Lucene索引的【增、删、改、查】