自己用JQuery写了一个海报轮播图特效,核心代码如下:
(注:共七张轮播图,首尾衔接一张,其余五张为有效图。index取值为-1~5。其中0~4为有效图)
原理是设置一个index标记,根据当前index改变div的偏移位置
但是假设轮播图转换动画为5s,则在5s内快速点击“下一页”四次,则动画共耗时20s,图片去到第四张
如何设置在5s内快速点击“下一页”四次,但只耗时5s,图片去到第二张?即,动画未完成则只接受一次事件
//================上一页
function toPrev(){
index--;
if(index==-1){
index=4;
index_point.eq(index).addClass("on").siblings().removeClass();
list.animate({left:"0"},1000,function(){list.css("left","-500%")});
return 0;
}
index_point.eq(index).addClass("on").siblings().removeClass();
location = index_point.eq(index).attr("index")*(-100)+"%";
list.animate({left:location},1000);
console.log(index +" "+ list.css("left"));
}
//================下一页
function toNext(){
index++;
if(index==5){
index=0;
index_point.eq(index).addClass("on").siblings().removeClass();
list.animate({left:"-600%"},1000,function(){list.css("left","-100%")});
return 0;
}
index_point.eq(index).addClass("on").siblings().removeClass();
location = index_point.eq(index).attr("index")*(-100)+"%";
list.animate({left:location},1000);
console.log(index +" "+ list.css("left"));
}
//===============点击小箭头翻页
prev.bind("click",toPrev);
next.bind("click",toNext);
1. if($(element).is(":animated")){ //判断元素是否正处于动画状态
//如果当前没有进行动画,则添加新动画
}
2.var flag = true;
在animate回调里调控flag。
你可以设置一个点击超时,用户点击一次后,不马上执行你动画,而是延迟一定时间例如100毫秒,如果在100毫秒后,用户没有进一步的点击行为,那么触发动画执行,如果有点击行为,那么取消上一次延时设置一个新的延时
这样就达到你的只接受一次事件的效果
var nextClickTimer;
function toNext(){
t&&clearTimeout(t);
t=setTimeout(function(){
//执行动画正常流程
},100);
}
如果一次效果展示需要5s,那么5s内的其它效果切换操作应该视为无效。
var nowDate=0;
function next(){
if(new Date().getIime()-nowDate<5000){
return;
}
nowDate=new Date().getIime();
//干事情咯
do();
}