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;
浙公网安备 33010602011771号