How to add a loading spinner to an Angular Material button (Step-by-step Guide)

Daniel Kreider
Daniel Kreider
Published on October 24th at 7:00am
  • Angular
  • Angular Material
  • Angular Spinner Example

Say, wouldn't it be dandy if the Angular Material button had a loading spinner option?

Well here's the 2-minute guide that will teach you how to add a loading spinner to the Angular Material Button


...wouldn't it be just dandy if the Angular Material library had a button with a loading spinner?

Like maybe a CSS class or attribute that we could toggle?

Something we could flip to put our Angular material button into a loading state?

Instead of ranting I decided to try to build my own solution  -  and succeeded!

Unleash your skills

With no further ado, here's how to add a loading spinner to your Angular Material buttons.

It begins with some CSS.

Our CSS File

@keyframes spinner {
  to {transform: rotate(360deg);}

.spinner:before {
  content: '';
  box-sizing: border-box;
  position: absolute;
  top: 50%;
  left: 50%;
  width: 20px;
  height: 20px;
  margin-top: -10px;
  margin-left: -10px;
  border-radius: 50%;
  border: 2px solid #ffffff;
  border-top-color: #000000;
  animation: spinner .8s linear infinite;

In my case, this CSS would be placed inside of my component's CSS file.

Our HTML File

<div style="text-align:center">
  <button mat-raised-button color="primary" [class.spinner]="loading" [disabled]="loading" (click)="save()">Save</button>

Once again, this would be the HTML file for our component.

Our Typescript file (the logic)

And last of all, our component's Typescript file.

export class AppComponent{
  title = 'hello-world';
  loading = false;

  save(): void {
    this.loading = true;
    // do your saving thing here



I told you. You're welcome. Hope you enjoyed it.

What do you think about this approach to adding a loading spinner to an Angular Material button? Is there a better way? Let me know in the comments below.

Angular Consultant