flag的 问题!!!求大神解释

来源:6-2 完美运动框架

葛乌

2016-04-21 12:03

我就纳闷了。按代码所示。flag放在定时器外面,最开始是true,执行第一次动画时,不是所有动画都到达,于是定时器的flag被设置为false,然后该干嘛就干嘛,接下来执行30毫秒后的第二次动画,于是乎,问题来了,作为startmove内的变量,定时器外的变量flag,已经被上一次的动画设置为了false,所以,接下来的判断语句flag永远是false,  等同于if(flag)这个是不可能实现的!!定时器内部也没有设置flag为true的语句,动画讲永远不停止!!真正的问题来了:屏幕中老师这样敲的代码,浏览器中居然能实现动画!!!求大神解释!!

写回答 关注

7回答

  • 风_起
    2016-04-21 14:14:29
    已采纳

    你再看一看。

    葛乌 回复哈喽姑娘

    恩谢谢你的回复

    2016-04-30 14:54:07

    共 4 条回复 >

  • qq_过去_3
    2016-05-10 09:25:40

    NeoWu222同学的方法,我试了,发现好像flag一直是处于为1,并没有加到3,也就是定时器还一直是开着的

    qq_过去_...

    是我自己看错。。。

    2016-05-10 09:42:55

    共 1 条回复 >

  • qq_过去_3
    2016-05-09 18:11:49

    我觉得不要加flag也可以吧,定时器一直开着应该没关系吧,所有的运动也能同时实现(个人想法,不知道行不行)

  • Wenfei_Jor
    2016-04-26 10:34:39

    这个问题和回答给力!给你们点个赞!

  • NeoWu95
    2016-04-23 17:48:21

    不好意思json没有获取长度的属性或方法,所以要自己定义一个方法来获取

    把最后一个if(flag == json.length)改为if(flag == getLength(json))

    方法定义代码:

    function getLength(json){

        var length = 0;

        for(var attr in json){

            length++;

        }

        return length;

    }


    lzlbu2

    太感谢了,看了这么多的回答,只有你的这个方法最好用,还解决了老师的bug

    2016-05-14 20:48:02

    共 2 条回复 >

  • NeoWu95
    2016-04-23 17:15:17

    把flag初始为0;当有一个属性达到目标值时,flag自增1;当flag 等于 json的长度时再清楚定时器;

    代码如下:

    function startMove(obj,json,fn){

        clearInterval(obj.timer);

        obj.timer = setInterval(function(){

            var flag = 0;

            for(var attr in json){

                //1.取当前值

                var icur = 0;

                if(attr == 'opacity'){

                    icur = Math.round(parseFloat(getStyle(obj,attr))*100);

                //是不是不需要parseFloat

                }else{

                    icur = parseInt(getStyle(obj,attr));

                }


                //2.算速度

                var speed = (json[attr] - icur)/8;

                speed = speed>0?Math.ceil(speed):Math.floor(speed);


                //3.检测停止

                if(icur == json[attr]){

                    flag++;

                }

                if(attr == 'opacity'){

                    obj.style.filter = 'alpha(opacity:' + (icur + speed) + ')';//针对IE

                    obj.style.opacity =  (icur + speed)/100;

                    //针对chrome、FF

                }else{

                    obj.style[attr] = icur + speed + 'px'; 

                }

                

                if(flag == json.length){

                        clearInterval(obj.timer);

                        if(fn){

                            fn();

                        }

                    }

                }; 

        },20)

        

    }


    jinlel... 回复protry

    另外放在全局变量只要定时器执行一次for执行一次,每次定时执行都有一个属性满足目标值,那么很快flag就等于3了。所以要放在定时器里面,把上次定时得到的清0重新计数

    2016-05-29 13:36:15

    共 4 条回复 >

  • 风_起
    2016-04-21 14:23:08

    你试一下不就知道老师写的代码是对是错了。加个fn,做链式运动。看链式运动有木有?我个人估计应该是没有。flag设置成false之后,就再也没有变回true了。。。老师代码是有bug

JS动画效果

通过本课程JS动画的学习,从简单动画开始,逐步深入各种动画框架封装

113925 学习 · 1443 问题

查看课程

相似问题