Infinite scroll
Angular Bootstrap 5 Infinite scroll
This feature adds a scroll event listener (to the window or the component it's attached to if it has the overflow-y property set to scroll) and calls a callback method every time a user reaches an end of a page/container.
Note: Read the API tab to find all available options and advanced customization
Basic example
Scroll down the container below to add more items.
Note: Your element should be scrollable, for example, it should have
overflow-y: scroll
property like in the example below.
- Angry
- Dizzy
- Flushed
- Frown
- Grimace
- Grin
<div style="width: 200px">
<ul
mdbInfiniteScroll
(infiniteScrollCompleted)="onComplete()"
class="container list-group"
style="max-height: 261px; overflow-y: scroll"
>
<li *ngFor="let icon of icons" class="list-group-item d-flex align-items-center">
<i class="far fa-{{ icon.toLowerCase() }} fa-3x me-4"></i> {{ icon }}
</li>
</ul>
</div>
import { Component } from '@angular/core';
@Component({
selector: 'app-infinite-scroll',
templateUrl: './infinite-scroll.component.html',
styleUrls: ['./infinite-scroll.component.scss'],
})
export class InfiniteScrollComponent {
icons = ['Angry', 'Dizzy', 'Flushed', 'Frown', 'Grimace', 'Grin'];
iconsToLoad = [
'Sad-Tear',
'Meh-Blank',
'Smile-Wink',
'Tired',
'Surprise',
'Kiss-Beam',
'Laugh-Squint',
];
index = 0;
constructor() {}
onComplete(): void {
if (this.index < this.iconsToLoad.length) {
this.icons.push(this.iconsToLoad[this.index]);
this.index++;
}
}
}
Direction
Use [direction]
input to define the scrolling direction.
<div
mdbInfiniteScroll
[direction]="'horizontal'"
(infiniteScrollCompleted)="onComplete()"
class="py-3 text-center"
style="max-width: 1500px; overflow-x: scroll; white-space: nowrap"
>
<span *ngFor="let icon of icons" class="mx-5"
><i class="far fa-{{ icon.toLowerCase() }} fa-3x me-4"></i> {{ icon }}</span
>
</div>
import { Component } from '@angular/core';
@Component({
selector: 'app-infinite-scroll',
templateUrl: './infinite-scroll.component.html',
styleUrls: ['./infinite-scroll.component.scss'],
})
export class InfiniteScrollComponent {
icons = ['Angry', 'Dizzy', 'Flushed', 'Frown', 'Grimace', 'Grin'];
iconsToLoad = [
'Sad-Tear',
'Meh-Blank',
'Smile-Wink',
'Tired',
'Surprise',
'Kiss-Beam',
'Laugh-Squint',
];
index = 0;
constructor() {}
onComplete(): void {
if (this.index < this.iconsToLoad.length) {
this.icons.push(this.iconsToLoad[this.index]);
this.index++;
}
}
}
Spinners and asynchronous data
<div
class="infinite-scroll py-3 text-center"
mdbInfiniteScroll
(infiniteScrollCompleted)="onComplete()"
style="max-height: 500px; overflow-y: scroll"
>
<div id="images">
<img *ngFor="let image of images" [src]="image" class="img-fluid mb-3" />
</div>
<div *ngIf="loading" class="spinner-border mx-auto" id="spinner"></div>
</div>
import { Component } from '@angular/core';
@Component({
selector: 'app-infinite-scroll',
templateUrl: './infinite-scroll.component.html',
styleUrls: ['./infinite-scroll.component.scss'],
})
export class InfiniteScrollComponent {
images = [
'https://mdbootstrap.com/img/Photos/Slides/img%20(100).webp',
'https://mdbootstrap.com/img/Photos/Slides/img%20(105).webp',
'https://mdbootstrap.com/img/Photos/Slides/img%20(107).webp',
];
imagesToLoad = [
'https://mdbootstrap.com/img/Photos/Slides/img%20(103).webp',
'https://mdbootstrap.com/img/Photos/Slides/img%20(104).webp',
'https://mdbootstrap.com/img/Photos/Slides/img%20(108).webp',
'https://mdbootstrap.com/img/Photos/Slides/img%20(109).webp',
'https://mdbootstrap.com/img/Photos/Slides/img%20(110).webp',
];
index = 0;
loading = false;
constructor() {}
onComplete(): void {
if (this.index < this.imagesToLoad.length) {
this.loading = true;
// Simulate async loading
setTimeout(() => {
this.images.push(this.imagesToLoad[this.index]);
this.indexx++;
this.loading = false;
}, 1500);
}
}
}
Infinite scroll - API
Import
import { MdbInfiniteScrollModule } from 'mdb-angular-ui-kit/infinite-scroll';
…
@NgModule ({
...
imports: [MdbInfiniteScrollModule],
...
})
Inputs
Name | Type | Default | Description |
---|---|---|---|
direction
|
MdbInfiniteScrollDirection | 'vertical' |
Defines scroll direction (horizontal or vertical) |
window
|
boolean | false |
Defines window as a scroll container |
Outputs
Name | Type | Description |
---|---|---|
infiniteScrollCompleted
|
EventEmitter<any> | Event fired when scroll reaches bottom of a container |
<div style="width: 200px">
<ul
mdbInfiniteScroll
(infiniteScrollCompleted)="onComplete()"
class="container list-group"
style="max-height: 261px; overflow-y: scroll"
>
<li *ngFor="let icon of icons" class="list-group-item d-flex align-items-center">
<i class="far fa-{{ icon.toLowerCase() }} fa-3x me-4"></i> {{ icon }}
</li>
</ul>
</div>
import { Component } from '@angular/core';
@Component({
selector: 'app-infinite-scroll',
templateUrl: './infinite-scroll.component.html',
styleUrls: ['./infinite-scroll.component.scss'],
})
export class InfiniteScrollComponent {
icons = ['Angry', 'Dizzy', 'Flushed', 'Frown', 'Grimace', 'Grin'];
iconsToLoad = [
'Sad-Tear',
'Meh-Blank',
'Smile-Wink',
'Tired',
'Surprise',
'Kiss-Beam',
'Laugh-Squint',
];
index = 0;
constructor() {}
onComplete(): void {
if (this.index < this.iconsToLoad.length) {
this.icons.push(this.iconsToLoad[this.index]);
this.index++;
}
}
}