Solar system
Pure CSSOrbits are rings on a tilted plane, each spinning at its own speed. Every planet undoes both rotations, so it always faces the camera.
Nested panels, each hinged on its parent’s edge, folding up like a paper map.
Your edited version
left: 100% with transform-origin: left — a hinge on the parent’s right edge.transform-style: preserve-3d, or the chain flattens at that level.--u, tied to the canvas: the map is four panels of 60 × 170 units, so it is the same share of a gallery card, the editor and a recording canvas.nested preserve-3dtransform-origin: leftalternating keyframes<div class="scene">
<div class="map">
<div class="panel">
<div class="panel">
<div class="panel">
<div class="panel"></div>
</div>
</div>
</div>
</div>
</div>
.scene {
/* one base unit: every length below is a multiple of it, so the map is the same share of a
gallery card, the editor, a full screen and a recording canvas */
--u: 0.32vmin;
display: grid;
place-items: center;
perspective: calc(900 * var(--u));
}
.map {
width: calc(240 * var(--u)); /* 4 panels × 60 units */
height: calc(170 * var(--u));
transform-style: preserve-3d;
transform: rotateX(28deg) rotateY(-8deg);
/* the first panel stays put and the others fold onto it, so the folded map is a stack at the
left end: the map slides right as it folds, on the same timing, to keep the stack centred */
animation: slide 3.4s ease-in-out infinite alternate, dip 3.4s ease-in-out infinite alternate;
}
.panel {
box-sizing: content-box; /* a panel's numbers are its face, its edge drawn round it: by design, on any page */
width: calc(60 * var(--u));
height: 100%;
transform-style: preserve-3d;
background: linear-gradient(90deg, #2ee6d6, #157a72);
border: calc(1 * var(--u)) solid rgb(255 255 255 / 0.25);
}
.panel .panel {
position: absolute;
top: calc(-1 * var(--u));
left: 100%;
transform-origin: left center;
animation: fold-back 3.4s ease-in-out infinite alternate;
}
.panel .panel .panel { animation-name: fold-front; }
.panel .panel .panel .panel { animation-name: fold-back; }
@keyframes slide {
0%, 12% { translate: calc(-5 * var(--u)) calc(-2 * var(--u)); }
88%, 100% { translate: calc(78 * var(--u)) calc(-24 * var(--u)); }
}
/* half folded, the panels stand out toward you and reach down: lift the map while they do */
@keyframes dip {
0%, 12%, 88%, 100% { transform: rotateX(28deg) rotateY(-8deg); }
50% { transform: translateY(calc(-12 * var(--u))) rotateX(28deg) rotateY(-8deg); }
}
@keyframes fold-back {
0%, 12% { transform: rotateY(0deg); }
88%, 100% { transform: rotateY(150deg); }
}
@keyframes fold-front {
0%, 12% { transform: rotateY(0deg); }
88%, 100% { transform: rotateY(-150deg); }
}