2016-05-18 57 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'); 
    }