2017-05-30 34 views
0

我有一個div我想在觸發div和窗口頂部之間達到一定距離後動起來一次,但是在.scroll()函數內時滾動時不斷觸發動畫。在滾動觸發器後運行.animate()一次

這下面的代碼工作正常:

$(window).scroll(function(){ 
    var a = $('.intro-text').offset().top; 
    console.log(a); 

    if (a > 100) { 
    $('.hide-me').fadeOut(); 
    } else if (a < 100) { 
    $('.hide-me').fadeIn(); 
    } 

}); 

但如果我將它更改爲.animate(),它不斷地排隊,並永遠需要運行:

$(window).scroll(function(){ 
    var a = $('.intro-text').offset().top; 
    console.log(a); 

    if (a > 100) { 

    $('.hide-me').animate({ 
     left: -200 
    }, 1000); 

    } else if (a < 100) { 

    $('.hide-me').animate({ 
     left: 0 
    }, 1000); 

    } 

}); 

我的編碼技能AREN」盡我所能,但我希望在進入任何外部庫或插件之前瞭解jQuery /純JavaScript中是否有函數。任何幫助將不勝感激,謝謝。

+1

您可以嘗試在淡出/淡入淡出之前放置'.stop()' – Pete

+1

您需要'debounce'滾動事件,以便它不會持續觸發(通過插件或通過簡單的'setTimeout' /'clearTimeout '對)。您可能還想通過標記檢查它是否已經可見/隱藏,而不是依靠滾動位置。或者檢查':animated'。 –

回答

1

創建scroll對象,並保存兩個標誌fadeInfadeOut

var scroll = { 
      fadeIn: false, 
      fadeOut: false 
}; 

說明

內,您的滾動事件有兩個條件a>100a<100

所以,一旦的一個條件是真實的,它進入並檢查標誌是否在觸發前設置然後將動畫的標誌設置爲true並清除另一個標誌。

例如:

if (a > 100) { 
    if (!scroll.fadeOut) { 
     $('.hide-me').fadeOut(); 
     scroll.fadeOut = true; 
     scroll.fadeIn = false; 
    } 
    } 

在上面的代碼

它檢查如果未設置scroll.fadeOut然後

它動畫

$('.hide-me').fadeOut(); 

,並設置標記

scroll.fadeOut = true; 
scroll.fadeIn = false; 

這將不允許再次執行該動畫,直到第二個動作被觸發並清除標誌。

全部JS

var scroll = { 
     fadeIn: false, 
     fadeOut: false 
}; 

$(window).scroll(function() { 
    var a = $('.intro-text').offset().top; 
    console.log(a); 

    if (a > 100) { 
    if (!scroll.fadeOut) { 
     $('.hide-me').fadeOut(); 
     scroll.fadeOut = true; 
     scroll.fadeIn = false; 
    } 
    } else if (a < 100) { 
    if (!scroll.fadeIn) { 
     $('.hide-me').fadeIn(); 
     scroll.fadeIn = true; 
     scroll.fadeOut = false; 
    } 
    } 

}); 

UPDATE

var scroll = { 
    fadeIn: false, 
    fadeOut: false 
}; 

$(window).scroll(function() { 
    var a = $('.intro-text').offset().top; 
    console.log(a); 

    if (a > 100) { 
    if (!scroll.fadeOut) { 
     $('.hide-me').animate({ 
     left: -200 
     }, 1000); 
     scroll.fadeOut = true; 
     scroll.fadeIn = false; 
    } 
    } else if (a < 100) { 
    if (!scroll.fadeIn) { 
     $('.hide-me').animate({ 
     left: 0 
     }, 1000); 
     scroll.fadeIn = true; 
     scroll.fadeOut = false; 
    } 
    } 

}); 
+0

謝謝,但是它會與.animate()類似運行嗎? – Finnb

+0

它應該是一樣的檢查更新代碼 –

+0

太棒了!這實際上是按照預期完成的。如果你能解釋代碼中發生了什麼,會很感激。 – Finnb

1

在這些情況下,您可以使用jQuery .stop([clearQueue],[jumpToEnd])方法,如:

function debounce(func, wait, immediate) { 
    var timeout; 
    return function() { 
    var context = this, 
     args = arguments; 
    var later = function() { 
     timeout = null; 
     if (!immediate) func.apply(context, args); 
    }; 
    var callNow = immediate && !timeout; 
    clearTimeout(timeout); 
    timeout = setTimeout(later, wait); 
    if (callNow) func.apply(context, args); 
    }; 
}; 

$(window).scroll(function() { 
    debounce(function() { 
    var a = $('.intro-text').offset().top; 
    console.log(a); 
    if (a > 100) { 
     $('.hide-me').stop(true, true).animate({ 
     left: -200 
     }, 1000); 
    } else if (a < 100) { 
     $('.hide-me').stop(true, true).animate({ 
     left: 0 
     }, 1000); 
    } 
    }, 50); 
}); 

如果超過一個靈魂在相同的元素上調用方法,後面的動畫放置在元素的效果隊列中。這些動畫直到第一個動畫完成纔會開始。當調用.stop()時,隊列中的下一個動畫立即開始。如果clearQueue參數的值爲true,那麼隊列中的其餘動畫將被刪除並永不運行。

+0

這一個幾乎工作!現在的問題是,當你繼續滾動時,它的最初動畫被取消,使其瞬間。但是,謝謝你的描述性答案,這對我以後肯定會變得有用。 – Finnb

+0

您可以在這裏使用'debounce'函數來確保給定的任務不會頻繁觸發,從而使瀏覽器性能下降。根據需要嘗試增加或減少值'50'。 –

+0

有趣。似乎有點複雜,但對未來某些任務有用。非常感激。 – Finnb

相關問題