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💖





