Search code examples
jqueryscrollnavbar

window scroll is not working using jquery


I want to add a active class when scroll my page. when href and top navbar id is same then add a active class for highlight this nav

$(document).ready(function(){
        $(window).scroll(function() {
            $.each(items, function(key, value){
               var item = $(value);
               if(window.scrollTop() >= item.offset().top){
                   $('.menu a.active').removeClass('active');
                   var id = item.attr('id');
                   console.log(id);
                   $.each(navItems, function(key, value){
                      var navItem = $(value);
                      if(navItem.attr('href') == '#'+id) navItem.addClass('active');
                    });
                  }
              });
            });
          });
ul.menu{
position: fixed;
top: 0;
}
ul.menu li{
display:inline-block;
list-style: none;
margin-right: 10px;
}

.menu li a{
text-decoration: none;
}

a.active{
color: red;
}

#home{
margin-top: 80px;
}

#home, #profile, #aboutus, #contactus{
min-height: 150px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>


<ul class="menu">
<li><a href="#home" class="active">Home</a></li>
<li><a href="#profile" class=" ">Profile</a></li>
<li><a href="#aboutus" class="">About Us</a></li>
<li><a href="#contactus" class="">Contact Us</a></li>
</ul>

<div id="home">
<h3>this is home</h3>
</div>
<div id="profile">
<h3>this is profile</h3>
</div>
<div id="aboutus">
<h3>this is aboutus</h3>
</div>
<div id="contactus">
<h3>this is contactus</h3>
</div>

Here is above my code but its not working show scrollTop is not a function and class is not added when i scroll the page..


Solution

  • Thank you for providing a working example. Below is working code, had to touch html and css as well (don't forget to update that in your code).

    $(document).ready(function() {
      // cache the navigation links 
      var $navigationLinks = $('#navigation > ul > li > a');
      // cache (in reversed order) the sections
      var $sections = $($(".section").get().reverse());
    
      // map each section id to their corresponding navigation link
      var sectionIdTonavigationLink = {};
      $sections.each(function() {
        var id = $(this).attr('id');
        sectionIdTonavigationLink[id] = $('#navigation > ul > li > a[href=\\#' + id + ']');
      });
    
      function highlightNavigation() {
        // get the current vertical position of the scroll bar
        var scrollPosition = $(window).scrollTop();
    
        // iterate the sections
        $sections.each(function() {
          var currentSection = $(this);
          // get the position of the section
          var sectionTop = currentSection.offset().top;
    
          // if the user has scrolled over the top of the section  
          if (scrollPosition >= sectionTop) {
            // get the section id
            var id = currentSection.attr('id');
            // get the corresponding navigation link
            var $navigationLink = sectionIdTonavigationLink[id];
            // if the link is not active
            if (!$navigationLink.hasClass('active')) {
              // remove .active class from all the links
              $navigationLinks.removeClass('active');
              // add .active class to the current link
              $navigationLink.addClass('active');
            }
            // we have found our section, so we return false to exit the each loop
            return false;
          }
        });
      }
    
      $(window).scroll(highlightNavigation);
    });
    #navigation {
      position: fixed;
    }
    
    ul.menu li {
      display: inline-block;
      list-style: none;
      margin-right: 10px;
    }
    
    .menu li a {
      text-decoration: none;
    }
    
    #home {
      margin-top: 80px;
    }
    
    #home,
    #profile,
    #aboutus,
    #contactus {
      min-height: 150px;
    }
    
    .section {
      height: 700px;
      border: 1px solid black;
    }
    
    .active {
      color: red;
    }
    <div id="navigation">
      <ul class="menu">
        <li><a href="#home" class="active">Home</a></li>
        <li><a href="#profile" class="">Profile</a></li>
        <li><a href="#aboutus" class="">About Us</a></li>
        <li><a href="#contactus" class="">Contact Us</a></li>
      </ul>
    </div>
    <div id="sections">
      <div id="home" class="section">
        <h3>this is home</h3>
      </div>
      <div id="profile" class="section">
        <h3>this is profile</h3>
      </div>
      <div id="aboutus" class="section">
        <h3>this is aboutus</h3>
      </div>
      <div id="contactus" class="section">
        <h3>this is contactus</h3>
      </div>
    </div>
    
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

    The overall answer was inspired from link.