• [Js]高级运动


    一、链式运动框架

    1.他需要一个回调函数,在运动停止时,开始下一次运动(执行函数)

    多物体运动框架改为如下:

    function startMove(obj,attr,iTarget,fn){

    ...

        if(iCur==iTarget){

            clearInterval(obj.timer);

            fn();

        }...

    };

    然后就可以用它,比如先变宽再变高最后变透明度

    startMove(this,'width',300,function(){

        startMove(this,'height',300,function(){

            startMove(this,'opacity',100);

        });

    });

    二、完美运动框架

    1.原本多物体运动框架的缺陷

    比如要让他宽度高度同时变300,这样写:

    startMove(this,'width',300);

    startMove(this,'height',300);

    问题:只有高度变300了(因为宽度准备运动时会开一个定时器,这个定时器还没开始运动前,执行高度变化的运动,就把之前的定时器关了)

    2.for in

    for(i=0;i<=arr.length;i++)和for(i in arr)效果一样

    ①什么时候用for什么时候用for...in呢?

    数组:两个都可以用   Json:只能用for...in(因为Json下标没有规律,没有length可言)

    对数组而言for...in循环不灵活,因为for循环可以从1可以从2等等任意数字开始,而for...in一循环就全部

    ②for in小应用

    function setStyle(obj,attr,value){

        obj.style[attr]=value;

    };

    setStyle(oDiv,'width','300px');

    setStyle(oDiv,'height','300px');

    setStyle(oDiv,'background','green');

    =====>

    function setStyle(obj,json){

        var attr='';

        for(attr in json){

            obj.style[attr]=json[attr];

        }

    };

    setStyle(oDiv,{'300px',height:'300px',background:'green'});

     ③多物体运动框架改进

     function startMove(obj,json,fn){
        clearInterval(obj.timer);
        obj.timer=setInterval(function(){

            for(var attr in json){

            if(attr=='opacity'){
                   var iCur=parseInt(parseFloat(getStyle(obj,attr))*100);   
                }
                else{
                    var iCur=parseInt(getStyle(obj,attr));
                }
                var iSpeed=(json[attr]-iCur)/8;
                iSpeed=iSpeed>0?Math.ceil(iSpeed):Math.floor(iSpeed);   
                if(iCur==json[attr]){
                    clearInterval(obj.timer);

                    if(fn){

                      fn();   //有传函数这个参数才执行,不然会出错

                    }
                }
                else{
                    if(attr=='opacity'){
                        obj.style.filter='alpha(opacity:'+(iCur+iSpeed)+')';
                        obj.style.opacity=(iCur+iSpeed)/100;
                    }
                    else{
                        obj.style[attr]=iCur+iSpeed+'px'
                    }
                }

            }       
        },30);
    };

    这样还有个问题

    if(iCur==json[attr]){
        clearInterval(obj.timer);

    }

    只要json里有任一值到达目标,计时器就停止

    比如我让宽度变到103,高度变到300,那高度到不了300就停止了

    解决方案

    function startMove(obj,json,fn){
        clearInterval(obj.timer);
        obj.timer=setInterval(function(){

            var bStop=true;    //先定义一个值,假设所有值都到了

            for(var attr in json){

            if(attr=='opacity'){
                   var iCur=parseInt(parseFloat(getStyle(obj,attr))*100);   
                }
                else{
                    var iCur=parseInt(getStyle(obj,attr));
                }
                var iSpeed=(json[attr]-iCur)/8;
                iSpeed=iSpeed>0?Math.ceil(iSpeed):Math.floor(iSpeed);   
                if(iCur!=json[attr]){

                    bStop=false;        //并不是所有值都到了,就把bStop设成 false

                }
                if(attr=='opacity'){
                    obj.style.filter='alpha(opacity:'+(iCur+iSpeed)+')';
                    obj.style.opacity=(iCur+iSpeed)/100;
                }
                else{
                    obj.style[attr]=iCur+iSpeed+'px'
                }          

            }   

            if(bStop){       //所有值都到了,关闭定时器
                clearInterval(obj.timer);

                if(fn){

                    fn();   //有传函数这个参数才执行,不然会出错

                }

            }
        },30);
    };

  • 相关阅读:
    Dubbo探索(七)
    Dubbo探索(六)
    Dubbo探索(五)
    Dubbo探索(四)
    Redis主节点内存占用过高
    修改RedHat 7.2 进程最大句柄数限制
    Linux 数据分析常用 shell命令
    流处理
    根域名服务器
    并发与并行(concurrency vs parallesim)
  • 原文地址:https://www.cnblogs.com/zhangwenkan/p/3667952.html
Copyright © 2020-2023  润新知