2016-05-18 55 views
-1

我實現了我在網上找到的這段代碼,並添加了一個if語句,用於檢查元素之前是否已經過動畫。如果有,它應該刪除使其成爲動畫目標的類。出於某種原因,它不起作用,並且元素每當它進入視口時都會生成動畫,而不僅僅是第一次像我希望的那樣。jQuery - 在滾動bug上動畫

var $flyInLeft = $('.fly-in-left'); 
var $window = $(window); 

function check_if_in_view() { 
    var window_height = $window.height(); 
    var window_top_position = $window.scrollTop(); 
    var window_bottom_position = (window_top_position + window_height); 

    $.each($flyInLeft, function() { 
    var $element = $(this); 
    var element_height = $element.outerHeight(); 
    var element_top_position = $element.offset().top; 
    var element_bottom_position = (element_top_position + element_height); 

    //check to see if this current container is within viewport 
    if ((element_bottom_position >= window_top_position) && 
     (element_top_position <= window_bottom_position)) { 
     $element.addClass('animated slideInLeft already-viewed'); 
    } else { 
     $element.removeClass('animated slideInLeft'); 
    } 

    // This is the bit that doesn't seem to work. 
    if ($element.hasClass('already-viewed')) { 
     $element.removeClass('fly-in-left'); 
    } 
    }); 

回答

0

我發現什麼是錯的。我將選擇存儲在變量的頂部,因此如果我刪除了針對動畫元素的類,因爲選擇已經發生,這並不重要。

我刪除這個從頂部和它的工作:

var $flyInLeft = $('.fly-in-left'); 
0

刪除該類不應刪除附加到該元素的綁定。

在做動畫之前檢查活動類。

if (!$element.hasClass('already-viewed')) { 
    //check to see if this current container is within viewport 
    if ((element_bottom_position >= window_top_position) && 
    (element_top_position <= window_bottom_position)) { 
     $element.addClass('animated slideInLeft already-viewed'); 
    } else { 
     $element.removeClass('animated slideInLeft'); 
    } 
} 

由於您仍然在滾動上運行這些功能,因此最好從元素中刪除任何綁定。所以,你可以改變它:

//check to see if this current container is within viewport 
    if ((element_bottom_position >= window_top_position) && 
    (element_top_position <= window_bottom_position)) { 
     $element.addClass('animated slideInLeft already-viewed'); 

     //Unbind scroll event 
     $(window).off("scroll", check_if_in_view); 

    } else { 
     $element.removeClass('animated slideInLeft'); 
    }