1

我正在编写一个小的 jQuery 函数,我似乎遇到了麻烦。

我在这里尝试做的是当用户向下滚动页面 90px 时,div 标签应该向下动画(从顶部:-50px 到顶部:0),反之亦然,当他们滚动回页面顶部时.

我遇到的问题是动画有时似乎非常缓慢且无响应。我在 3 种不同的浏览器和不同的计算机上进行了测试,但我没有任何乐趣。

这是我的代码:

    // Show div
    var scrollValue = "90";

    // Animate functions
    var showHead = function (){
$(".element").animate({top: "0"}, 250);
}
var hideHead = function (){
$(".element").animate({top: "-50px"}, 250);
}

    $(window).scroll(function() {
        if ($(this).scrollTop() > scrollValue) {
            showHead();
        } else {
            hideHead();
        }
    });

.element 属性:

.element { positoin:fixed; top:-50px; }

谁能弄清楚为什么我的代码隐藏/显示头功能如此草率?

谢谢,

彼得

4

5 回答 5

1

试试这个:

$(window).scroll(function() {
    if (window.scrollY > scrollValue) {
        showHead();
    } else {
        hideHead();
    }
});
于 2013-02-18T21:42:17.453 回答
1

scroll在用户滚动期间发生了很多次事件。

在再次开始动画之前,您需要检查您的动画是否正在进行。

试试这个 :

// Show div
var scrollValue = "90";
var inProgress = false;

// Animate functions
var showHead = function () {
    if(inProgress)
        return false;

    //Animate only if the animation is not in progress
    inProgress = true;

    $(".element").animate({
        top: "0"
    },250,function(){
        inProgress = false; //Reset when animation is done
    });
}
var hideHead = function () {
    if(inProgress)
        return false;

    //Animate only if the animation is not in progress
    inProgress = true;

    $(".element").animate({
        top: "-50px"
    }, 250,function(){
        inProgress = false; //Reset when animation is done
    });
}

$(window).scroll(function () {
    if ($(this).scrollTop() > scrollValue) {
        showHead();
    } else {
        hideHead();
    }
});
于 2013-02-18T21:42:49.363 回答
1

尝试使用 queue: false 并且正如亚历山大所说的那样使用.stop()

这里jsfiddle

http://jsfiddle.net/hwbPz/

于 2013-02-18T21:43:02.150 回答
1

假设您有position:fixed(或其他某种样式使栏在必要时可见):

var scrollheight = 90;

var $el = $('.element');
function showHead(){
    $el.stop().animate({
        top: '0px'
    }, 250);
}
function hideHead(){
    $el.stop().animate({
        top: '-50px'
    }, 250);
}

$(window).scroll(function(){
    if ($(window).scrollTop() > scrollheight){
        showHead();
    }else{
        hideHead();
    }
});

示例:http: //jsfiddle.net/L4LfL/

于 2013-02-18T21:45:26.410 回答
1

scroll事件被触发多次,即使它受到速率限制,它仍然是一个相当密集的操作。实际上,您可能正在排队几个动画,并且fx堆栈可能增长得非常快。

您可以尝试的一种可能性是在触发新动画之前停止所有以前的动画。您可以使用.stop().

$(".element").stop().animate({top: "0"}, 250);

.stop()功能还提供了一些其他选项,您可以使用这些选项对其进行更多调整。

于 2013-02-18T21:48:43.567 回答