Speedy CSS Tip! Animated Loader


Hop over to CodePen and create a new pen.

Create the markup for our loader. Note the use of inline custom properties:

div class="loader" style="--count: 10">
span style="--index: 0">&LT/span>
span style="--index: 1">&LT/span>
span style="--index: 2">&LT/span>
span style="--index: 3">&LT/span>
span style="--index: 4">&LT/span>
span style="--index: 5">&LT/span>
span style="--index: 6">&LT/span>
span style="--index: 7">&LT/span>
span style="--index: 8">&LT/span>
span style="--index: 9">&LT/span>
&LT/div>

You can also use a generator (Pug) to configure the number of lines:

- const COUNT = 10
.loader(style=`--count: ${COUNT}`)
- let i = 0
while i COUNT
span(style=`--index: ${i}`)
- i++

Give our loader some styles:

loader {
--size: 10vmin;

height: var(--size);
position: relative;
width: var(--size);
}

Position our lines using absolute positioning and a combination of calc with transform:

.loader span {
background: grey;
height: 25%;
left: 50%;
position: absolute;
top: 50%;
transform: translate(-50%, -50%)
rotate(calc(((360 / var(--count)) * var(--index)) * 1deg))
translate(0, -125%);
width: 10%;
}

Apply an opacity based on the --index:

.loader span {
opacity: calc(var(--index) / var(--count));
}

Get things spinning!

.loader {
animation: spin 0.75s infinite steps(var(--count));
}

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

Note the use of steps(var(--count)) to get the right effect ✨

Done! 🎉

Prefer this in tweet form? 🐦

Stay Awesome! ʕ •ᴥ•ʔ

Last updated: — Improve article

Quoted from Various Sources

Published for: The Bloggers Briefing