当我第一次滚动到它时,如何使菜单 "sticky" 到顶部?

How can I make a menu "sticky" to the top when I scroll to it for the first time?

大家早上好,

我正在使用这个网站。它有几个页面,但是,我希望菜单在您滚动到它并且第一次出现时是粘性的。

这是一个模板,但是当您继续滚动时,菜单会向上滚动并超出视图。

这是菜单代码和 link 站点:http://wtr2022.webparity.net

        <section class="menu-wrap flex-md-column-reverse d-md-flex">
            <nav class="navbar navbar-expand-lg navbar-dark ftco_navbar bg-dark ftco-navbar-light" id="ftco-navbar">
                <div class="container">

                    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#ftco-nav" aria-controls="ftco-nav" aria-expanded="false" aria-label="Toggle navigation">
                        <span class="fa fa-bars"></span> Menu
                    </button>
                    <div class="collapse navbar-collapse" id="ftco-nav">
                        <ul class="navbar-nav mr-auto">
                            <li class="nav-item active"><a href="index.html" class="nav-link">Home</a></li>
                            <li class="nav-item"><a href="about.html" class="nav-link">About</a></li>
                            <li class="nav-item"><a href="services.html" class="nav-link">Services</a></li>
                            <li class="nav-item"><a href="project.html" class="nav-link">Project</a></li>
                            <li class="nav-item"><a href="blog.html" class="nav-link">Blog</a></li>
                            <li class="nav-item"><a href="contact.html" class="nav-link">Contact</a></li>
                        </ul>
                    </div>
                </div>
            </nav>
            <!-- END nav -->
       ....
       </section>

更新:我尝试从此处添加以下代码:Bootstrap Navbar fixed on scrollY > 50, sticky 但它不起作用。您会在 js/wtr-custom.js

下找到此代码
        document.addEventListener("DOMContentLoaded", function () {
            window.addEventListener('scroll', function () {
                if (window.scrollY > 50) {
                    document.getElementById('ftco-navbar').classList.add('fixed-top');
                    // add padding top to show content behind navbar
                    navbar_height = document.querySelector('.navbar').offsetHeight;
                    document.body.style.paddingTop = navbar_height + 'px';
                } else {
                    document.getElementById('ftco-navbar').classList.remove('fixed-top');
                    // remove padding top from body
                    document.body.style.paddingTop = '0';
                }
            });
        });
        // DOMContentLoaded  end

谢谢...

粘性元素在粘附时不会神奇地粘在整个页面上;相反,它会考虑其“父”容器的边界,并且仅在其中“粘性”。一旦您滚动到该父容器并且它超出了您的视口,粘性元素也将超出视口。

“菜单代码”,即您拥有的 <nav> 元素是可以的,如果您将其放置在布局中的不同位置,它会保留下来。 问题似乎是粘性导航栏位于 <section> 容器内,因此粘性导航栏仅粘在该部分“内”。但是一旦您滚动到该部分,您的导航栏也会消失。

我假设您希望它在 滚动到第一个 uppper-most <section> 之后开始粘贴。您可以尝试将导航栏 放在 之外 <section> 元素,这样它的直接“父”容器就是 <body> 元素,看看会发生什么。 我认为这应该可以解决您的示例中的问题。 :)

有关粘性元素的更多 in-depth 阅读,请看这里: https://elad.medium.com/css-position-sticky-how-it-really-works-54cd01dc2d46

更新: 首先,我实际上认为根本不需要您在更新后发布的 javascript 片段。除非我误解了,否则我认为您的目标是应该工作的相当标准的粘性行为 out-of-the-box。因此,我暂时放弃 javascript。 :)

基本上,您的目标应该是不要将粘性导航栏放在您打算滚动过去的页面的 element/section 内。 这是我在您的示例中看到的站点的过度简化版本:

<body>
  <section>
    This is the slider section
    <sticky-element />
  </section>
  <section>
    This is the "We've been in Serving our Community for nearly 50 years!" section
  </section>
  ...
</body>

所需的调整是将粘性导航栏从任何 container/section 中移出,而不是您打算在某个时候滚动过去。

<body>
  <section>
    This is the slider section
  </section>
  <sticky-element />
  <section>
    This is the "We've been in Serving our Community for nearly 50 years!" section
  </section>
  ...
</body>

这样它仍然会呈现在第一个 slider-section 下方,但一旦你滚动经过它就会开始粘住。

这是我发现的有效方法!

所以,在阿黛尔的帮助下,我找到了这个可爱的小东西FIDDLE

http://jsfiddle.net/CriddleCraddle/Wj9dD/

来自这个 Whosebug 答案:


我使用的 CODE 是从 FIDDLE

稍微修改而来的
        $(window).scroll(function () {
            //if you hard code, then use console
            //.log to determine when you want the
            //nav bar to stick.
            console.log($(window).scrollTop());
            if ($(window).scrollTop() > 699) {
                $('#ftco-navbar').addClass('navbar-fixed');
            }
            if ($(window).scrollTop() < 699) {
                $('#ftco-navbar').removeClass('navbar-fixed');
            }
        });

当我滚动时,我观察了控制台日志的输出,当我达到 700 时,我相应地调整了 > < 使其成为您在上面看到的并且它起作用了!

659.0908813476562
674.54541015625
689.0908813476562
700 <<<<<< THE TARGET
703.6363525390625
717.272705078125

不需要移动 NAV 元素,当我把它放回原来的位置时,一切都就位了。

多亏阿黛尔的灵感和一些调查,我明白了!