使用jQuery动画缓慢/无响应的动画

时间:2013-02-18 21:31:36

标签: javascript jquery function scroll jquery-animate

我正在编写一个小的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; }

有人能弄清楚为什么我的代码hide / showHead函数如此草率?

谢谢,

彼得

5 个答案:

答案 0 :(得分:1)

试试这个:

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

答案 1 :(得分: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();
    }
});

答案 2 :(得分:1)

尝试使用queue:false,正如亚历山大所说使用.stop()

这里是jsfiddle

http://jsfiddle.net/hwbPz/

答案 3 :(得分: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/

答案 4 :(得分:1)

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

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

执行此操作
$(".element").stop().animate({top: "0"}, 250);

.stop()功能还提供了一些其他选项,您可以使用它们进一步调整它。