A library with more than 50 different loading spinners for Angular 4 - 22. (https://napster2210.github.io/ngx-spinner/)
A library with more than 50 different loading spinners for Angular 4 - 22. (https://napster2210.github.io/ngx-spinner/)
⭐ If this library saves you time, consider supporting its ongoing maintenance:
<ngx-spinner> component, a configuration panel covering every option, and a generated-code panel (HTML template + TypeScript service usage) with one-click copy and a dark/light theme toggle. See Demo.NgxSpinnerService from every component. See HTTP Interceptor.MatDialog and other Angular CDK overlays - the fullscreen spinner now renders in the browser's native top layer via the Popover API, with an opt-out via [usePopover]="false". See Available Options.ng add ngx-spinner - it now works correctly for standalone apps (the Angular default since v17) in addition to NgModule-based apps, and no longer requires passing --project explicitly.Use appropriate version based on your Angular version.
| Angular 22 | Angular 21 | Angular 19 | Angular 18 | Angular 17 |
|---|---|---|---|---|
>=v22.0.0 | >=v21.0.0 | >=v19.0.0 | >=v18.0.0 | >=v17.0.0 |
| Angular 16 | Angular 15 | Angular 14 | Angular 13 | Angular 12 |
|---|---|---|---|---|
>=v16.0.2 | >=v15.0.1 | >=v14.0.0 | >=v13.1.1 | >=v12.0.0 |
| Angular 11 | Angular 10 | Angular 9 | Angular 8 | Angular 6/7 |
|---|---|---|---|---|
>=v11.0.2 | >=v10.0.1 | >=v9.0.1 | v8.1.0 | v7.2.0 |
| Angular 5 | Angular 4 |
|---|---|
>=v1.2.0 | >=v2.0.0 |
![]() Chrome | ![]() Firefox | ![]() IE / Edge | ![]() Safari | ![]() Opera |
|---|---|---|---|---|
| Latest ✔ | Latest ✔ | IE11, Edge ✔ | Latest ✔ | Latest ✔ |
img tagMatDialog and other Angular CDK overlays via the native Popover API, with an opt-outshow()/hide() methods return promisez-indexhide/show the spinnerNgxSpinnerService/<ngx-spinner> usageng add ngx-spinner, for both standalone and NgModule-based appsWorking Demo - a redesigned playground for exploring the library, built entirely with the real ngx-spinner package (not a mockup). It gives you:
<ngx-spinner> component with your chosen options, including a working "Show spinner" trigger for both fullscreen and contained modes.size, color, bdColor (with an opacity slider), fullScreen, name, zIndex, showSpinner, disableAnimation, usePopover, loading text, and a custom-template field for the image/gif use case.NgxSpinnerService usage shown below.ngx-spinner is available via npm and yarn
Using npm:
$ npm install ngx-spinner --save
Using yarn:
$ yarn add ngx-spinner
Using angular-cli:
$ ng add ngx-spinner
Add css animation files to angular.json config
{
"styles": [
"node_modules/ngx-spinner/animations/ball-scale-multiple.css", // ===> Add css file based on your animation name(here it's "ball-scale-multiple")
// You're able to add multiple files if you need
],
}
Import NgxSpinnerModule in in the root module(AppModule):
import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from "@angular/core";
// Import library module
import { NgxSpinnerModule } from "ngx-spinner";
@NgModule({
imports: [
// ...
NgxSpinnerModule,
],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
forRoot method for NgxSpinnerModule and pass configuration object.// Available options
interface NgxSpinnerConfig {
type?: string;
}
// Use in app
@NgModule({
imports: [
NgxSpinnerModule.forRoot({ type: 'ball-scale-multiple' })
]
})
Add NgxSpinnerService service wherever you want to use the ngx-spinner.
import { NgxSpinnerService } from "ngx-spinner";
class AppComponent implements OnInit {
constructor(private spinner: NgxSpinnerService) {}
ngOnInit() {
/** spinner starts on init */
this.spinner.show();
setTimeout(() => {
/** spinner ends after 5 seconds */
this.spinner.hide();
}, 5000);
}
}
Now use in your template
<ngx-spinner type="ball-scale-multiple"></ngx-spinner>
See Demo
NgxSpinnerService.show() Shows the spinnerNgxSpinnerService.hide() Hides the spinnerrgba(51,51,51,0.8) where alpha value(0.8) is opacity of backdropsmall, default, medium, large.
To set size of spinner, default large#ffftrue or false
To enable/disable fullscreen mode(overlay), default trueprimary99999nulltrue or false
To show/hide spinner from template using variabletrue or false
To enable/disable fade animation of spinner, default falsetrue or false
Since Angular CDK v21, overlays like MatDialog render in the browser's native "top layer" by default, which ignores normal z-index stacking. When fullScreen is true (default), ngx-spinner also promotes its overlay into the top layer via the native Popover API so it can render above such overlays, falling back automatically in browsers without Popover API support. Set to false to opt out and use the legacy fixed-position overlay instead. Default true. Has no effect when fullScreen is false. Can also be set globally via provideSpinnerConfig({ usePopover: false }).<ngx-spinner
bdColor="rgba(51,51,51,0.8)"
size="medium"
color="#fff"
type="ball-scale-multiple"
>
<p style="font-size: 20px; color: white">Loading...</p>
</ngx-spinner>
<ngx-spinner
bdColor="rgba(0, 0, 0, 1)"
template="<img src='https://media.giphy.com/media/o8igknyuKs6aY/giphy.gif' />"
>
</ngx-spinner>
HTML code as loading text now, instead of input parameter(loadingText). Check above code for reference.ngx-spinner instance, just add name attribute with ngx-spinner component. But in this case, you've to pass that particular name of a spinner in show/hide method. Check Demoangular.json filethis.spinner.show("mySpinner", {
type: "line-scale-party",
size: "large",
bdColor: "rgba(0, 0, 0, 1)",
color: "white",
template:
"<img src='https://media.giphy.com/media/o8igknyuKs6aY/giphy.gif' />",
});
type will be ball-8bits.ball-8bits animation(e.g. ball-8bits.css)This is entirely optional - NgxSpinnerService and <ngx-spinner> continue to work exactly as before whether or not you use it. If you'd rather not call show()/hide() from every component that makes an HTTP call, you can register the interceptor once and it will show the spinner while requests are in flight and hide it once they've all completed.
It keeps a count of concurrent requests per spinner name, so the spinner only hides after every in-flight request for that name has finished - not just the first one to complete.
import { provideHttpClient, withInterceptors } from "@angular/common/http";
import { ngxSpinnerInterceptor } from "ngx-spinner";
bootstrapApplication(AppComponent, {
providers: [provideHttpClient(withInterceptors([ngxSpinnerInterceptor]))],
});
import { HTTP_INTERCEPTORS } from "@angular/common/http";
import { NgxSpinnerInterceptor } from "ngx-spinner";
@NgModule({
providers: [
{
provide: HTTP_INTERCEPTORS,
useClass: NgxSpinnerInterceptor,
multi: true,
},
],
})
export class AppModule {}
By default the interceptor drives the primary spinner with no extra options. Customize it via provideNgxSpinnerHttpConfig() (or the equivalent NGX_SPINNER_HTTP_CONFIG provider in an NgModule app):
import { provideNgxSpinnerHttpConfig } from "ngx-spinner";
bootstrapApplication(AppComponent, {
providers: [
provideHttpClient(withInterceptors([ngxSpinnerInterceptor])),
provideNgxSpinnerHttpConfig({
name: "httpSpinner", // which spinner to show/hide, default `primary`
spinner: { type: "ball-scale-multiple", color: "#fff" }, // extra show() options
excludedUrls: ["/api/poll", /\/assets\//], // strings or RegExp, matched against the request URL
}),
],
});
Opt a single request out of the interceptor via its HttpContext, regardless of excludedUrls:
import { HttpContext } from "@angular/common/http";
import { NGX_SPINNER_SKIP } from "ngx-spinner";
this.http.get("/api/background-sync", {
context: new HttpContext().set(NGX_SPINNER_SKIP, true),
});
name manually elsewhere (e.g. spinnerService.show('primary') for a non-HTTP reason) while the interceptor is also driving it, the two aren't aware of each other - whichever one hides it last wins. Use a dedicated name for the interceptor via provideNgxSpinnerHttpConfig({ name: '...' }) if you want to avoid that overlap.CUSTOM_ELEMENTS_SCHEMA as your schema in your main module.show() methods in a single component or single function one after another then wrap the show() method within setTimeout() method to avoid any rendering issue.fullScreen: false), in that case your parent element of spinner must have position: relative; style property.ngx-spinner will be maintained under the Semantic Versioning guidelines. Releases will be numbered with the following format:
<major>.<minor>.<patch>
For more information on SemVer, please visit http://semver.org.
Inspired by Load Awesome by Daniel Cardoso.
Thanks Alex Vieira Alencar for helping me with Multiple Spinner Support.
Thanks ennjin for reducing the bundle size.
ngx-spinner is MIT licensed.