25 CSS Spinners 11 / 25
Folding Cube Grid Spinner
A 3×3 grid of teal cubes each flip through two 90° rotation axes in sequence with staggered delays, creating a cascading wave of 3D folding tiles.
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="sp-11">
<div class="sp-11__grid">
<div class="sp-11__cube"></div>
<div class="sp-11__cube"></div>
<div class="sp-11__cube"></div>
<div class="sp-11__cube"></div>
<div class="sp-11__cube"></div>
<div class="sp-11__cube"></div>
<div class="sp-11__cube"></div>
<div class="sp-11__cube"></div>
<div class="sp-11__cube"></div>
</div>
</div> <div class="sp-11">
<div class="sp-11__grid">
<div class="sp-11__cube"></div>
<div class="sp-11__cube"></div>
<div class="sp-11__cube"></div>
<div class="sp-11__cube"></div>
<div class="sp-11__cube"></div>
<div class="sp-11__cube"></div>
<div class="sp-11__cube"></div>
<div class="sp-11__cube"></div>
<div class="sp-11__cube"></div>
</div>
</div>.sp-11,.sp-11 *,.sp-11 *::before,.sp-11 *::after{box-sizing:border-box;margin:0;padding:0}
.sp-11{
--bg:#0a0a0a;
--c:#64ffda;
--glow:rgba(100,255,218,0.5);
display:flex;
align-items:center;
justify-content:center;
min-height:100vh;
background:var(--bg);
}
.sp-11__grid{
display:grid;
grid-template-columns:repeat(3,22px);
grid-template-rows:repeat(3,22px);
gap:4px;
}
.sp-11__cube{
width:22px;
height:22px;
background:var(--c);
box-shadow:0 0 8px var(--glow);
border-radius:2px;
animation:sp-11-fold 1.8s ease-in-out infinite;
}
.sp-11__cube:nth-child(1){animation-delay:0s}
.sp-11__cube:nth-child(2){animation-delay:0.1s}
.sp-11__cube:nth-child(3){animation-delay:0.2s}
.sp-11__cube:nth-child(4){animation-delay:0.3s}
.sp-11__cube:nth-child(5){animation-delay:0.4s}
.sp-11__cube:nth-child(6){animation-delay:0.5s}
.sp-11__cube:nth-child(7){animation-delay:0.6s}
.sp-11__cube:nth-child(8){animation-delay:0.7s}
.sp-11__cube:nth-child(9){animation-delay:0.8s}
@keyframes sp-11-fold{
0%,100%{transform:perspective(60px) rotateX(0deg) rotateY(0deg);opacity:1}
33%{transform:perspective(60px) rotateX(-90deg) rotateY(0deg);opacity:0.4}
66%{transform:perspective(60px) rotateX(-90deg) rotateY(90deg);opacity:0.4}
}
@media (prefers-reduced-motion: reduce){
.sp-11__cube{animation:none}
} .sp-11,.sp-11 *,.sp-11 *::before,.sp-11 *::after{box-sizing:border-box;margin:0;padding:0}
.sp-11{
--bg:#0a0a0a;
--c:#64ffda;
--glow:rgba(100,255,218,0.5);
display:flex;
align-items:center;
justify-content:center;
min-height:100vh;
background:var(--bg);
}
.sp-11__grid{
display:grid;
grid-template-columns:repeat(3,22px);
grid-template-rows:repeat(3,22px);
gap:4px;
}
.sp-11__cube{
width:22px;
height:22px;
background:var(--c);
box-shadow:0 0 8px var(--glow);
border-radius:2px;
animation:sp-11-fold 1.8s ease-in-out infinite;
}
.sp-11__cube:nth-child(1){animation-delay:0s}
.sp-11__cube:nth-child(2){animation-delay:0.1s}
.sp-11__cube:nth-child(3){animation-delay:0.2s}
.sp-11__cube:nth-child(4){animation-delay:0.3s}
.sp-11__cube:nth-child(5){animation-delay:0.4s}
.sp-11__cube:nth-child(6){animation-delay:0.5s}
.sp-11__cube:nth-child(7){animation-delay:0.6s}
.sp-11__cube:nth-child(8){animation-delay:0.7s}
.sp-11__cube:nth-child(9){animation-delay:0.8s}
@keyframes sp-11-fold{
0%,100%{transform:perspective(60px) rotateX(0deg) rotateY(0deg);opacity:1}
33%{transform:perspective(60px) rotateX(-90deg) rotateY(0deg);opacity:0.4}
66%{transform:perspective(60px) rotateX(-90deg) rotateY(90deg);opacity:0.4}
}
@media (prefers-reduced-motion: reduce){
.sp-11__cube{animation:none}
}How this works
Nine identical square tiles are laid out in a CSS Grid. Each tile runs the same sp-11-fold keyframe which animates perspective(60px) rotateX from 0° to -90° in the first third, then adds rotateY(90deg) in the second third, ending with the tile back at full visibility — simulating a double-fold motion like a paper flap.
Each tile's animation-delay increases by 0.1s from left-to-right, top-to-bottom, so the fold cascades diagonally across the grid. The opacity drop to 0.4 during mid-fold enhances the 3D depth illusion by mimicking a backface shadow.
Customize
- Change tile colour and glow via
--cand--glow— an amber/dark-gold palette gives a metallic coin flip appearance. - Adjust the perspective depth from
60pxto30pxfor a more extreme 3D foreshortening effect. - Change the grid layout to 2×2 (4 tiles) or 4×4 (16 tiles) by adjusting the grid columns/rows and populating the matching number of
.sp-11__cubeelements. - Add
border-radius:4pxto tiles and increase gap to6pxfor a softer, card-deck flip aesthetic. - Use
animation-timing-function:cubic-bezier(0.36,0.07,0.19,0.97)to add a spring overshoot to each fold.
Watch out for
- The
perspective()in the transform function list is per-element perspective — for consistent depth across all 9 tiles, a sharedperspectiveproperty on a parent container gives more uniform results. - At
animation-duration:1.8swith 9 tiles, the total delay spread is0.8s, leaving a visible gap before the cycle restarts — reduce duration or increase overlap by shortening delays to0.07ssteps if the gap is undesirable. - The fold uses
rotateXthenrotateYin the same transform stack — order matters in CSS transforms and reversing them produces a different fold axis.
Browser support
| Chrome | Safari | Firefox | Edge |
|---|---|---|---|
| 60+ | 12+ | 60+ | 60+ |
CSS 3D transforms with per-element perspective are well-supported; no prefixes required.