【问题标题】:How can I add an active class when the user scrolls to a section with smooth scroll?当用户滚动到平滑滚动的部分时,如何添加活动类?
【发布时间】:2019-09-07 14:33:46
【问题描述】:

我正在构建一个简单的单页网站并使用 JQuery 来更改页面上导航链接的颜色。我已经实现了平滑滚动,可以很好地到达每个锚点。我还实现了一项功能,允许用户向下滚动页面并将活动类应用于更改颜色的导航中的锚点。

一切正常……除了: 当您单击导航链接时,活动类未应用于正确的链接。

到目前为止,我已尝试更改应用类的方式以及直接 ID 的名称,但它的行为仍然不完美。 $('.nav li').eq(i).find('a').addClass('active'); 显然发生了一些不正确的事情

谁能建议我如何解决这个问题?

这是带有 html 的 CP: https://codepen.io/nolimit966/pen/aboqvOP

谢谢

JS:

    $(window).on('scroll',function(){
        var WindowTop = $(window).scrollTop();
        $('section').each(function(i){
            if(WindowTop > $(this).offset().top - 50 && 
               WindowTop < $(this).offset().top + $(this).outerHeight(true)
              ){
                $('.nav > li > a').removeClass('active');
     $('.nav li').eq(i).find('a').addClass('active');
            }
        });
    });
          $('a[href*=#]:not([href=#])').click(function() {
            if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') && location.hostname == this.hostname) {
              var target = $(this.hash);
              target = target.length ? target : $('[name=' + this.hash.slice(1) +']');
              if (target.length) {
                $('html,body').animate({
                  scrollTop: target.offset().top
                }, 1000);
                return false;
              }
            }
          });
        });,

HTML:

        <h1>Test</h1>
     </header>
     <nav id="c-primary-nav__list-1" class="c-primary-nav__list">
        <ul class="nav">
           <li class="c-primary-nav__item">
              <a class="c-primary-nav__link" href="#about">About</a>
           </li>
           <li class="c-primary-nav__item">
              <a class="c-primary-nav__link active" href="#reservations">Reservations</a>
           </li>
           <li class="c-primary-nav__item">
              <a class="c-primary-nav__link" href="#contact">Contact</a>
           </li>
           <li class="c-primary-nav__item">
              <a class="c-primary-nav__link" href="#offers">Offers</a>
           </li>
        </ul>
        <div class="c-primary-nav__details">
        </div>
     </nav>
     <div class="l-content-blocks">
        <div class="l-content-blocks__wrapper">
           <section class="cb-about" id="about">
              <div class="cb-about__wrapper">
                 <div class="cb-about__container">
                    <div class="cb-about__intro-wrapper">
                       <h1 class="cb-about__h1" data-aos="fade-up">About </h1>
                    </div>
                    <div class="cb-about__image-showcase">
                       <div data-aos="fade-up" class="cb-about__showcase-item cb-about__showcase-item--image">
                          <div class="c-media" data-push-to-gallery-modal="">
                             </p>
                          </div>
                       </div>
                       <div data-aos="fade-up" class="cb-about__showcase-item cb-about__showcase-item--image">
                          <div class="c-media" data-push-to-gallery-modal="">
                             <p class="c-media__caption">Caption Header <em>Caption Copy</em>
                             </p>
                          </div>
                       </div>
                       <div class="cb-about__showcase-item cb-about__showcase-item--description">
                          <p data-aos="fade-up" class="cb-about__description">Description section 3 </p>
                       </div>
                       <div data-aos="fade-up" class="cb-about__showcase-item cb-about__showcase-item--image">
                          <div class="c-media" data-push-to-gallery-modal="">
                             <p class="c-media__caption">Caption Header <em>Caption copy</em>
                             </p>
                          </div>
                       </div>
                    </div>
                    <div class="cb-about__gallery-button-wrapper">
                       <div class="c-button ">
                          <a class="c-button__link" href="#" target="" data-toggle="c-modal"
                             data-target="#gallery-modal">Gallery CTA text</a>
                       </div>
                    </div>
                 </div>
              </div>
           </section>
           <section class="cb-our-menus" id="menus">
              <div class="cb-our-menus__wrapper">
                 <div class="cb-our-menus__container">
                    <div class="cb-our-menus__intro-wrapper">
                       <h1 class="cb-our-menus__h1">Our Menus</h1>
                    </div>
                    <div class="cb-our-menus__button-grid">
                       <div class="cb-our-menus__button-item">
                       </div>
                       <div class="cb-our-menus__button-item">
                       </div>
                       <div class="cb-our-menus__button-item">
                       </div>
                       <div class="cb-our-menus__button-item">
                       </div>
                       <div class="cb-our-menus__button-item">
                       </div>
                    </div>
                 </div>
              </div>
           </section>
           <section class="cb-offers" id="offers">
              <div class="cb-offers__wrapper">
                 <div class="cb-offers__container">
                    <h1 class="cb-offers__h1">Offer Option Header</h1>
                    <p class="cb-offers__intro intro">Something cool</p>
                    <div class="cb-offers__button-grid">
                       <div class="cb-offers__button-item">
                       </div>
                       <div class="cb-offers__button-item">
                       </div>
                    </div>
                    <div class="cb-offers__image-wrapper">
                       <div class="c-media" data-push-to-gallery-modal="">
                          <p class="c-media__caption">Caption Title <em>Caption Description</em>
                          </p>
                       </div>
                    </div>
                 </div>
              </div>
           </section>
           <section class="cb-reservations" id="reservations">
              <div class="cb-reservations__wrapper">
                 <div class="cb-reservations__container">
                    <h1 class="cb-reservations__h1">Reservations</h1>
                 </div>
              </div>
           </section>
           <section class="cb-contact" id="contact">
              <div class="cb-contact__wrapper">
                 <div class="cb-contact__container">
                    Contact info here
                 </div>
              </div>
              <div class="cb-contact__map-wrapper">
              </div>
           </section>
           <section class="cb-reservations" id="reservations">
              <div class="cb-reservations__wrapper">
                 <div class="cb-reservations__container">
                    <h1 class="cb-reservations__h1">fdsfdsf</h1>
                    <p class="cb-reservations__booking-description">fdsfsdfds</p>
                    <div class="cb-reservations__button-wrapper cb-reservations__button-wrapper--book">
                       <div class="c-button ">
                          <a class="c-button__link highlight"
                             target="">Book Now</a>
                       </div>
                    </div>
                 </div>
              </div>
           </section>
        </div>
        <section class="cb-newsletter">
           <div class="cb-newsletter__wrapper">
              <div class="cb-newsletter__container">
                 <h1 class="cb-newsletter__h1"> Newsletter</h1>
              </div>
           </div>
        </section>
        <section class="cb-signature-dishes">
           <div class="cb-signature-dishes__wrapper">
              <div class="cb-signature-dishes__container">
                 <h1 class="cb-signature-dishes__h1"> Dishes</h1>
              </div>
           </div>
        </section>
     </div>
     <footer>
        &copy;2019 Footer
     </footer>```

【问题讨论】:

    标签: javascript jquery sticky


    【解决方案1】:

    您可以使用 lib 来简化您的实现:

    https://github.com/morr/jquery.appear

    你所有的 javascript 应该是这样的:

            var addClassOnScroll = function () {
                $('section[id]').each(function (index, elem) {
                    if($(elem).is(':appeared')) {
                        const elemId = $(elem).attr('id');
                        $("nav ul li a.active").removeClass('active');
                        $("nav ul li a[href='#" + elemId + "']").addClass('active');
                    }
                });
            };
    
            $(window).on('scroll', function () {
                addClassOnScroll();
            });
    

    不带库的选项:

     var addClassOnScroll = function () {
                var windowTop = $(window).scrollTop();
                $('section[id]').each(function (index, elem) {
                    var offsetTop = $(elem).offset().top;
                    var outerHeight = $(this).outerHeight(true);
    
                    if( windowTop > (offsetTop - 50) && windowTop < ( offsetTop + outerHeight)) {
                        var elemId = $(elem).attr('id');
                        $("nav ul li a.active").removeClass('active');
                        $("nav ul li a[href='#" + elemId + "']").addClass('active');
                    }
                });
            };
    
            $(function () {
                $(window).on('scroll', function () {
                    addClassOnScroll();
                });
            });
    

    【讨论】:

    • 谢谢,但不幸的是我不能/不想使用另一个库,因为页面已经使用了 jQuery。滚动视口功能也运行良好。它只是没有正确改变颜色的点击。
    • 添加了不带库的选项
    • 这绝对是完美的。非常非常感谢你!!你将 add 类移到它自己的函数中这一事实比我试图在我正在处理的版本上重复自己要简洁得多。
    • 可以将var windowTop移到函数开头,我编辑了答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    相关资源
    最近更新 更多