Imagine a visually stunning tower of cubes, each scaling upward as if climbing to infinity—crafted entirely with HTML and CSS! In this blog, we’ll guide you through the process of designing a dynamic “Tower of Climbing Cubes,” leveraging CSS properties like 3D transforms, animations, and perspective. Each cube will seamlessly transition and stack, creating an eye-catching visual effect that adds depth and motion to your design. This project is perfect for honing your front-end skills while exploring the artistic side of web development. Let’s start building a tower that defies the ordinary!
I would recommend you don’t just copy and paste the code, just look at the code and type by understanding it.
Demo
See the Pen Tower of climbing cubes – Live coding session by Amit Sheen (@amit_sheen) on CodePen.
HTML Code
Starter Template
<!doctype html> <html lang="en"> <head> <!-- Required meta tags --> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- CSS --> <link rel="stylesheet" href="style.css"> <title>Coding Torque</title> </head> <body> <!-- Further code here --> </body> </html>
Paste the below code in your <body>
tag.
<!-- Live coding of this CodePen: --> <div class="scene"> <div class="column"> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> </div> <div class="column"> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> </div> <div class="column"> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> </div> <div class="column"> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> </div> <div class="column"> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> </div> <div class="column"> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> </div> <div class="column"> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> </div> <div class="column"> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> </div> <div class="column"> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> </div> <div class="column"> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> </div> <div class="column"> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> </div> <div class="column"> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> <div class="box"><i></i><i></i><i></i><i></i><i></i><i></i></div> </div> </div>
CSS Code
Create a file style.css and paste the code below.
*, *::before, *::after { padding: 0; margin: 0 auto; box-sizing: border-box; } body { background-color: #000; min-height: 100vh; display: grid; place-items: center; perspective: 800px; overflow: hidden; * { transform-style: preserve-3d; } } .scene { position: relative; transform: rotateX(-30deg) rotateY(-60deg); font-size: 60px; animation: sceneRotate 60s infinite linear; @keyframes sceneRotate { from { transform: rotateX(-30deg) rotateY(0deg); } to { transform: rotateX(-30deg) rotateY(360deg); } } } $duration: 12s; .column { position: absolute; transform: rotateY(var(--ry)) translateX(2.8em); @for $i from 0 to 12 { &:nth-child(#{$i + 1}) { --ry: #{360deg / 12 * $i}; .box { animation: boxRotate#{$i} $duration var(--delay) infinite ease-in-out, boxTop#{$i} $duration var(--delay) infinite step-end, boxTranslate $duration var(--delay) infinite linear; } } $p1: random(100) / 100 * 40; $p2: $p1 + 4 + random(100) / 100 * 4; $p3: $p2 + 2 + random(100) / 100 * 2; $p4: $p3 + 2 + random(100) / 100 * 2; $p5: $p4 + 2 + random(100) / 100 * 2; $p6: $p5 + 2 + random(100) / 100 * 2; $p7: $p6 + 4 + random(100) / 100 * 4; @keyframes boxRotate#{$i} { 0%, #{$p1}% { rotate: 0.25turn; } #{$p2}%, #{$p3}%, #{$p4}%, #{$p5}%, #{$p6}% { rotate: -0.25turn; animation-timing-function: step-end; } #{$p2}%, #{$p3}%, #{$p4}%, #{$p5}%, #{$p6}% { rotate: 0turn; } #{$p7}%, 100% { rotate: -0.5turn; } } @keyframes boxTop#{$i} { 0%, #{$p1}% { top: 0; } #{$p2}% { top: -1em; } #{$p3}% { top: -2em; } #{$p4}% { top: -3em; } #{$p5}% { top: -4em; } #{$p6}% { top: -5em; } } } } .box { position: absolute; width: 1em; height: 1em; transform-origin: top left; @for $i from 0 to 6 { &:nth-child(#{$i + 1}) { --delay: #{$duration / -6 * $i}; } } @keyframes boxTranslate { from { translate: 0 1em; } to { translate: 0 7em; } } i { --gap: 0.05em; position: absolute; inset: var(--gap); background-color: #000d; border: 2px dodgerblue solid; box-shadow: 0 0 0.5em dodgerblue inset; &:nth-child(1) { transform: translateZ(calc(0.5em - var(--gap))); } &:nth-child(2) { transform: rotateY(90deg) translateZ(calc(0.5em - var(--gap))); } &:nth-child(3) { transform: rotateY(180deg) translateZ(calc(0.5em - var(--gap))); } &:nth-child(4) { transform: rotateY(270deg) translateZ(calc(0.5em - var(--gap))); } &:nth-child(5) { transform: rotateX(270deg) translateZ(calc(0.5em - var(--gap))); } &:nth-child(6) { transform: rotateX(90deg) translateZ(calc(0.5em - var(--gap))); } } }
Final Output
Written by: Piyush Patil
Code Credits: https://codepen.io/amit_sheen/pen/JjzGGQR
If you found any mistakes or have any doubts please feel free to Contact Us
Hope you find this post helpful💖