window.requestAnimationFrame()的使用
来源:互联网 发布:2017杭州程序员招聘 编辑:程序博客网 时间:2024/04/30 00:05
1.前言
在说明这个js的api用法之前,我先给个效果以及源码:
1. 页面效果
2. 页面源码
2.说明
window.requestAnimationFrame()这个API是浏览器提供的js全局方法,针对动画效果。
1)使用
- 用法1:
function animate() { //done(); requestAnimationFrame(animate); } requestAnimationFrame(animate);
注意函数里的requestAnimationFrame(animate)
有了这句话,就形成了递归调用,设置应为这个函数多用在持续的动画中,可以自由处理要不要这句话。
2. 用法2:
var globalID; function animate() { // done(); 一直运行 globalID=requestAnimationFrame(animate); // Do something animate } globalID=requestAnimationFrame(animate);//开始cancelAnimationFrame(globalID);//结束
2)优点:
浏览器可以优化并行的动画动作,更合理的重新排列动作序列,并把能够合并的动作放在一个渲染周期内完成,从而呈现出更流畅的动画效果。
- 经过浏览器优化,动画更流畅;
- 窗口没激活时,动画将停止,省计算资源;
3) 使用场景:
可以调节重新渲染,大幅提高网页性能。其中最重要的,它可以将某些代码放到下一次重新渲染时执行。避免短时间内触发大量reflow。
function doubleHeight(element) { var currentHeight = element.clientHeight; window.requestAnimationFrame(function () { element.style.height = (currentHeight * 2) + 'px'; });}elements.forEach(doubleHeight);
页面滚动事件(scroll)的监听函数,就很适合用这个api,推迟到下一次重新渲染。
$(window).on('scroll', function() { window.requestAnimationFrame(scrollHandler);});
最佳的应用场景还是在帧动画里,可以大幅优化性能;
4)兼容性支持
为了避免老浏览器没有提供这个api,可以先检测,后处理,没有提供api时,写对应的函数挂在window下,以后的调用与正常情况一致。
网上大神的杰作
(function() { var lastTime = 0; var vendors = ['webkit', 'moz']; for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame']; window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame'] || window[vendors[x]+'CancelRequestAnimationFrame']; } if (!window.requestAnimationFrame) window.requestAnimationFrame = function(callback) { var currTime = new Date().getTime(); var timeToCall = Math.max(0, 16 - (currTime - lastTime)); var id = window.setTimeout(function() { callback(currTime + timeToCall); }, timeToCall); lastTime = currTime + timeToCall; return id; }; if (!window.cancelAnimationFrame) window.cancelAnimationFrame = function(id) { clearTimeout(id); };}());
简单说明:
- 定义了一个立即执行函数,形成具备作用域,避免污染全局空间。
- 将功能函数挂在了window.
- 利用setTimeout和clearTimeout的异步实现相应的功能,不是为一种很好的结局方案。
- 如果对异步有疑问,可以查看我的另一篇博客js的执行机制
2 0
- window.requestAnimationFrame()的使用
- window.requestAnimationFrame()的使用
- window.requestAnimationFrame()
- HTML5 requestAnimationFrame的使用
- 使用requestAnimationFrame的动画循环
- window.requestAnimationFrame(drawFrame, canvas)
- 使用requestAnimationFrame实现平滑高效的javascript动画
- requestAnimationFrame 的用法
- requestAnimationFrame的动画循环
- requestAnimationFrame()方法的用法
- requestAnimationFrame
- requestAnimationFrame
- requestAnimationFrame
- requestAnimationFrame
- requestAnimationFrame
- requestAnimationFrame
- requestAnimationFrame
- requestAnimationFrame
- tensorflow学习笔记(二十六):构建TF代码
- ①协方差、相关系数(皮尔逊相关系数),等同于:内积、余弦值。
- ORA-38171: Insufficient privileges for SQL management object operation
- Okhttp设置请求日志过滤器,支持打印Post请求参数
- [嵌入式]异常与中断(上)
- window.requestAnimationFrame()的使用
- js贪吃蛇
- 简单理解Ajax
- maven设置默认jdk
- 京东量化教你如何用简单的策略回测盈利
- Cursor.moveToNext顺序问题?
- 《JavaScript语言精粹》
- JS通过.style.属性修改对象样式的可行度分析
- Linux-3.4.2内核移植调试笔记