有联系的标识变量的变化一定要同步

在说这两个之前先说一个在做轮播图时,逻辑处理的一个思路的错误。在做轮播图中,我又两个变量来记录轮播图的变化的情况的,一个是img_index,用来记录当前的图片,一个是left_index,用来记录向左偏移的距离,如图:          

  我在最后一张,和第一张之间的跳转有一个过渡,实现的思路就是前后两端,各插入后前两端的两张图片,在过渡的时候,先也是正常地滚动一张图片的距离,在滚动动画结束后,在设置img_index,和left_index为最后一张或第一张的值,并将样式应用上去(直接用css,此处不能有过渡)。这样的做法在用户点击速度不快的时候,完美实现视觉效果上的圆环轮播。但是点击快的时候,过了尽头(31往右,1王左),就会出现空白,left的值设置到了没有图片的区域。后面我才发现原因是img_index和left_index在尽头的时候,变化不同步,一个是直接变化,一个是放在animate的回调函数里面变化的。导致点击速度过快的时候,回调函数还没有执行(left_index还没有变化),img_index已经变化了好几次,等到left_index变化(回调函数执行的时候),img_index和left_index已经不同步了。代码如下:

 $(".mid-img>.to-right").on("click", function () {


            //变化偏移量和图片index
            if(self.img_index==self.img_num){
                //此处是当图片为最后一张的时候的时候,改变是不一样的
                self.left_index=self.left_index-1004;
                var index_temp=0+2;
                self.img_index=0;
                $(".go_span:first").stop().animate({left: self.left_index+"px"},300,function(){

                    //这个做法可取么???如果使用到stop来停止函数的话,这个是不可取的,因为只要点击了,就一定要有位移
                    //这个是位移后立马变回的。s
                    //这个是位移后立马变回的。
                    self.left_index=(0-index_temp)*1004;

                    $(".go_span:first").css({left:self.left_index+"px"});



                });
                $(".index-header>li:eq("+self.img_index+")").addClass("li-red-bg");
                $(".index-header>li:eq("+self.img_index+")").siblings().removeClass("li-red-bg");

                //修改标题的文字------------------
                var title=$(".go_span>a:eq("+index_temp+")").prop("title");
                $(".mid-img>.bottom-text").text(title);





            }else {
                self.img_index=self.img_index+1;
                self.left_index=self.left_index-1004;
                self.go();
            }

        });

吧这个错误的思路修正就是,吧img_index的变化也放进animate的回调函数里面。:代码如下:

//给向右移动添加事件
        $(".mid-img>.to-right").on("click", function () {


            //变化偏移量和图片index
            if(self.img_index==self.img_num){
                //此处是当图片为最后一张的时候的时候,改变是不一样的
                self.left_index=self.left_index-1004;
                var index_temp=0+2;

                $(".go_span:first").stop().animate({left: self.left_index+"px"},300,function(){

                    //这个做法可取么???如果使用到stop来停止函数的话,这个是不可取的,因为只要点击了,就一定要有位移
                    //这个是位移后立马变回的。s
                    //这个是位移后立马变回的。
                    self.left_index=(0-index_temp)*1004;
                    self.img_index=0;
                    $(".go_span:first").css({left:self.left_index+"px"});
                    $(".index-header>li:eq("+self.img_index+")").addClass("li-red-bg");
                    $(".index-header>li:eq("+self.img_index+")").siblings().removeClass("li-red-bg");


                });


                //修改标题的文字------------------
                var title=$(".go_span>a:eq("+index_temp+")").prop("title");
                $(".mid-img>.bottom-text").text(title);





            }else {
                self.img_index=self.img_index+1;
                self.left_index=self.left_index-1004;
                self.go();
            }

        });

总结就是,如果有两个标识变量,他们是有联系的,他们的变化一定要同步,同步的时间应该是相同的,不要一个放在回调函数里面,一个放在回调函数外面,因为回调函数不确定什么时候能够执行(有肯会被延迟或中断)。

在做这个轮播图,还遇到jquery中的stop()和animate()中的回调函数一齐出现时引发的现象,且看下回,当stop()遇到animate的回调函数。

      

posted @ 2016-11-15 17:08  顺德托马斯  阅读(203)  评论(0编辑  收藏  举报