2016-04-20 212 views
1

我創建了一個樣本靜態滑塊,它具有20%左右的div(顯示下一個或prev幻燈片的一部分的空間)和60%的包含主幻燈片的中心;jquery同步元素點擊

所以,滑塊必須財產以後像

| 20%| 60%主滑動| 20%|:我必須保持這些百分比不變。

當點擊一次,everthing正常工作,否則當我點擊其中一個div多一個simultanious單擊主滑塊應該只移動60%(右或左),但它會觸發多一個調用,所以主幻燈片隨機移動!

如何防止多次點擊函數調用直到完成註釋。

段:

$(document).ready(function(){ 
 
\t 
 
\t $("#slide-right").on("click", function(event){ 
 
\t \t event.stopImmediatePropagation 
 
\t \t slide('right'); 
 
\t }); 
 
\t 
 
\t $("#slide-left").on("click", function(event){ 
 
\t \t event.stopImmediatePropagation 
 
\t \t slide('left'); 
 
\t }); 
 
}); 
 

 
function slide(direction){ 
 
\t 
 
\t var slider_width = $("#slide_container").width(); 
 
\t $(".slide").each(function(index) { 
 
\t \t var elmnt_left = $(this).position().left; 
 
\t \t //alert(this.id) 
 
\t \t 
 
\t \t var val = 100 * elmnt_left/slider_width; 
 
\t \t var percentage = 0; 
 
\t \t 
 
\t \t // direction slide to left 
 
\t \t if(direction == 'left'){ 
 
\t \t \t if(index == 0) { 
 
\t \t \t \t if(val > -100) 
 
\t \t \t \t \t percentage = val - 60; 
 
\t \t \t } \t \t \t 
 
\t \t \t else if(index == 1) { 
 
\t \t \t \t if(val > -40) 
 
\t \t \t \t \t percentage = val - 60; 
 
\t \t \t } \t \t \t \t 
 
\t \t \t else if(index == 2){ 
 
\t \t \t \t if(val > 20) 
 
\t \t \t \t \t percentage = val - 60; 
 
\t \t \t } 
 
\t \t }else if (direction == 'right'){ // direction slide to right 
 
\t \t \t if(index == 0) { 
 
\t \t \t \t if(val < 20) 
 
\t \t \t \t \t percentage = val + 60; 
 
\t \t \t } \t \t \t 
 
\t \t \t else if(index == 1) { 
 
\t \t \t \t if(val < 80) 
 
\t \t \t \t \t percentage = val + 60; 
 
\t \t \t } \t \t \t \t 
 
\t \t \t else if(index == 2){ 
 
\t \t \t \t if(val < 140) 
 
\t \t \t \t \t percentage = val + 60; 
 
\t \t \t } 
 
\t \t } \t 
 
\t \t 
 
\t \t console.log() 
 
\t \t 
 
\t \t if(percentage !== 0){ \t 
 
\t \t \t $(this).animate({ 
 
\t \t \t \t left: percentage+'%' 
 
\t \t \t }, 400, function() { 
 
\t \t \t \t // Animation complete. 
 
\t \t \t \t 
 
\t \t \t }); 
 
\t \t } 
 
\t \t 
 
\t }); 
 
};
html,body { 
 
\t width:100%; 
 
\t height:100%; 
 
\t margin:0px; 
 
} 
 

 
.main{ 
 
\t width:100%; 
 
} 
 

 
#slide_container{ 
 
\t position:relative; 
 
\t width:100%; 
 
\t height:300px; 
 
\t overflow:hidden; 
 
\t text-align:center; 
 
} 
 

 
#slide_container .slide { 
 
\t position:absolute; 
 
\t width: 60%; 
 
\t border:0px solid #ccc; 
 
\t height:100%; 
 
\t display:inline-block; 
 
\t margin:0; 
 
\t opacity:0.7; 
 
} 
 

 
#slide_container .slide1 { 
 
\t background-color:green; 
 
\t left:20%; 
 
} 
 

 
#slide_container .slide2 { 
 
\t background-color:gray; 
 
\t left:80%; 
 
\t 
 
} 
 

 
#slide_container .slide3 { 
 
\t background-color:pink; 
 
\t left:140%; 
 
\t 
 
} 
 

 

 
#slide_container #slide-left { 
 
\t display:inline-block; 
 
\t height: 100%; 
 
\t width: 20%; 
 
\t left:0; 
 
\t position:absolute; 
 
\t z-index:100; 
 
} 
 

 
#slide_container #slide-right { 
 
\t display:inline-block; 
 
\t height: 100%; 
 
\t width: 20%; 
 
\t right:0; 
 
\t position:absolute; 
 
\t z-index:100; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 
 
\t <div class="main"> 
 
\t \t <div id="slide_container"> 
 
\t \t \t <span id="slide-left"></span> 
 
\t \t \t <span id="slide-right"></span> 
 
\t \t \t <div> 
 
\t \t \t \t <div class="slide slide1" id="1" ></div> 
 
\t \t \t \t <div class="slide slide2" id="2" ></div> 
 
\t \t \t \t <div class="slide slide3" id="3" ></div> 
 
\t \t \t </div> 
 
\t \t </div> 
 
\t </div>

+0

*「同時點擊」*你的意思是雙擊? –

+2

順便說一句,你做錯了,你不應該動畫每個.slide元素,而是一個單一的父容器。 –

+0

請你多解釋一下! –

回答

2

如何防止多個點擊函數調用,直到annimation正在完成?

僞代碼:

$("#next").on("click", function(){ 
    if($("#slider").is(":animated")) return; 
    // animation logic here 
}); 
+0

很好,謝謝。 –

+0

@bRIMOsBOR不客氣 –

1

您也可以在容器中添加一個類時,動畫開始和刪除類時的動畫效果ends.So這個類只存在而動畫正在發生。

slide函數執行時,您可以檢查該類是否存在,如果是,則返回false。

$(document).ready(function(){ 

$("#slide-right").on("click", function(event){ 
    event.stopImmediatePropagation 
    slide('right'); 

}); 

$("#slide-left").on("click", function(event){ 
    event.stopImmediatePropagation 
    slide('left'); 

}); 
}); 

function slide(direction){ 

if($("#slide_container").hasClass("animating")) { 
return false; 
}else{ 
$("#slide_container").addClass("animating"); 
} 

var slider_width = $("#slide_container").width(); 
$(".slide").each(function(index) { 

    var elmnt_left = $(this).position().left; 
    //alert(this.id) 

    var val = 100 * elmnt_left/slider_width; 
    var percentage = 0; 

    // direction slide to left 
    if(direction == 'left'){ 
     if(index == 0) { 
      if(val > -100) 
       percentage = val - 60; 
     }   
     else if(index == 1) { 
      if(val > -40) 
       percentage = val - 60; 
     }    
     else if(index == 2){ 
      if(val > 20) 
       percentage = val - 60; 
     } 
    }else if (direction == 'right'){ // direction slide to right 
     if(index == 0) { 
      if(val < 20) 
       percentage = val + 60; 
     }   
     else if(index == 1) { 
      if(val < 80) 
       percentage = val + 60; 
     }    
     else if(index == 2){ 
      if(val < 140) 
       percentage = val + 60; 
     } 
    } 

    console.log() 

    if(percentage !== 0){ 
     $(this).animate({ 
      left: percentage+'%' 
     }, 400, function() { 
      // Animation complete. 
      $("#slide_container").removeClass("animating"); 
     }); 
    } 

    }); 
}; 
0
if(percentage !== 0 && !window.animating) 
{ 
     $(this).animate({ 
      left: percentage+'%' 
     }, { 
      start: function(){ 
       window.animating = true; 
      }, 
      complete: function(){ 
       window.animating = false; 
      } 
     }); 
    } 

添加VAR的東西 「全球」 像window可以做的伎倆在我看來。