2

好的,我在尝试使用滚动事件上的条件为 DOM 的多个元素设置动画时遇到了问题。首先,我使用的是 Drupal 7,所以我使用的 jQuery 库的版本是 1.4.4。

现在,当页面向下滚动时,我想通过更改其中元素的 css 属性来缩小标题的大小。

所以首先,在滚动事件中,我检查了窗口的 scrollTop 位置。如果位置不是 0(意味着页面向下滚动),我会在页眉内的元素上触发动画。

如果位置等于零,我希望 css 属性回退到其原始状态,以便标头检索其完整大小。

动画的第一部分工作正常。当我向下滚动页面时,标题按预期缩小。但是当我将页面滚动回顶部时,第二个动画不起作用..动画都是错误的,并且在几秒钟后发生并且变得疯狂,来回更改受animate()函数影响的 css 属性。

有没有人知道如何清除这个?

这是我正在使用的代码的简化部分:

$(window).scroll(function(){            

    if($(window).scrollTop() != 0){
        $('#myFirstElement').animate({marginTop: '20px'}, 300);
        $('#mySecondElement').animate({top: '20px'}, 300);
    }       
    else {
        $('#myFirstElement').animate({marginTop: '32px'}, 300);
        $('#mySecondElement').animate({top: '32px'}, 300);
    }

});
4

3 回答 3

6

你可以使用类似的东西

http://jsfiddle.net/HjFH4/

$elem1 = $('#myFirstElement');
$elem2 = $('#mySecondElement');
var scrollState = 'top';

$(window).scroll(function(){ 

    var scrollPos = $(window).scrollTop();

    if( ( scrollPos != 0 ) && ( scrollState === 'top' ) ) {
        $elem1.stop().animate({marginTop: '0px'}, 300);
        $elem2.stop().animate({height: '10px'}, 300);
        scrollState = 'scrolled';
    }       
    else if( ( scrollPos === 0 ) && ( scrollState === 'scrolled' ) ) {
        $elem1.stop().animate({marginTop: '32px'}, 300);
        $elem2.stop().animate({height: '80px'}, 300);
        scrollState = 'top';
    }

});
于 2013-07-10T15:01:28.477 回答
2

问题是该scroll事件在用户滚动操作期间发生了很多次。每次,您都要求 JQuery 启动动画。

你应该只在需要时做动画:

var smallMenu = false;

$(window).scroll(function(){            

    if($(window).scrollTop() !== 0)
    {
        if(smallMenu === false)
        { 
            smallMenu = true;
            $('#myFirstElement').stop().animate({marginTop: '20px'}, 300);
            $('#mySecondElement').stop().animate({top: '20px'}, 300);
        }
    }       
    else 
    {
        if(smallMenu === true)
        { 
            smallMenu = false;
            $('#myFirstElement').stop().animate({marginTop: '32px'}, 300);
            $('#mySecondElement').stop().animate({top: '32px'}, 300);
        }
    }
});
于 2013-07-10T14:17:52.067 回答
0

尝试使用.dataor 来保存动画的状态,并且仅在状态与您想要的相反时对其进行动画处理。

$(window).scroll滚动时反复触发。请参阅http://api.jquery.com/scroll/底部的实时示例

所以在我看来,在滚动时,顶部不为零,它实际上排队了大量的动画事件,当你向上滚动时会导致冲突。

于 2013-07-10T14:07:37.863 回答