Bootstrap - Scroll spy Plugin

The Scroll spy (auto updating nav) plugin allows you to target sections of the page based on the scroll position. In its basic implementation, as you scroll, you can add .active classes to the navbar based on the scroll position.

If you want to include this plugin functionality individually, then you will need scrollspy.js. Else, as mentioned in the chapter Bootstrap Plugins Overview, you can include bootstrap.js or the minifiedbootstrap.min.js.

Usage

You can add scrollspy behavior to your topbar navigation −

·        Via data attributes − add data-spy = "scroll" to the element you want to spy on (typically the body). Then add attribute data-targetwith the ID or class of the parent element of any Bootstrap .navcomponent. For this to work, you must have elements in the body of the page that have matching IDs of the links that you are spying on.

<body data-spy = "scroll" data-target = ".navbar-example">

   ...

   <div class = "navbar-example">

      <ul class = "nav nav-tabs">

         ...

      </ul>

   </div>

   ...

</body>

·        Via JavaScript − You can invoke the scrollspy with JavaScript instead of using the data attributes, by selecting the element to spy on, and then invoking the .scrollspy() function −

$('body').scrollspy({ target: '.navbar-example' })

Example

The following example shows the use of scrollspy plugin via data attributes −

<nav id = "navbar-example" class = "navbar navbar-default navbar-static" role = "navigation">

  

   <div class = "navbar-header">

      <button class = "navbar-toggle" type = "button" data-toggle = "collapse"

         data-target = ".bs-js-navbar-scrollspy">

         <span class = "sr-only">Toggle navigation</span>

         <span class = "icon-bar"></span>

         <span class = "icon-bar"></span>

         <span class = "icon-bar"></span>

      </button>

                       

      <a class = "navbar-brand" href = "#">Tutorial Name</a>

   </div>

  

   <div class = "collapse navbar-collapse bs-js-navbar-scrollspy">

      <ul class = "nav navbar-nav">

         <li><a href = "#ios">iOS</a></li>

         <li><a href = "#svn">SVN</a></li>

        

         <li class = "dropdown">

            <a href = "#" id = "navbarDrop1" class = "dropdown-toggle" data-toggle = "dropdown">

               Java

               <b class = "caret"></b>

            </a>

           

            <ul class = "dropdown-menu" role = "menu" aria-labelledby = "navbarDrop1">

               <li><a href = "#jmeter" tabindex = "-1">jmeter</a></li>

               <li><a href = "#ejb" tabindex = "-1">ejb</a></li>

              

               <li class = "divider"></li>

               <li><a href = "#spring" tabindex = "-1">spring</a></li>

            </ul>

           

         </li>

      </ul>

   </div>

  

</nav>

 

<div data-spy = "scroll" data-target = "#navbar-example" data-offset = "0"

   style = "height:200px; overflow:auto; position: relative;">

   <h4 id = "ios">iOS</h4>

           

   <p>iOS is a mobile operating system developed and distributed by Apple

      Inc. Originally released in 2007 for the iPhone, iPod Touch, and Apple

      TV. iOS is derived from OS X, with which it shares the Darwin

      foundation. iOS is Apple's mobile version of the OS X operating system

      used on Apple computers.</p>

  

   <h4 id = "svn">SVN</h4>

  

   <p>Apache Subversion which is often abbreviated as SVN, is a software

      versioning and revision control system distributed under an open source

      license. Subversion was created by CollabNet Inc. in 2000, but now it

      is developed as a project of the Apache Software Foundation, and as

      such is part of a rich community of developers and users.</p>

  

   <h4 id = "jmeter">jMeter</h4>

  

   <p>jMeter is an Open Source testing software. It is 100% pure Java

      application for load and performance testing.</p>

  

   <h4 id = "ejb">EJB</h4>

  

   <p>Enterprise Java Beans (EJB) is a development architecture for building

      highly scalable and robust enterprise level applications to be deployed

      on J2EE compliant Application Server such as JBOSS, Web Logic etc.</p>

  

   <h4 id = "spring">Spring</h4>

  

   <p>Spring framework is an open source Java platform that provides

      comprehensive infrastructure support for developing robust Java

      applications very easily and very rapidly.</p>

  

   <p>Spring framework was initially written by Rod Johnson and was first

      released under the Apache 2.0 license in June 2003.</p>

  

</div>

Options

Options can be passed via data attributes or JavaScript. Following table lists the options −

Option Name

Type/Default Value

Data attribute name

Description

offset

numberDefault: 10

data-offset

Pixels to offset from top when calculating position of scroll.

Methods

.scrollspy('refresh') − When calling the scrollspy via the JavaScript method, you need to call the .refresh method to update the DOM. This is helpful if any elements of the DOM have changed i.e if you have added or removed some elements. Following would be the syntax to use this method.

$('[data-spy = "scroll"]').each(function () {

   var $spy = $(this).scrollspy('refresh')

})

Example

The following example demonstrates the use of .scrollspy('refresh') method −

<nav id = "myScrollspy" class = "navbar navbar-default navbar-static" role = "navigation">

  

   <div class = "navbar-header">

      <button class = "navbar-toggle" type = "button" data-toggle = "collapse"

         data-target = ".bs-js-navbar-scrollspy">

         <span class = "sr-only">Toggle navigation</span>

         <span class = "icon-bar"></span>

         <span class = "icon-bar"></span>

         <span class = "icon-bar"></span>

      </button>

                       

      <a class = "navbar-brand" href = "#">Tutorial Name</a>

   </div>

  

   <div class = "collapse navbar-collapse bs-js-navbar-scrollspy">

      <ul class = "nav navbar-nav">

         <li class = "active"><a href = "#ios">iOS</a></li>

         <li><a href = "#svn">SVN</a></li>

        

         <li class = "dropdown">

            <a href = "#" id = "navbarDrop1" class = "dropdown-toggle" data-toggle  = "dropdown">

               Java

               <b class = "caret"></b>

            </a>

           

            <ul class = "dropdown-menu" role = "menu" aria-labelledby = "navbarDrop1">

               <li><a href = "#jmeter" tabindex = "-1">jmeter</a></li>

               <li><a href = "#ejb" tabindex = "-1">ejb</a></li>

              

               <li class = "divider"></li>

               <li><a href = "#spring" tabindex = "-1">spring</a></li>

            </ul>

           

         </li>

      </ul>

   </div>

  

</nav>

 

<div data-spy = "scroll" data-target = "#myScrollspy" data-offset = "0" 

   style = "height:200px; overflow:auto; position: relative;">

  

   <div class = "section">

      <h4 id = "ios">iOS<small><a href = "#" onclick = "removeSection(this);">

         &times; Remove this section</a></small>

      </h4>

     

      <p>iOS is a mobile operating system developed and distributed by

         Apple Inc. Originally released in 2007 for the iPhone, iPod Touch, and

         Apple TV. iOS is derived from OS X, with which it shares the Darwin

         foundation. iOS is Apple's mobile version of the OS X operating system

         used on Apple computers.</p>

   </div>

  

   <div class = "section">

      <h4 id = "svn">SVN<small></small></h4>

      <p>Apache Subversion which is often abbreviated as SVN, is a software

         versioning and revision control system distributed under an open source

         license. Subversion was created by CollabNet Inc. in 2000, but

         now it is developed as a project of the Apache Software Foundation,

         and as such is part of a rich community of developers and users.</p>

   </div>

  

   <div class = "section">

      <h4 id = "jmeter">jMeter<small><a href = "#" onclick = "removeSection(this);">

         &times; Remove this section</a></small>

      </h4>

     

      <p>jMeter is an Open Source testing software. It is 100% pure Java

         application for load and performance testing.</p>

   </div>

  

   <div class = "section">

      <h4 id = "ejb">EJB</h4>

     

      <p>Enterprise Java Beans (EJB) is a development architecture for

         building highly scalable and robust enterprise level applications

         to be deployed on J2EE compliant Application Server such as

         JBOSS, Web Logic etc.</p>

   </div>

           

   <div class = "section">

      <h4 id = "spring">Spring</h4>

     

      <p>Spring framework is an open source Java platform that provides

         comprehensive infrastructure support for developing robust Java

         applications very easily and very rapidly.</p>

     

      <p>Spring framework was initially written by Rod Johnson and was first

         released under the Apache 2.0 license in June 2003.</p>

   </div>

  

</div>

 

<script type = "text/javascript">

   $(function(){

      removeSection = function(e) {

         $(e).parents(".section").remove();

        

         $('[data-spy = "scroll"]').each(function () {

            var $spy = $(this).scrollspy('refresh')

         });

      }

      $("#myScrollspy").scrollspy();

   });

</script>

Events

The following table lists the events to work with scrollspy. This event may be used to hook into the function.

Event

Description

Example

activate.bs.scrollspy

This event fires whenever a new item becomes activated by the scrollspy.

$('#myScrollspy').on('activate.bs.scrollspy', function () {

   // do something…

})

Example

The following example demonstrates the use of activate.bs.scrollspy event −

<html>

  

   <head>

      <link rel = "stylesheet" href = "bootstrap/css/bootstrap.min.css">

      <script src = "bootstrap/scripts/jquery.min.js"></script>

      <script src = "bootstrap/js/bootstrap.min.js"></script>

     

      <script>

         $(document).ready(function(){

            removeSection = function(e) {

               $(e).parents(".subject").remove();

           

               $('[data-spy="scroll"]').each(function () {

                  var $spy = $(this).scrollspy('refresh')

               });

            }

        

            $("#Navexample").scrollspy();

        

            // The event is fired when an item gets actived with the scrollspy

            $("#Navexample").on('activate.bs.scrollspy', function () {

               var currentSection = $(".nav li.active > a").text();

               $("#spyevent").html("Current Item being viewed >> " + currentSection);

            })

                                                

         });

      </script>

  

      <style>

         .scroll-box {

            height: 250px;

            position: relative;

            overflow: auto;

            font-size:2em;

         }

      </style>

     

   </head>

  

   <body>

      <div class = "container">

         <nav id = "Navexample" class = "navbar navbar-default" role = "navigation">

     

            <!-- Nav Bar -->

            <div class = "navbar-header">

               <button type = "button" class = "navbar-toggle"

                  data-toggle = "collapse" data-target = "#navbarCollapse">

              

                  <span class = "sr-only">Toggle navigation</span>

                  <span class = "icon-bar"></span>

                  <span class = "icon-bar"></span>

                  <span class = "icon-bar"></span>

               </button>

                                                            

               <a class = "navbar-brand" href = "#">Tutorials Point</a>

            </div>

           

            <!-- Links and Sublinks -->

            <div class = "collapse navbar-collapse" id = "navbarCollapse">

               <ul class = "nav navbar-nav">

                  <li class = "active"><a href = "#subject-1">Subject 1</a></li>

                  <li><a href = "#subject-2">Subject 2</a></li>

               

                  <li class = "dropdown"><a href = "#" class = "dropdown-toggle"

                     data-toggle = "dropdown">Subject 3<b class = "caret"></b></a>

                    

                     <ul class = "dropdown-menu">

                        <li><a href = "#subject-3-1">Subject 3.1</a></li>

                        <li><a href = "#subject-3-2">Subject 3.2</a></li>

                        <li><a href = "#subject-3-3">Subject 3.3</a></li>

                     </ul>

                     

                  </li>

                                                                        

                  <li><a href = "#subject-4">Subject 4</a></li>

               </ul>

            </div>

           

         </nav>

        

         <div class = "scroll-box" data-spy = "scroll" data-offset = "0">

            <div class = "subject">

           

               <h3 id = "subject-1">Subject 1

                  <small><a href = "#" onclick = "removeSubject(this);">Remove Subject ×</a></small>

               </h3>

           

               <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit,

                  sed do eiusmod tempor incididunt ut labore et dolore magna

                  aliqua. Ut enim ad minim veniam, quis nostrud exercitation

                  ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>

            </div>

                                                

            <hr>

        

            <div class = "subject">

               <h3 id = "subject-2">Subject 2

                  <small><a href = "#" onclick = "removeSubject(this);">Remove Subject ×</a></small>

               </h3>

           

               <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit,

                  sed do eiusmod tempor incididunt ut labore et dolore magna

                  aliqua. Ut enim ad minim veniam, quis nostrud exercitation

                  ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>

            </div>

                                                

            <hr>

        

            <div class = "subject">

               <h3 id = "subject-3">Subject 3

                  <small><a href = "#" onclick = "removeSubject(this);"> Remove Subject ×</a></small>

               </h3>

           

               <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit,

                  sed do eiusmod tempor incididunt ut labore et dolore magna

                  aliqua. Ut enim ad minim veniam, quis nostrud exercitation

                  ullamco laboris nisi ut aliquip ex ea commodo consequat.</p><

            </div>

                                                

            <hr>

           

            <div class = "subject">

               <h4 id = "subject-3-1">Subject 3.1

                  <small><a href = "#" onclick = "removeSubject(this);"> Remove Subject ×</a></small>

               </h4>

              

               <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit,

                  sed do eiusmod tempor incididunt ut labore et dolore magna

                  aliqua. Ut enim ad minim veniam, quis nostrud exercitation

                  ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>

            </div>

           

            <div class = "subject">

               <h4 id = "subject-3-2">Subject 3.2

                  <small><a href = "#" onclick = "removeSubject(this);"> Remove Subject ×</a></small>

               </h4>

              

               <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit,

                  sed do eiusmod tempor incididunt ut labore et dolore magna

                  aliqua. Ut enim ad minim veniam, quis nostrud exercitation

                  ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>

            </div>

           

            <div class = "subject">

               <h4 id = "subject-3-3">Subject 3.3

                  <small><a href = "#" onclick = "removeSubject(this);">Remove Subject ×</a></small>

               </h4>

              

               <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit,

                  sed do eiusmod tempor incididunt ut labore et dolore magna

                  aliqua. Ut enim ad minim veniam, quis nostrud exercitation

                  ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>

            </div>

                                                

            <hr>

           

            <div class = "subject">

               <h3 id = "subject-4">Subject 4

                  <small><a href = "#" onclick = "removeSubject(this);">Remove Subject ×</a></small>

               </h3>

              

               <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit,

                  sed do eiusmod tempor incididunt ut labore et dolore magna

                  aliqua. Ut enim ad minim veniam, quis nostrud exercitation

                  ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>

            </div>

           

         </div>

         <hr>

        

         <h4 id = "spyevent" class = "text-info"></h4>

      </div>

     

   </body>

</html>