粘性导航元素在滚动期间跳转

Sticky navigation element jumps during scroll

尤其是在 Firefox 中,我 运行 遇到了一个我不知道如何解决的问题。

在下一页上,当向下滚动时页面会跳转几次 - 主要是在页面没有完整显示的较小屏幕上。您可以通过使浏览器小于页面来重现此问题,因此您必须滚动。

它在这个页面上:http://www.nucanoe.com/frontier-accessories/

如果我禁用导航选择器上的 position:fixed,它可以解决问题 - 但我们需要导航是粘性的。有没有办法解决这个问题?我想我们可能需要以某种方式使用 jQuery。

提前致谢!

当您的导航从相对变为固定时,您需要有一个占位符。 因此,您需要制作一个新的 div.

jQuery(".nav").wrap('<div class="nav-placeholder"></div>');
    jQuery(".nav-placeholder").height(jQuery(".nav").outerHeight());


    jQuery(".nav").wrapInner('<div class="nav-inner"></div>');

记得根据您的需要更改“.nav”、"nav-inner" 和 "nav-placeholder"。

要获得功能齐全的粘性导航,请查看我的网站:http://www.swegre.se/

看到你在另一个答案上寻求帮助,我会尽力为你解释得更清楚。

问题

您的问题是,当您将 position:fixed 添加到导航栏时,它会将其从原来的位置移除并固定在页面顶部。这就是为什么您的其余内容会跳起来的原因 - 因为导航栏已经不在原来的位置了。

如何修复

您可以通过将导航元素包装在一个新的 div 中来解决这个问题 - 我们称之为 nav-wrapper - 并将其高度设置为与您的导航元素相同。这些被称为占位符元素。这个新包装器和您原来的导航栏必须始终具有相同的高度,'jump' 才会消失。

<div class="nav-wrapper" style="height:80px;"> <-- add this

    <div class="your-original-nav" style="height:80px"></div>

</div> <!-- add this

现在,当您将导航栏设置为 fixed 并且它消失在顶部时,我们创建的具有相同高度的新包装器会保持页面内容相同。移除固定的 class 后,它会再次回到包装器中,而不会向下推内容。

一个建议

据我在您的网站上看到的情况,在新的固定导航到达并覆盖该点之前,导航栏所在的位置会有很大的差距。您想要的是一点 jQuery 来找出固定导航的位置以及隐藏导航的位置。我来解释一下:

// cache the element
var $navBar = $('.your-original-nav');

// find original navigation bar position
var navPos = $navBar.offset().top;

// on scroll
$(window).scroll(function() {

    // get scroll position from top of the page
    var scrollPos = $(this).scrollTop();

    // check if scroll position is >= the nav position
    if (scrollPos >= navPos) {
        $navBar.addClass('fixed');
    } else {
        $navBar.removeClass('fixed');
    }

});

您可能希望向该示例添加更多功能,因为它非常非常基础。您可能希望重新计算 window 调整大小时的偏移量作为一个加法。

一个演示

This is a little demo which might help you - 我很无聊但感觉很有帮助 :)

现在这样做:在导航前添加一个元素:

<div class="nav-placeholder"></div>

和 jquery:

<script type="text/javascript">
    $(document).on("scroll",function(){
        if($(document).scrollTop()>150){
            $(".nav-placeholder").height($(".nav").outerHeight());
        } else {
            $(".nav-placeholder").height(0);
        }
    });
</script>

当我向下滚动到 150 时,占位符获得导航的高度,当我再次向上滚动时,我将其高度设置为 0。

这是一个fiddle:https://jsfiddle.net/herrfischerhamburg/562wu62y/

我以不同的方式解决了这个问题,所以在 firefox 上,正如您在日志中看到的那样,它会自行向上滚动,以便停止滚动,我做了简单的声明

$(document).ready(function () {
        var header = $('#left-menu');
        var offset = header.offset().top;
        var up = true;
        $(window).scroll(function () {
            var scroll = $(window).scrollTop();
            console.log(scroll + ' ' + offset )
            if (scroll >= offset) {
                header.addClass('sidebar-sticky');
                if (up){
                    $(window).scrollTop(offset);
                    up=false;

                }


            } else {
                up=true;
                header.removeClass('sidebar-sticky');
            }
        });


    });

当我无法指定我使用的 div 的高度时,该解决方案对我有用。