美文网首页
14-第十四章 运动(上)

14-第十四章 运动(上)

作者: 晚溪呀 | 来源:发表于2019-02-18 01:45 被阅读0次

    一、requestAnimationFrame()

    当然最原始的你还可以使用 window.setTimout() 或者 window.setInterval() 通过不断更新元素的状态位置等来实现动画,前提是画面的更新频率要达到每秒60次才能让肉眼看到流畅的动画效果。
    现在又多了一种实现动画的方案,那就是 window.requestAnimationFrame() 方法。

    1、基本方法使用

            var num = 0;
            function fn() {
                num++;
                document.title = num;
                //在内部根据用户浏览器(电脑性能)情况,重复调用 fn,
                requestAnimationFrame(fn);
            }
            
            //requestAnimationFrame(fn);调用一次fn;
    
            //也可以如下
            fn();
    

    2、cancelRequestAnimationFrame( timer )

    添加 manage 定时管理器

            var num = 0;
            var timer;
            function fn() {
                num++;
                document.title = num;
                //在内部根据用户浏览器情况,重复调用 fn,
                timer = requestAnimationFrame(fn);
                if (num == 250) {
                    cancelAnimationFrame(timer);
                }
            }
            // requestAnimationFrame(fn); 调用一次fn;
            //也可以如下
            fn();
    

    requestAnimationFrame(fn) 赋值给 timer,timer 就是定时管理器

    3、RequestAnimationFrame( )兼容

            window.requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame || function (fn) {
                setTimeout(fn, 1000 / 60);
            };
    

    4、cancelAnimationFrame( ) 兼容

            window.cancelAnimationFrame = window.cancelAnimationFrame || window.mozCanceltAnimationFrame || window.webkitCancelAnimationFrame || window.msCancelAnimationFrame || clearTimeout;
    

    二、速度版运动框架

    1.    var Obox = document.getElementById('box');
      
    2.    move(Obox,'left',20,-6);//调用move函数,指定传递实参
      
    3.    function move(obj,attr,target,speed){//指定接受形参
      
    4.        target = parseFloat(target);//转化为number
      
    5.        var init = parseFloat( getStyle(obj,attr));//获取初始样式值
      
    6.        var time;//动画管理器
      
    7.        (function rQAF(){
      
    8.            init+= speed;
      
    9.            time =  window.requestAnimationFrame(rQAF);//调用requestAnimationFramerQAF函数
      
    10.            if( Math.abs(target-init)<=Math.abs(speed) ){//用绝对值判断是否到达目标值
      
    11.               init = target;//
      
    12.                window.cancelAnimationFrame(time);//删除requestAnimationFrame动画
      
    13.            }
      
    14.            obj.style[attr] = init+'px';//设置样式
      
    15.        })()
      
    16.    }
      
    17.    function getStyle(obj,attr){//定义获取样式函数
      
    18.        return window.getComputedStyle? window.getComputedStyle(obj)[attr]:obj.currentStyle[attr];
      
    19.    }
      

    三、时间版运动框架

    1.    move(Obox,'left','800px',1000);//调用move函数,指定传递实参
      
    2.    function move(obj,attr,target,tar_t){//指定接受形参
      
    3.        target = parseFloat(target);//转化为number
      
    4.        var init = parseFloat( getStyle(obj,attr));//获取初始样式值
      
    5.        var init_t = new Date();//获取开始时间
      
    6.        var style_val;
      
    7.        (function rQAF(){
      
    8.            var cur_t = new Date()- init_t;//获取动画时长
      
    9.            var prop =cur_t/tar_t;//获取动画执行时长与动画预设总时间比值
      
    10.            if( prop>=1 ){//动画执行时长与动画预设总时间比值大于等于1时,
      
    11.               prop=1;
      
    12.            }else{
      
    13.                window.requestAnimationFrame(rQAF);
      
    14.            }
      
    15.            style_val = (target-init)*prop;//根据时间比例获取运动路程比例
      
    16.            obj.style[attr] = init+style_val+'px';//设置样式
      
    17.        })()
      
    18.    }
      
    19.    function getStyle(obj,attr){//定义获取样式函数
      
    20.        return window.getComputedStyle? window.getComputedStyle(obj)[attr]:obj.currentStyle[attr];
      
    21.    }
      

    相关文章

      网友评论

          本文标题:14-第十四章 运动(上)

          本文链接:https://www.haomeiwen.com/subject/ktfccqtx.html