console
<!-- Jade? No thanks. -->
<div class="canvas">
<div class="cube">
<div class="group group--aqua">
<div class="plane plane--aqua">
<div class="dot dot--aqua"></div>
<div class="dot dot--aqua"></div>
<div class="dot dot--aqua"></div>
<div class="dot dot--aqua"></div>
<div class="dot dot--aqua"></div>
<div class="dot dot--aqua"></div>
<div class="dot dot--aqua"></div>
<div class="dot dot--aqua"></div>
<div class="dot dot--aqua"></div>
</div>
</div>
<div class="group">
<div class="plane plane--gold">
<div class="dot dot--gold"></div>
<div class="dot dot--gold"></div>
<div class="dot dot--gold"></div>
<div class="dot dot--gold"></div>
<div class="dot dot--gold"></div>
<div class="dot dot--gold"></div>
<div class="dot dot--gold"></div>
<div class="dot dot--gold"></div>
<div class="dot dot--gold"></div>
</div>
</div>
<div class="group group--tomato">
<div class="plane plane--tomato">
<div class="dot dot--tomato"></div>
<div class="dot dot--tomato"></div>
<div class="dot dot--tomato"></div>
<div class="dot dot--tomato"></div>
<div class="dot dot--tomato"></div>
<div class="dot dot--tomato"></div>
<div class="dot dot--tomato"></div>
<div class="dot dot--tomato"></div>
<div class="dot dot--tomato"></div>
</div>
</div>
</div>
</div>
$canvas-size: 500px;
$cube-size: 200px;
$dot-size: 10px;
body {
display: flex;
justify-content: center;
align-items: center;
width: 100vw;
height: 100vh;
overflow: hidden;
background-color: #171723;
}
.canvas {
position: relative;
width: $canvas-size;
height: $canvas-size;
transform-style: preserve-3d;
transform: rotateX(-35deg);
}
.cube {
position: absolute;
top: 50%;
left: 50%;
width: $cube-size;
height: $cube-size;
transform-style: preserve-3d;
transform: translate(-50%, -50%) rotateY(45deg);
}
.group {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
transform-style: preserve-3d;
}
.group--aqua {
transform: translate3d(0, 0, ceil($canvas-size * 0.134));
}
.group--tomato {
transform: translate3d(0, 0, ceil($canvas-size * -0.134));
}
@keyframes plane-rotation {
50%, 100% {
transform: rotateZ(-90deg);
}
}
.plane {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
width: 100%;
height: 100%;
transform-style: preserve-3d;
perspective: 2400px;
animation: plane-rotation 2s infinite;
}
.plane--gold {
animation-delay: 0.25s;
}
.plane--tomato {
animation-delay: 0.5s;
}
@keyframes dot-rotation {
50%, 100% {
transform: rotateY(0deg) rotateX(45deg) scaleX(1.2);
}
}
.dot {
display: flex;
justify-content: center;
align-items: center;
flex-basis: 33.33%;
transform: rotateY(-45deg) rotateX(35deg) scaleX(1);
animation: dot-rotation 2s infinite;
&::before {
content: '';
display: block;
width: $dot-size;
height: $dot-size;
border-radius: 50%;
}
}
.dot--aqua {
&::before {
background-color: aqua;
}
}
.dot--gold {
animation-delay: 0.25s;
&::before {
background-color: gold;
}
}
.dot--tomato {
animation-delay: 0.5s;
&::before {
background-color: tomato;
}
}