jQuery 和 Safari 的问题

An Issue With jQuery and Safari

我正在尝试创建一个导航栏,当用户向下滚动时,它会在屏幕上上下滑动,然后在用户停止滚动/向上滚动时向下滚动。下面是我的脚本片段和 jsfiddle:

$(document).ready(function() {

var position = $(window).scrollTop();
    $(window).scroll(function() {
        var scroll = $(window).scrollTop();
        if (scroll > position) {
            $('.nav').addClass('active');
        } else {
            $('.nav').removeClass('active');
        }
        position = scroll;
    }); 
});

https://jsfiddle.net/z2uc89sL/

结合我的 CSS 这在我测试过的所有浏览器中都运行良好,除了 Safari(我在 Mac 上使用 运行 版本 9.0.2)。发生的问题是,当您点击页面顶部并且没有进一步向上滚动的空间时,导航通过重新向上滑动再次隐藏(就好像用户实际上再次向下滚动而不是向上滚动到顶部页面)。相反的情况也发生在页面底部。

如果您查看 Safari 中的 fiddle,您就会看到我正在谈论的问题。如果您在任何其他浏览器中查看 fiddle,您就会明白我要实现的目标。

这是因为 safari 中的弹跳效果。

您可以使用 iNoBounce 等扩展程序禁用它。

或者像这样比较当前位置。

if (scroll > position && position > 0) {
    $('.nav').addClass('active');
} else if (position < $(window).height()){
    $('.nav').removeClass('active');
}

下面我试图为您提供两个不同的答案,第一个解决方案与您的 .nav class 有关,而第二个是模拟与函数相同的功能。因此,它可以重复使用。

var el = $(".nav");
$(window).scroll(function() {
    el.addClass('active');
    clearTimeout($.data(this, "scrollCheck"));
    $.data(this, "scrollCheck", setTimeout(function() {
        el.removeClass('active');
    }, 250));
});

/*
 *  As a Function
 */
function scrollFunc(el) {
    var el = el;
    $(window).scroll(function() {
        el.addClass('active');
        clearTimeout($.data(this, "scrollCheck"));
        $.data(this, "scrollCheck", setTimeout(function() {
            el.removeClass('active');
        }, 250));
    });
}
scrollFunc($('nav'));

要在线查看结果,请查看我的 fiddle https://jsfiddle.net/yeoman/g19nejfu/1/ 我分叉了您的问题并使用有效答案对其进行了更新。

我很想解释一下发生了什么,但实际上这个问题已经以某种方式得到了回答。因此,为此目的,我将分享一些有用的链接。人们应该检查一下以了解它。

jQuery scroll() detect when user stops scrolling

http://gabrieleromanato.name/jquery-check-if-users-stop-scrolling/

希望我的回答对您有所帮助。谢谢,干杯!