Heidi E
Heidi E

Reputation: 361

custom spinner (logo) in Angular

I would like to create a custom spinner/loader in an Angular project. I've searched for this all over, but I can only find help for creating different spinners, but not even one using an image. Can anyone help or point me in the right direction? If I use only CSS and HTML, it doesn't load when I need it to.

Upvotes: 0

Views: 4237

Answers (2)

probin anand
probin anand

Reputation: 134

use this

Html Part where spinner is to be used

 <div class="overlay" *ngIf="showSpinner">
    <div class="spinner-wrapper">
      <app-spinner message="Data Loading"></app-spinner>
    </div>
  </div>

  <div class="loaded-content" [class.blurred]="showSpinner">
  </div>

Css Part

    .overlay {
    position: absolute;
    z-index: 1002;
    background-color: rgba(255, 255, 255, 0.5);
    width: 100%;
    height: 100%;
  }

  .spinner-wrapper {
    display: flex;
    justify-content: center;
    justify-items: center;
  }

Create a spinner component as below

component html

<div class="container">
  <div class="row">
    <div id="loader">
      <div class="dot"></div>
      <div class="dot"></div>
      <div class="dot"></div>
      <div class="dot"></div>
      <div class="dot"></div>
      <div class="dot"></div>
      <div class="dot"></div>
      <div class="dot"></div>
      <div class="loading"></div>
    </div>

    <p class="spinner-message" *ngIf="message && message !== ''">
      {{message}}
    </p>
  </div>
</div> 

Component CSS

#loader {
    bottom: 0;
    height: 175px;
    left: 0;
    margin: auto;
    position: absolute;
    right: 0;
    top: 0;
    width: 175px;
  }

  #loader {
    bottom: 0;
    height: 175px;
    left: 0;
    margin: auto;
    position: absolute;
    right: 0;
    top: 0;
    width: 175px;
  }

  #loader .dot {
    bottom: 0;
    height: 100%;
    left: 0;
    margin: auto;
    position: absolute;
    right: 0;
    top: 0;
    width: 87.5px;
  }

  #loader .dot::before {
    border-radius: 100%;
    content: "";
    height: 87.5px;
    left: 0;
    position: absolute;
    right: 0;
    top: 0;
    transform: scale(0);
    width: 87.5px;
  }

  #loader .dot:nth-child(7n+1) {
    transform: rotate(45deg);
  }

  #loader .dot:nth-child(7n+1)::before {
    animation: 0.8s linear 0.1s normal none infinite running load;
    background: #00ff80 none repeat scroll 0 0;
  }

  #loader .dot:nth-child(7n+2) {
    transform: rotate(90deg);
  }

  #loader .dot:nth-child(7n+2)::before {
    animation: 0.8s linear 0.2s normal none infinite running load;
    background: #00ffea none repeat scroll 0 0;
  }

  #loader .dot:nth-child(7n+3) {
    transform: rotate(135deg);
  }

  #loader .dot:nth-child(7n+3)::before {
    animation: 0.8s linear 0.3s normal none infinite running load;
    background: #00aaff none repeat scroll 0 0;
  }

  #loader .dot:nth-child(7n+4) {
    transform: rotate(180deg);
  }

  #loader .dot:nth-child(7n+4)::before {
    animation: 0.8s linear 0.4s normal none infinite running load;
    background: #0040ff none repeat scroll 0 0;
  }

  #loader .dot:nth-child(7n+5) {
    transform: rotate(225deg);
  }

  #loader .dot:nth-child(7n+5)::before {
    animation: 0.8s linear 0.5s normal none infinite running load;
    background: #2a00ff none repeat scroll 0 0;
  }

  #loader .dot:nth-child(7n+6) {
    transform: rotate(270deg);
  }

  #loader .dot:nth-child(7n+6)::before {
    animation: 0.8s linear 0.6s normal none infinite running load;
    background: #9500ff none repeat scroll 0 0;
  }

  #loader .dot:nth-child(7n+7) {
    transform: rotate(315deg);
  }

  #loader .dot:nth-child(7n+7)::before {
    animation: 0.8s linear 0.7s normal none infinite running load;
    background: magenta none repeat scroll 0 0;
  }

  #loader .dot:nth-child(7n+8) {
    transform: rotate(360deg);
  }

  #loader .dot:nth-child(7n+8)::before {
    animation: 0.8s linear 0.8s normal none infinite running load;
    background: #ff0095 none repeat scroll 0 0;
  }

  #loader .loading {
    background-position: 50% 50%;
    background-repeat: no-repeat;
    bottom: -40px;
    height: 20px;
    left: 0;
    position: absolute;
    right: 0;
    width: 180px;
  }

  @keyframes load {
    100% {
      opacity: 0;
      transform: scale(1);
    }
  }

  @keyframes load {
    100% {
      opacity: 0;
      transform: scale(1);
    }
  }

  .spinner-message {
    text-align: center;
  }

Component ts Part

export class SpinnerComponent implements OnInit {
  @Input() message = '';
  constructor() { }

  ngOnInit() {
  }

}

Upvotes: 0

Engam
Engam

Reputation: 1061

Here is a sample of my code for creating an image spinner in a earlier project in an Angular app (done in pure css/html):

html:

<div *ngIf="loaderPersonInfo" class="spinner">
  <img class="spinner-img" src="../../../assets/img/logo.svg">
</div>

css:

.spinner-img {
  height: 20vh;
  width: 20vh;
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  margin: auto;
  animation: loading-spinner-img 3s linear infinite;
}


@keyframes loading-spinner-img {
  0%, 100% {
    animation-timing-function: cubic-bezier(0.5, 0, 1, 0.5);
  }
  0% {
    transform: rotateY(0deg);
  }
  50% {
    transform: rotateY(1800deg);
    animation-timing-function: cubic-bezier(0, 0.5, 0.5, 1);
  }
  100% {
    transform: rotateY(3600deg);
  }
}

Upvotes: 1

Related Questions