【问题标题】:scrollTop suddenly not working for sticky menuscrollTop 突然不适用于粘性菜单
【发布时间】:2014-07-19 20:47:32
【问题描述】:

我在整个网站构建过程中都没有遇到任何问题。然后,在我应该发布的那一天,粘性菜单停止正常工作。菜单应该从底部开始,滚动到顶部,然后粘贴(位置:固定)。

现在,它会滚动大约 10 像素,然后跳到顶部。为什么 scrollTop 距离计算不正确?

直播网站http://adammarshalltherapy.com

这是粘性菜单的代码。我还使用 JS 将 div 的最小高度设置为窗口高度,但这里没有包含该代码。

$(function(){
    var stickyRibbonTop = $('#wrapper-wcf53badf7ebadf7').offset().top;

    $(window).scroll(function(){
            if( $(window).scrollTop() > stickyRibbonTop ) {
                    $('#wrapper-wcf53badf7ebadf7').css({position: 'fixed', top: '0px', 'background-image':'url(http://amarshall.360zen.com/wp-content/uploads/2014/07/menu-fade-background2.png)'});
                    $('#block-bcf53bf14093931c').css({display: 'block'});
            } else {
                    $('#wrapper-wcf53badf7ebadf7').css({position: 'static', top: '0px','background-image':'none'});
                    $('#block-bcf53bf14093931c').css({display: 'none'});
            }
    });
});

提前感谢您的帮助!我还不是 JS 或 jQuery 专家,所以任何关于清理的建议都将不胜感激。

注意:该站点基于 WordPress 构建,因此无冲突模式有效。

【问题讨论】:

  • 我知道这一点暂时没有帮助:在这种情况下,使用版本控制会派上用场。本周早些时候,我有一个功能突然停止在我身上工作,在回滚了一些提交后,我发现了问题所在。如果你用过 Github 之类的东西(我用的是 Bitbucket),下次调试时可能会对你有所帮助。

标签: javascript jquery menu sticky


【解决方案1】:

我认为您在设置$('big-div') 的最小高度之前正在初始化粘性菜单功能。

在页面加载时,菜单从顶部开始 54px,因此当您将 offset().top 值存储为 stickyRibbonTop 时,它存储在 54px 处。然后在您的滚动事件中,您将与此进行比较。

尝试首先在代码中设置 div 的 min-height,然后再运行相同的脚本。 stickyRibbonTop 的值应该是正确的。

请记住,每次更新 window.height() 时都需要重置 stickyRibbonTop,因此您可能应该将此粘性菜单函数设为命名函数并在 wrapper_height 函数的末尾调用它。像这样:

function stickyNav() {
    var stickyRibbonTop = $('#wrapper-wcf53badf7ebadf7').offset().top;

    $(window).unbind('scroll', scrollEvent);
    $(window).on('scroll', stickyRibbonTop, scrollEvent);
};

function scrollEvent(event) {
    var stickyRibbonTop = event.data;
    if ($(window).scrollTop() > stickyRibbonTop) {
        $('#wrapper-wcf53badf7ebadf7').css({ position: 'fixed', top: '0px', 'background-image': 'url(http://www.adammarshalltherapy.com/wp-content/uploads/2014/07/menu-fade-background2.png)' });
        $('#block-bcf53bf14093931c').css({ display: 'block' });
    }
    else {
        $('#wrapper-wcf53badf7ebadf7').css({ position: 'static', top: '0px', 'background-image': 'none' });
        $('#block-bcf53bf14093931c').css({ display: 'none' });
    }
};

function wrapper_height() {

    var height = $(window).height();
    var wrapperheight = height - 75;
    wrapperheight = parseInt(wrapperheight) + 'px';
    $(".bigDiv").css('min-height', wrapperheight);
    $("#wrapper-wcf53bad125d7d9a").css('height', wrapperheight);

    stickyNav();
}
$(function () {
    wrapper_height();
    $(window).bind('resize', wrapper_height);
});

【讨论】:

  • 我为window.scroll() 事件添加了一个取消绑定,以防止resize() 上的多个绑定。为此,我将实际事件拆分为一个单独的命名函数,以便您可以取消绑定该特定函数,而不是取消绑定到window.scroll() 的所有函数。有更简洁的方法可以做到这一点,但是使用设置代码的方式似乎是最好的解决方案。为stickyRibbonTop 设置一个全局变量并在调整大小时更新此值会更简洁,并且保持实际的滚动事件不变。
  • 太棒了 :) 很高兴为您提供帮助!
猜你喜欢
  • 2013-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多