• js动画实现(一)


    requestAnimationFrame是什么?

    在浏览器动画程序中,我们通常使用一个定时器来循环每隔几毫秒移动目标物体一次,来让它动起来。如今有一个好消息,浏览器开发商们决定:“嗨,为什么我们不在浏览器里提供这样一个API呢,这样一来我们可以为用户优化他们的动画。”所以,这个requestAnimationFrame()函数就是针对动画效果的API,你可以把它用在DOM上的风格变化或画布动画或WebGL中。

    使用requestAnimationFrame有什么好处?

    浏览器可以优化并行的动画动作,更合理的重新排列动作序列,并把能够合并的动作放在一个渲染周期内完成,从而呈现出更流畅的动画效果。比如,通过requestAnimationFrame(),JS动画能够和CSS动画/变换或SVG SMIL动画同步发生。另外,如果在一个浏览器标签页里运行一个动画,当这个标签页不可见时,浏览器会暂停它,这会减少CPU,内存的压力,节省电池电量。

    requestAnimationFrame的用法

    // shim layer with setTimeout fallback
    window.requestAnimFrame = (function(){
      return  window.requestAnimationFrame       ||
              window.webkitRequestAnimationFrame ||
              window.mozRequestAnimationFrame    ||
              function( callback ){
                window.setTimeout(callback, 1000 / 60);
              };
    })();
    
    
    // usage:
    // instead of setInterval(render, 16) ....
    
    (function animloop(){
      requestAnimFrame(animloop);
      render();
    })();
    // place the rAF *before* the render() to assure as close to
    // 60fps with the setTimeout fallback.
    

    实现0到100的输出 requestAnimationFrame实现

    (function(){
                var i=0;
                var timer=requestAnimationFrame(function fn() {
                    console.log(i++);
                    timer=requestAnimationFrame(fn);
                    if(i>100){
                        cancelAnimationFrame(timer);
                    }
                })
    
            }())
    

    setTimeout实现

     

    (function setTime(){
                var i=0;
                var timer = setTimeout(function fn() {
                    console.log(i++);
                    timer=setTimeout(fn,1000/60);
                    if(i>100){
                        clearTimeout(timer)
                    }
                },1000/60)
            }())
    

      

    setInterval实现

    (function() {
                var i=0;
                var timer = setInterval(function () {
                    console.log(i++);
                    if(i>100){
                        clearInterval(timer);
                    }
                },1000/60)
    
            }())
    

      

     

      

  • 相关阅读:
    mysql in 的另一种替换方法
    js 的一些总结
    医院收费系统 一点的简单总结
    物流系统
    mysqldump备份还原和mysqldump导入导出语句大全详解
    android 环境待建遇到的问题
    EXT CheckboxSelectionModel 多选效果
    Ext Grid动态生成Column的实现方式
    Javascript对象继承(原型继承法)
    ExtJS中grid的JsonStore、Ext.PagingToolbar带条件查询问题
  • 原文地址:https://www.cnblogs.com/wujiaolong/p/7442713.html
Copyright © 2020-2023  润新知