博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[js高手之路] html5新增的定时器requestAnimationFrame实战进度条
阅读量:6083 次
发布时间:2019-06-20

本文共 2620 字,大约阅读时间需要 8 分钟。

在requestAnimationFrame出现之前,我们一般都用setTimeout和setInterval,那么html5为什么新增一个requestAnimationFrame,他的出现是为了解决什么问题?

优势与特点:

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

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

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

一句话就是:这玩意性能高,不会卡屏,根据不同的浏览器自动调整帧率。如果看不懂或者不理解,也没有什么关系,这玩意跟浏览器渲染原理有关。我们先学会使用它!

如何使用requestAnimationFrame?

使用方式跟定时器setTimeout差不多,不同之处在于,他不需要设置时间间隔参数

1         var timer = requestAnimationFrame( function(){2             console.log( '定时器代码' );3         } );

参数是一个回调函数,返回值是一个整数,用来表示定时器的编号.

1  2  3  4     
5
6
7 Document 8 23 24 25 26 27 28
cancelAnimationFrame用来关闭定时器
这个方法需要处理兼容: 
 简单的兼容:
1 window.requestAnimFrame = (function(){2   return  window.requestAnimationFrame       ||3           window.webkitRequestAnimationFrame ||4           window.mozRequestAnimationFrame    ||5           function( callback ){6             window.setTimeout(callback, 1000 / 60);7           };8 })();

如果浏览器都不认识AnimationFrame,就用setTimeout兼容.

运用3种不同的定时器(setTimeout, setInterval, requestAnimationFrame)实现一个进度条的加载

一、setInterval方式:
1  2  3  4     
5
6
7 Document 8 19 46 47 48
0%
49

50 51

 

 

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <style> div{ width:0px; height:40px; border-radius:20px; background:#09f; text-align:center; font:bold 30px/40px '微软雅黑'; color:white; } </style> <script> window.onload = function(){ var oBtn = document.querySelector( "input" ), oBox = document.querySelector( "div" ), timer = null, curWidth = 0, getStyle = function( obj, name, value ){ if( obj.currentStyle ) { return obj.currentStyle[name]; }else { return getComputedStyle( obj, false )[name]; } }; oBtn.onclick = function(){ clearInterval( timer ); oBox.style.width = '0'; timer = setInterval( function(){ curWidth = parseInt( getStyle( oBox, 'width' ) ); if ( curWidth < 1000 ) { oBox.style.width = oBox.offsetWidth + 10 + 'px'; oBox.innerHTML = parseInt( getStyle( oBox, 'width' ) ) / 10 + '%'; }else { clearInterval( timer ); } }, 1000 / 60 ); } } </script> </head> <body> <div>0%</div> <p><input type="button" value="ready!Go"></p> </body> </html>
run code

二、setTimeout方式

1 

三、requestAnimationFrame方式

1  2  3  4     
5
6
7 Document 8 19 47 48 49
0%
50

51 52

转载地址:http://bukwa.baihongyu.com/

你可能感兴趣的文章
ios之UITextView
查看>>
ios之UITableView
查看>>
POJ2524 Ubiquitous Religions(并查集)
查看>>
写一个函数,实现去除字符串空格
查看>>
maven配置文件解析
查看>>
Quick-Cocos2d-x初学者游戏教程(四) --------------- 开发初探(添加背景,标题,动作,按钮)...
查看>>
「ubuntu」Ubuntu Recovery模式下只读问题
查看>>
使phongegap的程序纵向不滚动
查看>>
分布式文件系统HDFS 练习
查看>>
ElasticSearch之安装head插件
查看>>
mount命令详解
查看>>
Android四大组件应用系列——Activity与Service交互实现APK下载
查看>>
20145222黄亚奇《Java程序设计》第8周学习总结
查看>>
安装redis
查看>>
json.parse()和json.stringify()
查看>>
状态压缩DP SRM 667 Div1 OrderOfOperations 250
查看>>
简单几何(水)BestCoder Round #50 (div.2) 1002 Run
查看>>
Dockerfile Volume指令与docker -v的区别
查看>>
mysql20170404代码实现
查看>>
java基础01
查看>>