蜀剑修

时光荏苒,岁月如歌

导航

requestAnimationFrame

 1 (function() {
 2     var lastTime = 0;
 3     var vendors = ['webkit', 'moz'];
 4     for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
 5         window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];
 6         window.cancelAnimationFrame =
 7           window[vendors[x]+'CancelAnimationFrame'] || window[vendors[x]+'CancelRequestAnimationFrame'];
 8     }
 9 
10     if (!window.requestAnimationFrame)
11         window.requestAnimationFrame = function(callback, element) {
12             var currTime = new Date().getTime();
13             var timeToCall = Math.max(0, 16 - (currTime - lastTime));
14             var id = window.setTimeout(function() { callback(currTime + timeToCall); },
15               timeToCall);
16             lastTime = currTime + timeToCall;
17             return id;
18         };
19 
20     if (!window.cancelAnimationFrame)
21         window.cancelAnimationFrame = function(id) {
22             clearTimeout(id);
23         };
24 }());

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

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

 1 var lastTime = 0;
 2 var prefixes = 'webkit moz ms o'.split(' '); //各浏览器前缀
 3 
 4 var requestAnimationFrame = window.requestAnimationFrame;
 5 var cancelAnimationFrame = window.cancelAnimationFrame;
 6 
 7 var prefix;
 8 //通过遍历各浏览器前缀,来得到requestAnimationFrame和cancelAnimationFrame在当前浏览器的实现形式
 9 for( var i = 0; i < prefixes.length; i++ ) {
10     if ( requestAnimationFrame && cancelAnimationFrame ) {
11       break;
12     }
13     prefix = prefixes[i];
14     requestAnimationFrame = requestAnimationFrame || window[ prefix + 'RequestAnimationFrame' ];
15     cancelAnimationFrame  = cancelAnimationFrame  || window[ prefix + 'CancelAnimationFrame' ] || window[ prefix + 'CancelRequestAnimationFrame' ];
16 }
17 
18 //如果当前浏览器不支持requestAnimationFrame和cancelAnimationFrame,则会退到setTimeout
19 if ( !requestAnimationFrame || !cancelAnimationFrame ) {
20     requestAnimationFrame = function( callback, element ) {
21       var currTime = new Date().getTime();
22       //为了使setTimteout的尽可能的接近每秒60帧的效果
23       var timeToCall = Math.max( 0, 16 - ( currTime - lastTime ) ); 
24       var id = window.setTimeout( function() {
25         callback( currTime + timeToCall );
26       }, timeToCall );
27       lastTime = currTime + timeToCall;
28       return id;
29     };
30     
31     cancelAnimationFrame = function( id ) {
32       window.clearTimeout( id );
33     };
34 }
35 
36 //得到兼容各浏览器的API
37 window.requestAnimationFrame = requestAnimationFrame; 
38 window.cancelAnimationFrame = cancelAnimationFrame;

 

posted on 2016-06-06 20:51  蜀剑修  阅读(243)  评论(0)    收藏  举报