React Bootstrap Scrollspy MDB Pro component

React Scrollspy - Bootstrap 4 & Material Design

Note: We are transitioning MDB4 to a legacy version and focusing on developing MDB5. While we'll continue to support for the transition period, we encourage you to migrate to MDB5. We're offering a 50% discount on MDB5 PRO to help with your transition, enabling you to leverage the full potential of the latest version. You can find more information here.
get 50% discount on MDB5 PRO

React Bootstrap scrollspy autmatically updates tabs, navigation or list group components based on scroll position to indicate which link is currently active in the viewport.



Example with list group

Scrollspy also works with ListGroup. Scroll the area next to the list group and watch the active class change.

section1

Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.

Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.

section2

Veniam marfa mustache skateboard, adipisicing fugiat velit pitchfork beard. Freegan beard aliqua cupidatat mcsweeney's vero. Cupidatat four loko nisi, ea helvetica nulla carles. Tattooed cosby sweater food truck, mcsweeney's quis non freegan vinyl. Lo-fi wes anderson +1 sartorial. Carles non aesthetic exercitation quis gentrify. Brooklyn adipisicing craft beer vice keytar deserunt.

Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.

section3

Occaecat commodo aliqua delectus. Fap craft beer deserunt skateboard ea. Lomo bicycle rights adipisicing banh mi, velit ea sunt next level locavore single-origin coffee in magna veniam. High life id vinyl, echo park consequat quis aliquip banh mi pitchfork. Vero VHS est adipisicing. Consectetur nisi DIY minim messenger bag. Cred ex in, sustainable delectus consectetur fanny pack iphone.

Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.

section4

Veniam marfa mustache skateboard, adipisicing fugiat velit pitchfork beard. Freegan beard aliqua cupidatat mcsweeney's vero. Cupidatat four loko nisi, ea helvetica nulla carles. Tattooed cosby sweater food truck, mcsweeney's quis non freegan vinyl. Lo-fi wes anderson +1 sartorial. Carles non aesthetic exercitation quis gentrify. Brooklyn adipisicing craft beer vice keytar deserunt.

Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.

        
            
            import React from "react";
            import { MDBScrollspyBox, MDBScrollspyText, MDBListGroup, MDBListGroupItem, MDBRow, MDBCol } from "mdbreact";
  
            class ScrollSpyPage extends React.Component {
              constructor(props) {
                super(props);
                this.state = {
                  active: 0,
                  sections: []
                };
  
                this.scrollSpyText = React.createRef();
              }
  
            componentDidMount() {
              let sections = this.scrollSpyText.current.getElementsByTagName("h4");
              this.setState({ sections });
            }
  
            handleScroll = (e) => {
              const scrollTop = e.target.scrollTop;
              const sections = this.state.sections;
              const lastIndex = sections.length - 1;
  
              for (let i = 0; i < lastIndex; i++) {
                if ((scrollTop> sections[i].offsetTop - 20) && (scrollTop < sections[i +1].offsetTop - 20)) {
                  this.setState({ active: i });
                }
              };
  
              if (scrollTop> sections[lastIndex].offsetTop - 20) this.setState({ active: lastIndex });
            }
  
            render() {
              return (
                <MDBScrollspyBox>
                  <MDBRow>
                    <MDBCol md="3">
                      <MDBListGroup>
                        <MDBListGroupItem href="#section1" active={this.state.active===0}>section1</MDBListGroupItem>
                        <MDBListGroupItem href="#section2" active={this.state.active===1}>section2</MDBListGroupItem>
                        <MDBListGroupItem href="#section3" active={this.state.active===2}>section3</MDBListGroupItem>
                        <MDBListGroupItem href="#section4" active={this.state.active===3}>section4</MDBListGroupItem>
                      </MDBListGroup>
                    </MDBCol>
                    <MDBCol>
                      <MDBScrollspyText onScroll={this.handleScroll} scrollSpyRef={this.scrollSpyText}>
                        <h4 id="section1">section1</h4>
                        <p>
                          Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr
                          enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle
                          rights whatever. Anim keffiyeh carles cardigan. Velit seitan
                          mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean
                          shorts, williamsburg hoodie minim qui you probably haven't heard
                          of them et cardigan trust fund culpa biodiesel wes anderson
                          aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh
                          artisan ullamco consequat.
                        </p>
                        <p>
                          Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr
                          enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle
                          rights whatever. Anim keffiyeh carles cardigan. Velit seitan
                          mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean
                          shorts, williamsburg hoodie minim qui you probably haven't heard
                          of them et cardigan trust fund culpa biodiesel wes anderson
                          aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh
                          artisan ullamco consequat.
                        </p>
                        <h4 id="section2">section2</h4>
                        <p>
                          Veniam marfa mustache skateboard, adipisicing fugiat velit
                          pitchfork beard. Freegan beard aliqua cupidatat mcsweeney's vero.
                          Cupidatat four loko nisi, ea helvetica nulla carles. Tattooed
                          cosby sweater food truck, mcsweeney's quis non freegan vinyl.
                          Lo-fi wes anderson +1 sartorial. Carles non aesthetic exercitation
                          quis gentrify. Brooklyn adipisicing craft beer vice keytar
                          deserunt.
                        </p>
                        <p>
                          Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr
                          enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle
                          rights whatever. Anim keffiyeh carles cardigan. Velit seitan
                          mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean
                          shorts, williamsburg hoodie minim qui you probably haven't heard
                          of them et cardigan trust fund culpa biodiesel wes anderson
                          aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh
                          artisan ullamco consequat.
                        </p>
                        <h4 id="section3">section3</h4>
                        <p>
                          Occaecat commodo aliqua delectus. Fap craft beer deserunt
                          skateboard ea. Lomo bicycle rights adipisicing banh mi, velit ea
                          sunt next level locavore single-origin coffee in magna veniam.
                          High life id vinyl, echo park consequat quis aliquip banh mi
                          pitchfork. Vero VHS est adipisicing. Consectetur nisi DIY minim
                          messenger bag. Cred ex in, sustainable delectus consectetur fanny
                          pack iphone.
                        </p>
                        <p>
                          Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr
                          enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle
                          rights whatever. Anim keffiyeh carles cardigan. Velit seitan
                          mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean
                          shorts, williamsburg hoodie minim qui you probably haven't heard
                          of them et cardigan trust fund culpa biodiesel wes anderson
                          aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh
                          artisan ullamco consequat.
                        </p>
                        <h4 id="section4">section4</h4>
                        <p>
                          Veniam marfa mustache skateboard, adipisicing fugiat velit
                          pitchfork beard. Freegan beard aliqua cupidatat mcsweeney's vero.
                          Cupidatat four loko nisi, ea helvetica nulla carles. Tattooed
                          cosby sweater food truck, mcsweeney's quis non freegan vinyl.
                          Lo-fi wes anderson +1 sartorial. Carles non aesthetic exercitation
                          quis gentrify. Brooklyn adipisicing craft beer vice keytar
                          deserunt.
                        </p>
                        <p>
                          Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr
                          enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle
                          rights whatever. Anim keffiyeh carles cardigan. Velit seitan
                          mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean
                          shorts, williamsburg hoodie minim qui you probably haven't heard
                          of them et cardigan trust fund culpa biodiesel wes anderson
                          aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh
                          artisan ullamco consequat.
                        </p>
                      </MDBScrollspyText>
                    </MDBCol>
                  </MDBRow>
                </MDBScrollspyBox>
                );
              }
            }
  
            export default ScrollSpyPage;
          
        
    

React Scrollspy - API

In this section you will find advanced information about the Scrollspy component. You will learn which modules are required in this component, what are the possibilities of configuring the component, and what events and methods you can use in working with it.


Import statement

React scrollspy can use other components, like ListGropu or Navbar in addition to present current scroll location, so rememeber about proper imports.

Main Scrollspy components:

        
            
            import { MDBScrollspyBox, MDBScrollspyList, MDBScrollspyListItem, MDBScrollspyText  } from "mdbreact";
          
        
    

Import statement

In order to use Scrollspay you have to define scrollable container, and sections inside of it and determine which section is visible.

Our suggestion is to use React ref to watch it's offsetTop property. Then we compare it with offsetTop of nested sections to determine which is active.

Also rememeber that Scrollspy elements (sections and navigation) have to be wrapped inside MDBScrollspyBox and sections have to be inside MDBScrollspyTex.

Sample code looks like this:

        
            
          import React from "react";
          import ReactDOM from 'react-dom';
          import {
            MDBScrollspyBox,
            MDBScrollspyList,
            MDBScrollspyListItem,
            MDBScrollspyText
          } from "mdbreact";
          import DocsLink from "../DocsLink";

          class ScrollSpyPage extends React.Component {
          constructor(props) {
            super(props);
            this.state = {
              active: 0,
              sections: []
            };

            this.scrollSpyText = React.createRef();
          }

          componentDidMount() {
            let sections = this.scrollSpyText.current.getElementsByTagName("h4");
            this.setState({ sections });
          }

          handleScroll = (e) => {
            const scrollTop = e.target.scrollTop;
            const sections = this.state.sections;
            const lastIndex = sections.length - 1;

            for (let i = 0; i < lastIndex; i++) { if ((scrollTop> sections[i].offsetTop - 20) && (scrollTop < sections[i +
              1].offsetTop - 20)) { this.setState({ active: i }); } }; if (scrollTop> sections[lastIndex].offsetTop - 20)
              this.setState({ active: lastIndex });
          }

          render() {
            return (
              <MDBScrollspyBox>
                <MDBScrollspyList>
                  <MDBScrollspyListItem href="#section1" active={this.state.active===0}>
                    section1
                  </MDBScrollspyListItem>
                  <MDBScrollspyListItem href="#section2" active={this.state.active===1}>
                    section2
                  </MDBScrollspyListItem>
                  <MDBScrollspyListItem href="#section3" active={this.state.active===2}>
                    section3
                  </MDBScrollspyListItem>
                </MDBScrollspyList>
                <MDBScrollspyText onScroll={this.handleScroll} scrollSpyRef={this.scrollSpyText}>
                  <div id="section1">section1</div>
                  <div id="section2">section2</div>
                  <div id="section3">section3</div>
                </MDBScrollspyText>
              </MDBScrollspyBox>
            );
          }
        }

        export default ScrollSpyPage;

        
        
    

API Reference: ScrollspyBox Properties

The table below shows the configuration options of the MDBScrollspyBox component.

Name Type Default Description Example
className String Adds custom class to the Stepper component <MDBScrollspyBox className="myClass" />

API Reference: ScrollspyText Properties

The table below shows the configuration options of the MDBScrollspyText component.

Name Type Default Description Example
className String Adds custom class to the Stepper component <MDBScrollspyText className="myClass" />
scrollSpyRef oneOfType[function, object] The React Ref which points on to the div wrapping all the scrollspy content <MDBScrollspyText scrollSpyRef={this.scrollspyRef} />

API Reference: ScrollspyList Properties

The table below shows the configuration options of the MDBScrollspyList component.

Name Type Default Description Example
className String Adds custom class to the Stepper component <MDBScrollspyList className="myClass" />
color String default Changes the background color of the tab scrollspy panel <MDBScrollspyList color="indigo" />

API Reference: ScrollspyListItem Properties

The table below shows the configuration options of the MDBScrollspyListItem component.

Name Type Default Description Example
active Boolean false Sets active state of the list item <MDBScrollspyListItem active={true} />
className String Adds custom class to the Stepper component <MDBScrollspyListItem className="myClass" />