svg loader
by Alexandru Gatea
HTML
<div class="loader" id="loader">
<svg id="loaderShape" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 109.4">
<path d="M0,0C121.44,0,101.4,109.4,250,109.4S378.56,0,500,0Z" />
</svg>
<div class="loader-content">
<p class="loader-text">Gathering Data</p>
<div class="loader-spinner">
<div class="sk-cube-grid">
<div class="sk-cube sk-cube1"></div>
<div class="sk-cube sk-cube2"></div>
<div class="sk-cube sk-cube3"></div>
<div class="sk-cube sk-cube4"></div>
<div class="sk-cube sk-cube5"></div>
<div class="sk-cube sk-cube6"></div>
<div class="sk-cube sk-cube7"></div>
<div class="sk-cube sk-cube8"></div>
<div class="sk-cube sk-cube9"></div>
</div>
</div>
</div>
</div>
<script>
let toggler = document.getElementsByTagName('body')[0];
let sidebar = document.getElementById('loader');
toggler.addEventListener('click', event => {
sidebar.classList.toggle('visible');
});
</script>
SCSS
@import url('https://fonts.googleapis.com/css2?family=Lato&family=Raleway:wght@400;500;600;700;900&display=swap');
$loaderWidth: 500px;
$loaderContentWidth: 500px;
$brand-dark: #0e0727;
$brand-dark-medium: #221c3a;
$brand-light: #a59fb8;
$brand-accent: #42B98B;
$brand-title: 'Raleway',
sans-serif;
$brand-text: 'Lato',
sans-serif;
body {
min-height: 100vh;
}
.loader {
position: fixed;
display: grid;
grid-template-columns: $loaderWidth;
top: 0;
left: 50%;
transform: translateX(-50%) scaleY(0);
transform-origin: top center;
overflow: hidden;
transition: all 0.25s ease-in-out;
&.visible {
transform: translateX(-50%) scaleY(1);
}
#loaderShape {
path {
fill: $brand-dark;
}
}
&-content {
position: absolute;
display: grid;
grid-template-columns: $loaderContentWidth;
grid-gap: 0px;
align-items: center;
justify-items: center;
align-self: center;
top: 10%;
bottom: 15%;
left: 50%;
transform: translateX(-50%);
color: $brand-light;
padding: 10px 0 0 0;
}
&-text {
font-family: $brand-title;
text-transform: uppercase;
font-size: 12px;
line-height: 12px;
font-weight: 900;
letter-spacing: 2px;
text-align: center;
user-select: none;
}
&-percent {
font-family: $brand-text;
font-size: 12px;
position: absolute;
}
&-spinner {
display: flex;
align-items: center;
justify-content: center;
}
}
.sk-cube-grid {
width: 40px;
height: 40px;
border-radius: 44px;
display: grid;
grid-template-columns: 1fr 1fr 1fr;
grid-gap: 2px;
.sk-cube {
width: 100%;
height: 100%;
border-radius: 2px;
background-color: $brand-accent;
animation: sk-cubeGridScaleDelay 1.3s infinite linear;
}
.sk-cube1 {background-color: $brand-light; animation-delay: 0.15s; }
.sk-cube2 {background-color: $brand-accent;animation-delay: 0.25s; }
.sk-cube3 {background-color:...