jquery - 解决 safari 'bounce' 问题

标签 jquery html css

我有一些代码,当用户向下滚动时,我的导航向上(屏幕外)设置动画,当用户向上滚动时,它向下设置动画。

但是,在 Safari 中,当用户以更快的速度向上滚动时,页面会在顶部“弹跳”一点,这使得我的导航在用户位于顶部时动画起来。有办法解决吗?

我的代码

jQuery(document).ready(function($){
var didScroll;
var lastScrollTop = 0;
var delta = 5;
var navbarHeight = $('nav').outerHeight(true);

$(window).scroll(function(event) { didScroll = true; });

setInterval(function() {
if (didScroll) {
  hasScrolled();
  didScroll = false;
}
}, 100);

function hasScrolled() {
if($( window ).width() > 768) {
   var st = $(this).scrollTop();
if (Math.abs(lastScrollTop - st) <= delta)
   return;
if (st > lastScrollTop) {
    // Scroll Down
        $('#screen-nav').removeClass('nav-down').addClass('nav-up');
   } else { 
        $('#screen-nav').removeClass('nav-up').addClass('nav-down');
   }  

 }
 lastScrollTop = st;
 }

});

最佳答案

我真的很惊讶 Safari 向脚本传达负面的过度滚动,因为它是一种非标准技术。然而,我认为你只需要调整你的滚动条件来解决它:

if (st > lastScrollTop && lastScrollTop >= 0 && st > 0) {

这两个额外的检查将确保如果当前滚动位置或之前的滚动位置为负,则菜单不会被上推。

因为我没有 Safari 来测试,我通过获取一个页面并将其主体向下推 100 像素来模拟它,然后通过检查数字 100 而不是 0 来执行测试:

jQuery("body")[0].id = "screen-nav";
jQuery("body").css("margin-top", "100px");

jQuery(document).ready(function($){
    var didScroll;
    var lastScrollTop = 0;
    var delta = 5;
    var navbarHeight = $('nav').outerHeight(true);

    $(window).scroll(function(event) {
        didScroll = true;
    });

    setInterval(function() {
        if (didScroll) {
        hasScrolled();
        didScroll = false;
        }
    }, 100);

    function hasScrolled() {
        if ($(window).width() > 768) {
            var st = $(this).scrollTop();
            if (Math.abs(lastScrollTop - st) <= delta) {
                return;
            }
            if (st > lastScrollTop && lastScrollTop >= 100 && st > 100) {
                $('#screen-nav').removeClass('nav-down').addClass('nav-up');
            } else {
                $('#screen-nav').removeClass('nav-up').addClass('nav-down');
            }
        }
        lastScrollTop = st;
    }
});

我对您同时使用 onscroll 事件 100 毫秒计时器感到有点困惑。您可以使用一个或另一个来实现您的解决方案,但没有必要结合使用两者。我可能会使用 onscroll,因为当用户不滚动时开销较小。只是需要考虑的事情。

关于jquery - 解决 safari 'bounce' 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46067952/

相关文章:

javascript - meteor react 列表转换

jquery - cfc 中出现 500 错误

jQuery 自定义队列

html - 基金会 : about source ordering (no flex grid)

html - 全宽背景图片 - 基础

html - 固定页眉和页脚,页脚不是 100%

html - 包含文本的 .svg 图像,Firefox 中缺少字体系列

javascript - 回调返回真/假

javascript - 单击加载 Google plus javascript 以显示评论

Jquery点击函数+css