Scroll Status

Angular Bootstrap 5 Scroll Status plugin

Scroll Status plugin creates progress bar indicating page or component scroll level.

Angular Scroll status for the latest Bootstrap 5. Creates a progress bar indicating page or component scroll level.

Note: Read the API tab to find all available options and advanced customization


Basic example

The Scroll Status Service provides method to calculate scroll level of page or component.

Set #container template variable on element of your choice and subscribe to getScrollPercentage(container) to get scroll level in return. Set the .scroll-status-progress element's [style.width.%] attribute to the returned value from service in order to dynamically update scroll progress bar.

Some content here

        
            
        <section class="border w-100 p-4">
          <div class="border w-100" style="height: 100px; overflow-y: auto" #container>
            <div class="scroll-status">
              <div
                class="scroll-status-progress bg-primary"
                style="height: 10px"
                [style.width.%]="scrollPercentage$ | async"
              ></div>
            </div>
  
            <div style="height: 400px; width: 100%">
              <p class="mt-2" style="text-align: center">Some content here</p>
            </div>
          </div>
        </section>
        
        
    
        
            
import { Component, ElementRef, OnInit, ViewChild } from '@angular/core';
import { Observable } from 'rxjs';
import { MdbScrollStatusService } from 'mdb-angular-scroll-status';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss'],
})
export class AppComponent implements OnInit {
  @ViewChild('container', { static: true }) container!: ElementRef;

  scrollPercentage$: Observable<number> | null = null;

  constructor(private _scrollStatusService: MdbScrollStatusService) {}

  ngOnInit(): void {
    this.scrollPercentage$ = this._scrollStatusService.getScrollPercentage(
      this.container.nativeElement
    );
  }
}
          
        
    
        
            
        .scroll-status {
          position: sticky;
          z-index: 1020;
          background: #ccc;
          top: 0%;
        }
        
        .scroll-status-progress {
          width: 0%;
        }        
          
        
    

Global example

The getScrollPercentage() method by default calculates the scroll for window or document if function parameter is not provided.

        
            
<div class="container fixed-top" style="top: 2rem">
  <div class="scroll-status">
    <div
      class="scroll-status-progress bg-primary"
      style="height: 10px"
      [style.width.%]="scrollPercentage$ | async"
    ></div>
  </div>
</div>
<div
  style="height: 2160px"
  class="d-flex align-items-center justify-content-center"
>
  <p>Content</p>
</div>

        
    
        
            
import { Component, OnInit } from '@angular/core';
import { Observable } from 'rxjs';
import { MdbScrollStatusService } from 'mdb-angular-scroll-status';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss'],
})
export class AppComponent implements OnInit {
  scrollPercentage$: Observable<number> | null = null;

  constructor(private _scrollStatusService: MdbScrollStatusService) {}

  ngOnInit(): void {
    this.scrollPercentage$ = this._scrollStatusService.getScrollPercentage();
  }
}


        
    
        
            
.scroll-status {
position: sticky;
z-index: 1020;
background: #ccc;
top: 0%;
}

.scroll-status-progress {
width: 0%;
}        

        
    

Styling

Color

Easily change the color of Scroll Status with .bg-* color classes.

Some content here

        
            
          <section class="border w-100 p-4">
            <div class="border w-100" style="height: 100px; overflow-y: auto" #container>
              <div class="scroll-status">
                <div
                  class="scroll-status-progress bg-success"
                  style="height: 10px"
                  [style.width.%]="scrollPercentage$ | async"
                ></div>
              </div>
    
              <div style="height: 400px; width: 100%">
                <p class="mt-2" style="text-align: center">Some content here</p>
              </div>
            </div>
          </section>
          
        
    
        
            
          import { Component, ElementRef, OnInit, ViewChild } from '@angular/core';
          import { Observable } from 'rxjs';
          import { MdbScrollStatusService } from 'mdb-angular-scroll-status';
          
          @Component({
            selector: 'app-root',
            templateUrl: './app.component.html',
            styleUrls: ['./app.component.scss'],
          })
          export class AppComponent implements OnInit {
            @ViewChild('container', { static: true }) container!: ElementRef;
          
            scrollPercentage$: Observable<number> | null = null;
          
            constructor(private _scrollStatusService: MdbScrollStatusService) {}
          
            ngOnInit(): void {
              this.scrollPercentage$ = this._scrollStatusService.getScrollPercentage(
                this.container.nativeElement
              );
            }
          }
            
        
    
        
            
          .scroll-status {
            position: sticky;
            z-index: 1020;
            background: #ccc;
            top: 0%;
          }
          
          .scroll-status-progress {
            width: 0%;
          }        
            
        
    

Position

Change vertical of Scroll Status position by adding styling rule style="top: 10%" to .scroll-status element.

Some content here

        
            
            <div class="border" style="height: 100px; overflow-y: auto;" #container>
              <div class="scroll-status" style="top: 10%">
                <div class="scroll-status-progress bg-success"
                style="height: 10px"
                [style.width.%]="scrollPercentage$ | async"></div>
              </div>
                
              <div style="height: 400px; width: 100%;">
                <p class="mt-2" style="text-align: center;">Some content here</p>
              </div>
            </div>
          
        
    
        
            
          import { Component, ElementRef, OnInit, ViewChild } from '@angular/core';
          import { Observable } from 'rxjs';
          import { MdbScrollStatusService } from 'mdb-angular-scroll-status';
          
          @Component({
            selector: 'app-root',
            templateUrl: './app.component.html',
            styleUrls: ['./app.component.scss'],
          })
          export class AppComponent implements OnInit {
            @ViewChild('container', { static: true }) container!: ElementRef;
          
            scrollPercentage$: Observable<number> | null = null;
          
            constructor(private _scrollStatusService: MdbScrollStatusService) {}
          
            ngOnInit(): void {
              this.scrollPercentage$ = this._scrollStatusService.getScrollPercentage(
                this.container.nativeElement
              );
            }
          }
            
        
    
        
            
          .scroll-status {
            position: sticky;
            z-index: 1020;
            background: #ccc;
            top: 0%;
          }
          
          .scroll-status-progress {
            width: 0%;
          }        
            
        
    

Height

Change height of Scroll Status by adding styling rule style="height: 20px". to .scroll-status-progress element

Some content here

        
            
          <div class="border" style="height: 100px; overflow-y: auto;" #container>
            <div class="scroll-status">
              <div class="scroll-status-progress bg-success"
              style="height: 20px"
              [style.width.%]="scrollPercentage$ | async"></div>
            </div>
              
            <div style="height: 400px; width: 100%;">
              <p class="mt-2" style="text-align: center;">Some content here</p>
            </div>
          </div>
          
        
    
        
            
          import { Component, ElementRef, OnInit, ViewChild } from '@angular/core';
          import { Observable } from 'rxjs';
          import { MdbScrollStatusService } from 'mdb-angular-scroll-status';
          
          @Component({
            selector: 'app-root',
            templateUrl: './app.component.html',
            styleUrls: ['./app.component.scss'],
          })
          export class AppComponent implements OnInit {
            @ViewChild('container', { static: true }) container!: ElementRef;
          
            scrollPercentage$: Observable<number> | null = null;
          
            constructor(private _scrollStatusService: MdbScrollStatusService) {}
          
            ngOnInit(): void {
              this.scrollPercentage$ = this._scrollStatusService.getScrollPercentage(
                this.container.nativeElement
              );
            }
          }
            
        
    
        
            
          .scroll-status {
            position: sticky;
            z-index: 1020;
            background: #ccc;
            top: 0%;
          }
          
          .scroll-status-progress {
            width: 0%;
          }        
            
        
    

Modal

To create modal you can follow our MDB Angular Modal documentation.

One-time modal

Some content here

        
            
          <section class="border w-100 p-4">
            <div class="border w-100" style="height: 100px; overflow-y: auto" #container>
              <div class="scroll-status">
                <div
                  class="scroll-status-progress bg-primary"
                  style="height: 10px"
                  [style.width.%]="scrollPercentage"
                ></div>
              </div>
          
              <div style="height: 400px; width: 100%">
                <p class="mt-2" style="text-align: center">Some content here</p>
              </div>
            </div>
          </section>          
          
        
    
        
            
          import { Component, ElementRef, OnInit, ViewChild } from '@angular/core';
          import { MdbScrollStatusService } from 'mdb-angular-scroll-status';
          import { ModalComponent } from './modal/modal.component';
          import { MdbModalRef, MdbModalService } from 'mdb-angular-ui-kit/modal';
          
          @Component({
            selector: 'app-root',
            templateUrl: './app.component.html',
            styleUrls: ['./app.component.scss'],
          })
          export class AppComponent implements OnInit {
            @ViewChild('container', { static: true }) container!: ElementRef;
          
            scrollPercentage: number = 0;
            modalRef: MdbModalRef<ModalComponent> | null = null;
            isAlreadyOpenedOnce = false;
          
            constructor(
              private _scrollStatusService: MdbScrollStatusService,
              private modalService: MdbModalService
            ) {}
          
            ngOnInit(): void {
              this._scrollStatusService
                .getScrollPercentage(this.container.nativeElement)
                .subscribe((result) => {
                  this.scrollPercentage = result;
                  if (this.scrollPercentage >= 50 && !this.isAlreadyOpenedOnce) {
                    this.openModal();
                    this.isAlreadyOpenedOnce = true;
                  }
                });
            }
          
            openModal() {
              this.modalRef = this.modalService.open(ModalComponent);
            }
          }
          
            
        
    
        
            
          .scroll-status {
            position: sticky;
            z-index: 1020;
            background: #ccc;
            top: 0%;
          }
          
          .scroll-status-progress {
            width: 0%;
          }        
            
        
    

Multiple modal

Some content here

        
            
          <section class="border w-100 p-4">
            <div class="border w-100" style="height: 100px; overflow-y: auto" #container>
              <div class="scroll-status">
                <div
                  class="scroll-status-progress bg-primary"
                  style="height: 10px"
                  [style.width.%]="scrollPercentage"
                ></div>
              </div>
          
              <div style="height: 400px; width: 100%">
                <p class="mt-2" style="text-align: center">Some content here</p>
              </div>
            </div>
          </section>          
          
        
    
        
            
          import { Component, ElementRef, OnInit, ViewChild } from '@angular/core';
import { MdbScrollStatusService } from 'mdb-angular-scroll-status';
import { ModalComponent } from './modal/modal.component';
import { MdbModalRef, MdbModalService } from 'mdb-angular-ui-kit/modal';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss'],
})
export class AppComponent implements OnInit {
  @ViewChild('container', { static: true }) container!: ElementRef;

  scrollPercentage: number = 0;
  modalRef: MdbModalRef<ModalComponent> | null = null;
  isAlreadyOpenedOnce = false;

  constructor(
    private _scrollStatusService: MdbScrollStatusService,
    private modalService: MdbModalService
  ) {}

  ngOnInit(): void {
    this._scrollStatusService
      .getScrollPercentage(this.container.nativeElement)
      .subscribe((result) => {
        this.scrollPercentage = result;
        if (this.scrollPercentage >= 50 && !this.isAlreadyOpenedOnce) {
          this.openModal();
          this.isAlreadyOpenedOnce = true;
        }
        if (this.scrollPercentage < 50 && this.isAlreadyOpenedOnce) {
          this.openModal();
          this.isAlreadyOpenedOnce = false;
        }
      });
  }

  openModal() {
    this.modalRef = this.modalService.open(ModalComponent);
  }
}

            
        
    
        
            
          .scroll-status {
            position: sticky;
            z-index: 1020;
            background: #ccc;
            top: 0%;
          }
          
          .scroll-status-progress {
            width: 0%;
          }        
            
        
    

Scroll status - API


Installation

To install and configure the plugin follow our Plugins Installation Guide. Please remember to update all the plugin names and import paths. You can find all the necessary information in the Import section.

        
            
     npm i git+https://oauth2:ACCESS_TOKEN@git.mdbootstrap.com/mdb/angular/mdb5/plugins/prd/scroll-status
     
        
    

Import

        
            
          import { MdbScrollStatusService } from 'mdb-angular-scroll-status';
          …
          @NgModule ({
            ...
            providers: [MdbScrollStatusService],
            ...
          })
          
        
    

Methods

Name Description Example
getScrollPercentage(container) Get scrollPercentage observable of the given container scrollStatusService.getScrollPercentage(this.container.nativeElement)
getScrollPercentage() Get scrollPercentage observable of window/document scrollStatusService.getScrollPercentage()
        
            
          <div class="border w-100" style="height: 100px; overflow-y: auto" #container>
            <div class="scroll-status">
              <div
                class="scroll-status-progress bg-primary"
                style="height: 10px"
                [style.width.%]="scrollPercentage$ | async"
              ></div>
            </div>
          
            <div style="height: 400px; width: 100%">
              <p class="mt-2" style="text-align: center">Some content here</p>
            </div>
          </div>                            
          
        
    
        
            
          import { Component, ElementRef, OnInit, ViewChild } from '@angular/core';
          import { Observable } from 'rxjs';
          import { MdbScrollStatusService } from 'mdb-angular-scroll-status';
          
          @Component({
            selector: 'app-root',
            templateUrl: './app.component.html',
            styleUrls: ['./app.component.scss'],
          })
          export class AppComponent implements OnInit {
            @ViewChild('container', { static: true }) container!: ElementRef;
          
            scrollPercentage$: Observable<number> | null = null;
          
            constructor(private _scrollStatusService: MdbScrollStatusService) {}
          
            ngOnInit(): void {
              this.scrollPercentage$ = this._scrollStatusService.getScrollPercentage(
                this.container.nativeElement
              );
            }
          }                      
          
        
    
        
            
          .scroll-status {
            position: sticky;
            z-index: 1020;
            background: #ccc;
            top: 0%;
          }
          
          .scroll-status-progress {
            width: 0%;
          }