Twisting puzzle cube
Pure CSSA 3×3×3 cube built as three layers that take turns twisting a quarter turn. Each layer is one flat box with the stickers painted on by gradients.
Nine circles rotated around the Y axis make the meridians; one laid flat is the equator.
Your edited version
border-radius: 50% and only a border.i × 20deg around Y, form the meridians. 9 × 20° = 180° is enough because each ring is visible on both sides.rotateX(90deg) is the equator.rotateZ before the animated rotateY gives the tilted-axis look.border-radius: 50% ringsrotateY(i × 20deg)preserve-3d spin<div class="scene">
<div class="globe">
<i style="--i:0"></i>
<i style="--i:1"></i>
<i style="--i:2"></i>
<i style="--i:3"></i>
<i style="--i:4"></i>
<i style="--i:5"></i>
<i style="--i:6"></i>
<i style="--i:7"></i>
<i style="--i:8"></i>
<b></b>
</div>
</div>
.scene {
perspective: 800px;
}
.globe {
position: relative;
width: 200px;
height: 200px;
transform-style: preserve-3d;
animation: globe-spin 14s linear infinite;
}
.globe i,
.globe b {
position: absolute;
inset: 0;
border: 1.5px solid #2ee6d6;
border-radius: 50%;
}
.globe i { transform: rotateY(calc(var(--i) * 20deg)); } /* meridians */
.globe b { transform: rotateX(90deg); border-color: #ff4d9d; } /* equator */
@keyframes globe-spin {
from { transform: rotateZ(18deg) rotateX(-14deg) rotateY(0deg); }
to { transform: rotateZ(18deg) rotateX(-14deg) rotateY(360deg); }
}
.d-globe {
position: relative;
width: 150px;
height: 150px;
transform-style: preserve-3d;
animation: d-globe-spin 14s linear infinite;
i,
b {
position: absolute;
inset: 0;
border: 1.5px solid var(--accent-2);
border-radius: 50%;
}
// meridians: 9 × 20° covers the half turn (each ring shows on both sides). --i from markup.
i {
transform: rotateY(calc(var(--i) * 20deg));
}
// equator
b {
border-color: var(--hot);
transform: rotateX(90deg);
}
}
@keyframes d-globe-spin {
from {
transform: rotateZ(18deg) rotateX(-14deg) rotateY(0deg);
}
to {
transform: rotateZ(18deg) rotateX(-14deg) rotateY(360deg);
}
}