20 CSS Loaders15 / 20
CSS Orbit Planet Loader
Three space-themed CSS loaders — a multi-orbit solar system, a conic-gradient comet trail, and binary orbiting stars — evoking astronomy dashboards and data pipeline visualisations.
Published
This is a full-page demo — interact inside the frame above, or open it in the playground for the full-screen experience.
The code
<div class="ld-15">
<div class="ld-15__stage">
<div class="ld-15__cell">
<div class="ld-15__solar">
<div class="ld-15__sun"></div>
<div class="ld-15__orbit-ring"><div class="ld-15__planet"></div></div><div class="ld-15">
<div class="ld-15__stage">
<div class="ld-15__cell">
<div class="ld-15__solar">
<div class="ld-15__sun"></div>
<div class="ld-15__orbit-ring"><div class="ld-15__planet"></div></div>.ld-15,
.ld-15 *,
.ld-15 *::before,
.ld-15 *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.ld-15 {
--bg: #01020a;
--c1: #4fc3f7;
--c2: #f48fb1;
--c3: #a5d6a7;
--c4: #ffe082;
--c5: #cf94da;
background: var(--bg);
display: flex;
align-items: center;
justify-content: center;
min-height: 100vh;
font-family: 'Segoe UI',sans-serif;
}
.ld-15__stage {
display: flex;
gap: 80px;
flex-wrap: wrap;
justify-content: center;
padding: 40px;
align-items: center;
}
.ld-15__cell {
display: flex;
flex-direction: column;
align-items: center;
gap: 24px;
}
.ld-15__label {
color: rgba(255,255,255,.3);
font-size: 11px;
letter-spacing: 1.5px;
text-transform: uppercase;
}
/* Multi-orbit solar */
.ld-15__solar {
width: 120px;
height: 120px;
position: relative;
display: flex;
align-items: center;
justify-content: center;
}
.ld-15__sun {
width: 18px;
height: 18px;
border-radius: 50%;
background: var(--c4);
box-shadow: 0 0 16px var(--c4),0 0 32px rgba(255,224,130,.3);
}
.ld-15__orbit-ring {
position: absolute;
border-radius: 50%;
border: 1px solid rgba(255,255,255,.08);
}
.ld-15__orbit-ring:nth-child(2) {
width: 44px;
height: 44px;
animation: ld-15-orbit 1.2s linear infinite;
}
.ld-15__orbit-ring:nth-child(3) {
width: 72px;
height: 72px;
animation: ld-15-orbit 2s linear infinite;
}
.ld-15__orbit-ring:nth-child(4) {
width: 100px;
height: 100px;
animation: ld-15-orbit 3s linear infinite;
}
.ld-15__planet {
position: absolute;
border-radius: 50%;
top: -5px;
left: 50%;
transform: translateX(-50%);
}
.ld-15__orbit-ring:nth-child(2) .ld-15__planet {
width: 8px;
height: 8px;
background: var(--c1);
box-shadow: 0 0 6px var(--c1);
}
.ld-15__orbit-ring:nth-child(3) .ld-15__planet {
width: 10px;
height: 10px;
background: var(--c2);
box-shadow: 0 0 8px var(--c2);
}
.ld-15__orbit-ring:nth-child(4) .ld-15__planet {
width: 7px;
height: 7px;
background: var(--c3);
box-shadow: 0 0 6px var(--c3);
}
@keyframes ld-15-orbit {
to {
transform: rotate(360deg);
}
}
/* Comet orbit */
.ld-15__comet-orbit {
width: 90px;
height: 90px;
position: relative;
}
.ld-15__comet-orbit::before {
content: '';
position: absolute;
inset: 0;
border-radius: 50%;
border: 1px solid rgba(255,255,255,.06);
}
.ld-15__comet-dot {
width: 10px;
height: 10px;
border-radius: 50%;
background: var(--c5);
box-shadow: 0 0 10px var(--c5);
position: absolute;
top: -5px;
left: 50%;
transform: translateX(-50%);
transform-origin: 45px 50px;
animation: ld-15-orbit 1.8s linear infinite;
}
.ld-15__comet-trail {
position: absolute;
inset: 0;
border-radius: 50%;
background: conic-gradient(transparent 75%,rgba(207,148,218,.3));
animation: ld-15-orbit 1.8s linear infinite;
-webkit-mask: radial-gradient(farthest-side,#0000 calc(100% - 2px),#000 0);
}
/* Binary stars */
.ld-15__binary {
width: 90px;
height: 90px;
position: relative;
display: flex;
align-items: center;
justify-content: center;
}
.ld-15__binary-wrap {
width: 60px;
height: 60px;
position: relative;
animation: ld-15-orbit 2s linear infinite;
}
.ld-15__star {
position: absolute;
border-radius: 50%;
top: 50%;
transform: translateY(-50%);
}
.ld-15__star:nth-child(1) {
left: 0;
width: 14px;
height: 14px;
background: var(--c4);
box-shadow: 0 0 10px var(--c4);
margin-top: -7px;
}
.ld-15__star:nth-child(2) {
right: 0;
width: 10px;
height: 10px;
background: var(--c1);
box-shadow: 0 0 8px var(--c1);
margin-top: -5px;
}
@media (prefers-reduced-motion: reduce) {
.ld-15__orbit-ring,
.ld-15__comet-dot,
.ld-15__comet-trail,
.ld-15__binary-wrap {
animation: none;
}
}.ld-15,
.ld-15 *,
.ld-15 *::before,
.ld-15 *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.ld-15 {
--bg: #01020a;
--c1: #4fc3f7;
--c2: #f48fb1;
--c3: #a5d6a7;
--c4: #ffe082;
--c5: #cf94da;
background: var(--bg);
display: flex;
align-items: center;
justify-content: center;
min-height: 100vh;
font-family: 'Segoe UI',sans-serif;
}
.ld-15__stage {
display: flex;
gap: 80px;
flex-wrap: wrap;
justify-content: center;
padding: 40px;
align-items: center;
}
.ld-15__cell {
display: flex;
flex-direction: column;
align-items: center;
gap: 24px;
}
.ld-15__label {
color: rgba(255,255,255,.3);
font-size: 11px;
letter-spacing: 1.5px;
text-transform: uppercase;
}
/* Multi-orbit solar */
.ld-15__solar {
width: 120px;
height: 120px;
position: relative;
display: flex;
align-items: center;
justify-content: center;
}
.ld-15__sun {
width: 18px;
height: 18px;
border-radius: 50%;
background: var(--c4);
box-shadow: 0 0 16px var(--c4),0 0 32px rgba(255,224,130,.3);
}
.ld-15__orbit-ring {
position: absolute;
border-radius: 50%;
border: 1px solid rgba(255,255,255,.08);
}
.ld-15__orbit-ring:nth-child(2) {
width: 44px;
height: 44px;
animation: ld-15-orbit 1.2s linear infinite;
}
.ld-15__orbit-ring:nth-child(3) {
width: 72px;
height: 72px;
animation: ld-15-orbit 2s linear infinite;
}
.ld-15__orbit-ring:nth-child(4) {
width: 100px;
height: 100px;
animation: ld-15-orbit 3s linear infinite;
}
.ld-15__planet {
position: absolute;
border-radius: 50%;
top: -5px;
left: 50%;
transform: translateX(-50%);
}
.ld-15__orbit-ring:nth-child(2) .ld-15__planet {
width: 8px;
height: 8px;
background: var(--c1);
box-shadow: 0 0 6px var(--c1);
}
.ld-15__orbit-ring:nth-child(3) .ld-15__planet {
width: 10px;
height: 10px;
background: var(--c2);
box-shadow: 0 0 8px var(--c2);
}
.ld-15__orbit-ring:nth-child(4) .ld-15__planet {
width: 7px;
height: 7px;
background: var(--c3);
box-shadow: 0 0 6px var(--c3);
}
@keyframes ld-15-orbit {
to {
transform: rotate(360deg);
}
}
/* Comet orbit */
.ld-15__comet-orbit {
width: 90px;
height: 90px;
position: relative;
}
.ld-15__comet-orbit::before {
content: '';
position: absolute;
inset: 0;
border-radius: 50%;
border: 1px solid rgba(255,255,255,.06);
}
.ld-15__comet-dot {
width: 10px;
height: 10px;
border-radius: 50%;
background: var(--c5);
box-shadow: 0 0 10px var(--c5);
position: absolute;
top: -5px;
left: 50%;
transform: translateX(-50%);
transform-origin: 45px 50px;
animation: ld-15-orbit 1.8s linear infinite;
}
.ld-15__comet-trail {
position: absolute;
inset: 0;
border-radius: 50%;
background: conic-gradient(transparent 75%,rgba(207,148,218,.3));
animation: ld-15-orbit 1.8s linear infinite;
-webkit-mask: radial-gradient(farthest-side,#0000 calc(100% - 2px),#000 0);
}
/* Binary stars */
.ld-15__binary {
width: 90px;
height: 90px;
position: relative;
display: flex;
align-items: center;
justify-content: center;
}
.ld-15__binary-wrap {
width: 60px;
height: 60px;
position: relative;
animation: ld-15-orbit 2s linear infinite;
}
.ld-15__star {
position: absolute;
border-radius: 50%;
top: 50%;
transform: translateY(-50%);
}
.ld-15__star:nth-child(1) {
left: 0;
width: 14px;
height: 14px;
background: var(--c4);
box-shadow: 0 0 10px var(--c4);
margin-top: -7px;
}
.ld-15__star:nth-child(2) {
right: 0;
width: 10px;
height: 10px;
background: var(--c1);
box-shadow: 0 0 8px var(--c1);
margin-top: -5px;
}
@media (prefers-reduced-motion: reduce) {
.ld-15__orbit-ring,
.ld-15__comet-dot,
.ld-15__comet-trail,
.ld-15__binary-wrap {
animation: none;
}
}Here's a working CSS Loader from CodeFronts. Use it as-is or adapt to your framework. All classes are scoped under a unique prefix so the code won't collide with your existing styles. MIT licensed.
Demo: CSS Orbit Planet Loader
Source: https://codefronts.com/motion/css-loader-designs/css-orbit-planet-loader/
Three space-themed CSS loaders — a multi-orbit solar system, a conic-gradient comet trail, and binary orbiting stars — evoking astronomy dashboards and data pipeline visualisations.
## HTML
```html
<div class="ld-15">
<div class="ld-15__stage">
<div class="ld-15__cell">
<div class="ld-15__solar">
<div class="ld-15__sun"></div>
<div class="ld-15__orbit-ring"><div class="ld-15__planet"></div></div>
```
## CSS
```css
.ld-15,
.ld-15 *,
.ld-15 *::before,
.ld-15 *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.ld-15 {
--bg: #01020a;
--c1: #4fc3f7;
--c2: #f48fb1;
--c3: #a5d6a7;
--c4: #ffe082;
--c5: #cf94da;
background: var(--bg);
display: flex;
align-items: center;
justify-content: center;
min-height: 100vh;
font-family: 'Segoe UI',sans-serif;
}
.ld-15__stage {
display: flex;
gap: 80px;
flex-wrap: wrap;
justify-content: center;
padding: 40px;
align-items: center;
}
.ld-15__cell {
display: flex;
flex-direction: column;
align-items: center;
gap: 24px;
}
.ld-15__label {
color: rgba(255,255,255,.3);
font-size: 11px;
letter-spacing: 1.5px;
text-transform: uppercase;
}
/* Multi-orbit solar */
.ld-15__solar {
width: 120px;
height: 120px;
position: relative;
display: flex;
align-items: center;
justify-content: center;
}
.ld-15__sun {
width: 18px;
height: 18px;
border-radius: 50%;
background: var(--c4);
box-shadow: 0 0 16px var(--c4),0 0 32px rgba(255,224,130,.3);
}
.ld-15__orbit-ring {
position: absolute;
border-radius: 50%;
border: 1px solid rgba(255,255,255,.08);
}
.ld-15__orbit-ring:nth-child(2) {
width: 44px;
height: 44px;
animation: ld-15-orbit 1.2s linear infinite;
}
.ld-15__orbit-ring:nth-child(3) {
width: 72px;
height: 72px;
animation: ld-15-orbit 2s linear infinite;
}
.ld-15__orbit-ring:nth-child(4) {
width: 100px;
height: 100px;
animation: ld-15-orbit 3s linear infinite;
}
.ld-15__planet {
position: absolute;
border-radius: 50%;
top: -5px;
left: 50%;
transform: translateX(-50%);
}
.ld-15__orbit-ring:nth-child(2) .ld-15__planet {
width: 8px;
height: 8px;
background: var(--c1);
box-shadow: 0 0 6px var(--c1);
}
.ld-15__orbit-ring:nth-child(3) .ld-15__planet {
width: 10px;
height: 10px;
background: var(--c2);
box-shadow: 0 0 8px var(--c2);
}
.ld-15__orbit-ring:nth-child(4) .ld-15__planet {
width: 7px;
height: 7px;
background: var(--c3);
box-shadow: 0 0 6px var(--c3);
}
@keyframes ld-15-orbit {
to {
transform: rotate(360deg);
}
}
/* Comet orbit */
.ld-15__comet-orbit {
width: 90px;
height: 90px;
position: relative;
}
.ld-15__comet-orbit::before {
content: '';
position: absolute;
inset: 0;
border-radius: 50%;
border: 1px solid rgba(255,255,255,.06);
}
.ld-15__comet-dot {
width: 10px;
height: 10px;
border-radius: 50%;
background: var(--c5);
box-shadow: 0 0 10px var(--c5);
position: absolute;
top: -5px;
left: 50%;
transform: translateX(-50%);
transform-origin: 45px 50px;
animation: ld-15-orbit 1.8s linear infinite;
}
.ld-15__comet-trail {
position: absolute;
inset: 0;
border-radius: 50%;
background: conic-gradient(transparent 75%,rgba(207,148,218,.3));
animation: ld-15-orbit 1.8s linear infinite;
-webkit-mask: radial-gradient(farthest-side,#0000 calc(100% - 2px),#000 0);
}
/* Binary stars */
.ld-15__binary {
width: 90px;
height: 90px;
position: relative;
display: flex;
align-items: center;
justify-content: center;
}
.ld-15__binary-wrap {
width: 60px;
height: 60px;
position: relative;
animation: ld-15-orbit 2s linear infinite;
}
.ld-15__star {
position: absolute;
border-radius: 50%;
top: 50%;
transform: translateY(-50%);
}
.ld-15__star:nth-child(1) {
left: 0;
width: 14px;
height: 14px;
background: var(--c4);
box-shadow: 0 0 10px var(--c4);
margin-top: -7px;
}
.ld-15__star:nth-child(2) {
right: 0;
width: 10px;
height: 10px;
background: var(--c1);
box-shadow: 0 0 8px var(--c1);
margin-top: -5px;
}
@media (prefers-reduced-motion: reduce) {
.ld-15__orbit-ring,
.ld-15__comet-dot,
.ld-15__comet-trail,
.ld-15__binary-wrap {
animation: none;
}
}
```Here's a working CSS Loader from CodeFronts. Use it as-is or adapt to your framework. All classes are scoped under a unique prefix so the code won't collide with your existing styles. MIT licensed.
Demo: CSS Orbit Planet Loader
Source: https://codefronts.com/motion/css-loader-designs/css-orbit-planet-loader/
Three space-themed CSS loaders — a multi-orbit solar system, a conic-gradient comet trail, and binary orbiting stars — evoking astronomy dashboards and data pipeline visualisations.
## HTML
```html
<div class="ld-15">
<div class="ld-15__stage">
<div class="ld-15__cell">
<div class="ld-15__solar">
<div class="ld-15__sun"></div>
<div class="ld-15__orbit-ring"><div class="ld-15__planet"></div></div>
```
## CSS
```css
.ld-15,
.ld-15 *,
.ld-15 *::before,
.ld-15 *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.ld-15 {
--bg: #01020a;
--c1: #4fc3f7;
--c2: #f48fb1;
--c3: #a5d6a7;
--c4: #ffe082;
--c5: #cf94da;
background: var(--bg);
display: flex;
align-items: center;
justify-content: center;
min-height: 100vh;
font-family: 'Segoe UI',sans-serif;
}
.ld-15__stage {
display: flex;
gap: 80px;
flex-wrap: wrap;
justify-content: center;
padding: 40px;
align-items: center;
}
.ld-15__cell {
display: flex;
flex-direction: column;
align-items: center;
gap: 24px;
}
.ld-15__label {
color: rgba(255,255,255,.3);
font-size: 11px;
letter-spacing: 1.5px;
text-transform: uppercase;
}
/* Multi-orbit solar */
.ld-15__solar {
width: 120px;
height: 120px;
position: relative;
display: flex;
align-items: center;
justify-content: center;
}
.ld-15__sun {
width: 18px;
height: 18px;
border-radius: 50%;
background: var(--c4);
box-shadow: 0 0 16px var(--c4),0 0 32px rgba(255,224,130,.3);
}
.ld-15__orbit-ring {
position: absolute;
border-radius: 50%;
border: 1px solid rgba(255,255,255,.08);
}
.ld-15__orbit-ring:nth-child(2) {
width: 44px;
height: 44px;
animation: ld-15-orbit 1.2s linear infinite;
}
.ld-15__orbit-ring:nth-child(3) {
width: 72px;
height: 72px;
animation: ld-15-orbit 2s linear infinite;
}
.ld-15__orbit-ring:nth-child(4) {
width: 100px;
height: 100px;
animation: ld-15-orbit 3s linear infinite;
}
.ld-15__planet {
position: absolute;
border-radius: 50%;
top: -5px;
left: 50%;
transform: translateX(-50%);
}
.ld-15__orbit-ring:nth-child(2) .ld-15__planet {
width: 8px;
height: 8px;
background: var(--c1);
box-shadow: 0 0 6px var(--c1);
}
.ld-15__orbit-ring:nth-child(3) .ld-15__planet {
width: 10px;
height: 10px;
background: var(--c2);
box-shadow: 0 0 8px var(--c2);
}
.ld-15__orbit-ring:nth-child(4) .ld-15__planet {
width: 7px;
height: 7px;
background: var(--c3);
box-shadow: 0 0 6px var(--c3);
}
@keyframes ld-15-orbit {
to {
transform: rotate(360deg);
}
}
/* Comet orbit */
.ld-15__comet-orbit {
width: 90px;
height: 90px;
position: relative;
}
.ld-15__comet-orbit::before {
content: '';
position: absolute;
inset: 0;
border-radius: 50%;
border: 1px solid rgba(255,255,255,.06);
}
.ld-15__comet-dot {
width: 10px;
height: 10px;
border-radius: 50%;
background: var(--c5);
box-shadow: 0 0 10px var(--c5);
position: absolute;
top: -5px;
left: 50%;
transform: translateX(-50%);
transform-origin: 45px 50px;
animation: ld-15-orbit 1.8s linear infinite;
}
.ld-15__comet-trail {
position: absolute;
inset: 0;
border-radius: 50%;
background: conic-gradient(transparent 75%,rgba(207,148,218,.3));
animation: ld-15-orbit 1.8s linear infinite;
-webkit-mask: radial-gradient(farthest-side,#0000 calc(100% - 2px),#000 0);
}
/* Binary stars */
.ld-15__binary {
width: 90px;
height: 90px;
position: relative;
display: flex;
align-items: center;
justify-content: center;
}
.ld-15__binary-wrap {
width: 60px;
height: 60px;
position: relative;
animation: ld-15-orbit 2s linear infinite;
}
.ld-15__star {
position: absolute;
border-radius: 50%;
top: 50%;
transform: translateY(-50%);
}
.ld-15__star:nth-child(1) {
left: 0;
width: 14px;
height: 14px;
background: var(--c4);
box-shadow: 0 0 10px var(--c4);
margin-top: -7px;
}
.ld-15__star:nth-child(2) {
right: 0;
width: 10px;
height: 10px;
background: var(--c1);
box-shadow: 0 0 8px var(--c1);
margin-top: -5px;
}
@media (prefers-reduced-motion: reduce) {
.ld-15__orbit-ring,
.ld-15__comet-dot,
.ld-15__comet-trail,
.ld-15__binary-wrap {
animation: none;
}
}
```How this works
The solar system uses three concentric border-radius:50% rings, each with a rotate(360deg) animation at different speeds (1.2s, 2s, 3s) and a planet div absolutely positioned at top:-5px; left:50%; transform:translateX(-50%). Because the planet is a child of the rotating ring, it orbits the sun automatically without any extra positioning math. The box-shadow glow on each planet is applied directly so it travels with the planet.
The comet trail wraps a spinning conic-gradient(transparent 75%, rgba()) element behind a solid dot child, both sharing the same animation. The gradient arc acts as a persistent tail — as the container spins, the arc rotates with it while the dot always sits at the leading edge. The binary star uses a single wrapper that rotates, containing two dots offset to left and right — their orbital radii are implicitly defined by their left/right positions within the fixed wrapper.
Make it yours
- Adjust orbital speeds by changing
animation-durationper ring — use Kepler's third law ratio (inner orbit fastest) for an astronomically accurate feel. - Add a ring glow by giving the orbit ring element a
box-shadow: 0 0 6px rgba(255,255,255,.05)to make the invisible orbit path faintly visible. - Increase comet tail length by changing the transparent stop from
75%to60%— a smaller transparent portion means a longer visible arc. - Add a planet wobble by applying a subtle
scaleX(0.9)animation to each planet element independently of its parent orbit ring rotation. - Create an asteroid belt by adding a ring with many small dots at random positions — use
nth-childselectors with differenttransform-originvalues on a shared orbit ring.
Gotchas — read before shipping
- Planet positioning uses
top:-5px; left:50%; transform:translateX(-50%)which centres the planet on the ring's top edge — if the planet size changes, update thetopoffset to-(planetSize/2)px. - The comet
-webkit-maskradial gradient must match the conic-gradient element's size — if sizes differ, the mask clips the arc at the wrong radius. - Binary star wrappers using a single rotation must have both star dots at equal distances from the centre on the horizontal axis — asymmetric placement produces an eccentric wobble rather than a true binary orbit.
Browser support
| Chrome | Safari | Firefox | Edge |
|---|---|---|---|
| 69+ | 12.1+ | 83+ | 69+ |
Conic-gradient requires Safari 12.1+; the orbit technique itself works in all modern browsers.