Reputation: 361
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
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
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