javascript中实现动画是settimeout(递归)还是用setinterval好?
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好?相关推荐
- javascript中for循环和setTimeout同时使用,出现的问题
javascript中for循环和setTimeout同时使用,出现的问题 for循环代码 <!DOCTYPE html> <html lang="en"> ...
- 一篇文章带你了解JavaScript中的函数表达式,递归,闭包,变量,this对象,模块作用域
作者 | Jeskson 来源 | 达达前端小酒馆 定义函数的方式: 第一种为 函数声明: 第二种为 函数表达式. 语法: function functionName(arg0, arg1, arg2 ...
- 对象不支持属性或方法dbzz.html,JavaScript 中 setTimeout()的用法 ZZ
第一篇 setTimeout()在js类中的使用方法 setTimeout (表达式,延时时间) setTimeout(表达式,交互时间) 延时时间/交互时间是以豪秒为单位的(1000ms=1s) s ...
- 原生JavaScript中动画与特效的实现原理
现如今,许多页面上均有一些动画效果.适当的动画效果可以在一定程度上提高页面的美观度,具有提示效果的动画可以增强页面的易用性. 实现页面动画的途径一般有两种. 一种是通过操作JavaScript间接操作 ...
- javascript中setTimeout()函数
javascript中setTimeout()函数 大家都知道javascript中的setTimeput()函数的作用,一般会用他来处理一些连续的事情,们先看一个例子: <head> ...
- JavaScript中递归使用
递归的概念 在程序中函数直接或间接调用自己 直接调用自己 简介调用自己 跳出结构,有了跳出才有结果 递归的思想 递归的调用,最终还是要转换为自己这个函数 如果有个函数foo,如果他是递归函数,到最后问 ...
- 递归javascript_使用freeCodeCamp挑战解释了JavaScript中的递归
递归javascript In this article I will touch on a few important ideas to help you understand Recursion ...
- javascript中实例对象和构造函数关系、原型语法、原型链、call实现继承、apply调用函数、bind拷贝函数、拷贝继承、class类、super、严格模式、高阶函数、闭包、递归、es6简介
实例对象和构造函数的关系及原型: 实例对象是通过构造函数创建出来的,实例对象的构造器constructor就是指向构造函数的:每个实例对象中的同一方法的指向是各不相同的,但是其属性值相同的属性可以相同 ...
- Javascript中递归造成的堆栈溢出及解决方案
Javascript中递归造成的堆栈溢出及解决方案 参考文章: (1)Javascript中递归造成的堆栈溢出及解决方案 (2)https://www.cnblogs.com/cuew1987/p/4 ...
最新文章
- 这套完美的Java环境安装教程,完整,详细,清晰可观,让你一目了然,简单易懂。⊙﹏⊙...
- spark streaming 接收 kafka 数据java代码WordCount示例
- EDM营销之邮件投递篇
- java 打印日志log_java如何LOG打印出日志信息
- YEP共享平台释放宜人贷无限潜力
- C51单片机各种名词英文全称汇总
- 一轮项目冲刺——移山小分队(2)
- GDB 修改当前判断函数的返回值(即修改寄存器的值)的方法
- Linux Shell之一 Shell简介
- jQuery中this与$(this)区别
- java 判断 框架类型_第10章-验证框架 --- 验证器类型
- tail,more查看日志(定点和翻页)
- Android之Input子系统事件分发流程
- php array_walk和array_map区别
- “大雪无情,卡巴有情”,卡巴斯基赠送一年免费正版激活码
- MOSFET的特性曲线及特性方程
- 单片机计算机基础知识总结,自学单片机第九篇:基础知识--计算机基础操作
- 实现网上购物系统的后台管理(增、删、改、查图书)。
- 【Linux常用服务器配置——Samba服务】
- 信泰人寿总裁谭宁:中小险企发展一定要顺应市场变化
热门文章
- asp.net控件全部清空、全部启用、全部禁用方法
- c语言上机实验作业答案,第十二次C语言上机实验参考答案
- 如何快速调出软键盘_*小星推荐*—如何快速的制作模具3D装配档
- 3. 吴恩达机器学习课程-作业3-多分类和神经网络
- vue使用ajax库,Vue 中使用Ajax请求
- 移植笔记——【MCU程序移植注意事项】
- C语言:对包含10个整数的数组进行如下的操作,从下标为0的元素开始到最后一个元素,依次向前移动一个位置。
- hive获取本周第几天
- presto cube等复杂聚合函数
- 【手把手教你全文检索】Lucene索引的【增、删、改、查】