requestAnimationFrame

前段时间知道一个新的定时器requestAnimatinFrame,这是HTML5新增的定时器requestAnimationFrame。requestAnimationFrame是由浏览器专门为动画提供的API,在运行时浏览器会自动优化方法的调用,并且如果页面不是激活状态下的话,动画会自动暂停,有效节省了CPU开销。

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

首先来说说兼容性

兼容性:

requestID = window.requestAnimationFrame(callback);       // Firefox 23 / IE10 / Chrome / Safari 7 (incl. iOS)
requestID = window.mozRequestAnimationFrame(callback);           // Firefox < 23
requestID = window.webkitRequestAnimationFrame(callback);         // Older versions Chrome/Webkit

 


解决兼容问题的代码:

1 window.requestAnimFrame = (function () {
2         return window.requestAnimationFrame ||
3             window.webkitRequestAnimationFrame ||
4             window.mozRequestAnimationFrame ||
5             function (callback) {
6                 window.setTimeout(callback, 6000 / 60);
7             };
8     })();

使用示例:

<div id="myDiv" style="background-color: lightblue;width: 0;height: 20px;line-height: 20px;">0%</div>
<button id="btn">run</button>
<script>
var timer;
btn.onclick = function(){
    myDiv.style.width = '0';
    cancelAnimationFrame(timer);
    timer = requestAnimationFrame(function fn(){
        if(parseInt(myDiv.style.width) < 500){
            myDiv.style.width = parseInt(myDiv.style.width) + 5 + 'px';
            myDiv.innerHTML =     parseInt(myDiv.style.width)/5 + '%';
            timer = requestAnimationFrame(fn);
        }else{
            cancelAnimationFrame(timer);
        }    
    });
}
</script>

 效果演示:点击一下run按钮试试呀

posted @ 2017-06-23 14:44  转圈圈画圆圆  阅读(319)  评论(0编辑  收藏  举报