Back to CSS Stacked Cards Spiral Tower Pure CSS
Share
.scd-spir {
  position: relative; width: 200px; height: 220px; margin: 0 auto;
  perspective: 700px;
  display: flex; align-items: center; justify-content: center;
}
.scd-spir__inner, .scd-spir {
  transform-style: preserve-3d;
}
.scd-spir::before {
  content: '';
  position: absolute; left: 50%; top: 14px; bottom: 14px;
  width: 2px; margin-left: -1px;
  background: linear-gradient(180deg, transparent 0%, #3fd5a8 20%, #3fd5a8 80%, transparent 100%);
  opacity: 0.45;
}
.scd-spir__c {
  position: absolute; left: 50%; top: 50%;
  width: 70px; height: 38px; margin: -19px 0 0 -35px;
  background: linear-gradient(135deg, #0066cc 0%, #003d7a 100%);
  color: #3fd5a8;
  display: grid; place-items: center;
  font: 900 18px/1 ui-monospace, monospace;
  border-radius: 4px;
  border-left: 3px solid #3fd5a8;
  box-shadow: 0 4px 12px -4px rgba(0,102,204,0.5), inset 1px 0 0 rgba(255,255,255,0.12);
  backface-visibility: visible;
  transform-style: preserve-3d;
  animation: scd-spir-orbit 6s linear infinite;
  animation-delay: calc(var(--i) * -1.2s);
}
@keyframes scd-spir-orbit {
  0%   { transform: translateY(70px)  rotateY(0deg)   translateZ(48px); }
  25%  { transform: translateY(35px)  rotateY(90deg)  translateZ(48px); }
  50%  { transform: translateY(0)     rotateY(180deg) translateZ(48px); }
  75%  { transform: translateY(-35px) rotateY(270deg) translateZ(48px); }
  100% { transform: translateY(-70px) rotateY(360deg) translateZ(48px); }
}
@media (prefers-reduced-motion: reduce) {
  .scd-spir__c { animation: none; transform: translateY(calc(var(--i) * -22px - 44px)) rotateY(calc(var(--i) * 36deg)) translateZ(48px); }
}
<div class="scd-spir">
  <div class="scd-spir__c" style="--i:0">A</div>
  <div class="scd-spir__c" style="--i:1">T</div>
  <div class="scd-spir__c" style="--i:2">G</div>
  <div class="scd-spir__c" style="--i:3">C</div>
  <div class="scd-spir__c" style="--i:4">A</div>
</div>
Live preview Edit any tab — preview updates live Ready