Javascript动画滚动位置

时间:2015-02-24 14:34:30

标签: javascript jquery

我正在尝试像这里一样滚动动画(注意向下滚动时圆圈图形渐渐消失): http://demo.atticthemes.com/skoty/

这就是我所熟悉的东西,但它仍然以某种方式悬挂: http://jsfiddle.net/v4zjgwL6/

var timer;
var triggerHeight = $("#bar").offset().top;
var headerAvatar = $(".header-avatar-wrapper");

$(window).scroll(function() {
    if(timer) {
        window.clearTimeout(timer);
    }

    timer = window.setTimeout(function() {
        var y = $(window).scrollTop();

        if(y > triggerHeight - 220) {
            headerAvatar.css("visibility", "visible");
            headerAvatar.animate({opacity: 1}, 200);
        } else {
            headerAvatar.animate({opacity: 0}, 200);
            headerAvatar.css("visibility", "hidden");
        }

    }, 10);
});

2 个答案:

答案 0 :(得分:2)

看起来您只处理需要更改状态(显示或隐藏元素)的情况,而不处理任何不应更改的情况。这会导致您不断重新显示(重新制作)该事物,这会使其闪烁。

现在还早,我还没喝咖啡,但这样的事情应该可以解决你的问题。 :)

var timer;
var triggerHeight = $("#bar").offset().top;
var headerAvatar = $(".header-avatar-wrapper");
var shown; // NEW

$(window).scroll(function() {
    if(timer) {
        window.clearTimeout(timer);
    }

    timer = window.setTimeout(function() {
        var y = $(window).scrollTop();
        var shouldShow = y > triggerHeight - 220; // CHANGED

        if(!shown && shouldShow) { // CHANGED
            shown = true; // NEW
            headerAvatar.css("visibility", "visible");
            headerAvatar.animate({opacity: 1}, 200);
        } else if (shown && !shouldShow) { // CHANGED
            shown = false; // NEW
            headerAvatar.animate({opacity: 0}, 200);
            headerAvatar.css("visibility", "hidden");
        }

    }, 10); });

证明:http://jsfiddle.net/bvaughn/oL85oj41/

答案 1 :(得分:2)

您不需要使用计时器,实施它的方式会导致性能下降。
我建议改用css类:

var triggerHeight = $("#bar").offset().top;
var headerAvatar = $(".header-avatar-wrapper");

$(window).scroll(function() {
    var y = $(window).scrollTop();

    if (y > triggerHeight - 220 && !headerAvatar.hasClass("visible")) {
        headerAvatar.addClass("visible");
    } else if(y <= triggerHeight - 220 && headerAvatar.hasClass("visible")) {
        headerAvatar.removeClass("visible");
    }
});

我还在CSS中添加了这个类:

.header-avatar-wrapper.visible{
    opacity: 1;
    visibility: visible;
}

JSFiddle demo


或者,使用jQuery的.fadeIn()fadeOut()函数:

var triggerHeight = $("#bar").offset().top;
var headerAvatar = $(".header-avatar-wrapper");

$(window).scroll(function() {
    var y = $(window).scrollTop();

    if (y > triggerHeight - 220 && headerAvatar.css("display") == "none") {
        headerAvatar.fadeIn();
    } else if(y <= triggerHeight - 220 && headerAvatar.css("display") == "block") {
        headerAvatar.fadeOut();
    }
});

在CSS中,我从opacity删除了visibility.header-avatar-wrapper属性,并添加了display: none;

JSFiddle demo