郑重申明,以下只是本人的理解。没有实践论证,引用者小心!我不希望有人被我坑!
传统的js动画是通过setTimeout循环调用实现。
setTimeout调用一次将引起页面的改变,即页面将重绘。不过随着web的要求不断增加,大家对这个要求希望是放宽的态度,于是在高端浏览器,这个性能被提升了4倍左右,所以在chrome,ie10等浏览器,setTimeout的间隔缩短到了 4ms (250 fps)。(换句话说,setTimeout是一个可以不停切换函数调用的函数,在计算机中,函数的切换cpu会产生中断,如果切换很快,势必会引起 cpu中断频率加快,开发浏览器的小伙伴们怕cpu吃不消,所以做了切换时间频率最小限制。什么是中断,可以查书自己。中断分为软中断,和硬中断。。。)
问题二,那么是不是网页重绘,屏幕就一定会重刷呢?
我们在业务方法里面写动画业务。这样,我们的网页重绘就不浪费了。
兼容性:
ie 10.0,11.0
ff 22.0 (moz) 23.0 以上
chrome 28.0 以上
Safari 6.0 (webkit) 7.0 以上
Opera 16.0 以上
ios Safari 6.0-6.1 (webkit) 7.0 以上
android 不支持
ie mobile 10.0
以下是一个比较兼容的js版本
window.requestAnimFrame = (function(){
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
function( callback ){
window.setTimeout(callback, 1000 / 60);
};
})();
或者
window.requestAnimFrame = (function(w, r) {
w['r'+r] = w['r'+r] || w['webkitR'+r] || w['mozR'+r] || w['msR'+r] || w['oR'+r] || function(c){ w.setTimeout(c, 1000 / 60); };
return w['r'+r];
})(window, 'equestAnimationFrame');
参考文章:
http://www.zhangxinxu.com/wordpress/?p=3695
http://html5online.com.cn/articles/2012081102.html
http://www.cnblogs.com/aaronjs/archive/2012/07/05/2577177.html