Skip to content

Instantly share code, notes, and snippets.

@e1blue
Created April 6, 2018 01:44
Show Gist options
  • Select an option

  • Save e1blue/0db03054cdf28ae614521ededbcdf092 to your computer and use it in GitHub Desktop.

Select an option

Save e1blue/0db03054cdf28ae614521ededbcdf092 to your computer and use it in GitHub Desktop.
Unfolding Cube Recursion
mixin tinyCube
.tiny-cube
.side.one
.side.three
.side.six
.side.four
.side.two
.side.five
mixin cube
.cube
.side.one
.side.three
.side.six
.side.four
.side.two
.side.five
+tinyCube
main
.container
.surface
.side
+cube
*, *:before, *:after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
:root {
--cubeSide: 140px;
--cubeSideSm: calc(var(--cubeSide)/7);
--dur: 4s;
--playState: running;
--darkred: #622;
--yellow: #ff4;
--teal: #066;
--trans: rgba(0,0,0,0.3);
}
body {
background: #333;
height: 100vh;
line-height: 1.5;
}
main {
background: var(--yellow);
margin: 3em auto 0 auto;
overflow: hidden;
position: relative;
width: 480px;
height: 480px;
}
.container {
animation: cameraZoom var(--dur) ease-in-out infinite var(--playState);
}
.container, .side {
width: 100%;
height: 100%;
}
.surface, .cube, .tiny-cube, .side {
transform-style: preserve-3d;
}
.surface, .cube, .tiny-cube, .side {
position: absolute;
}
.surface {
animation: cameraMove var(--dur) ease-in-out infinite var(--playState);
margin: calc(var(--cubeSide) * -3.5) auto auto calc(var(--cubeSide) * -3.5);
top: 50%;
left: 50%;
width: calc(var(--cubeSide) * 7);
height: calc(var(--cubeSide) * 7);
transform: rotateX(45deg) rotateZ(-45deg);
}
.surface > .side {
box-shadow: 0 0 calc(var(--cubeSide)/5) calc(var(--cubeSide)*0.35) var(--trans), 0 0 calc(var(--cubeSide)/5) calc(var(--cubeSide)*0.35) var(--trans) inset;
transform: translateY(100%);
}
/* Cubes */
.cube {
top: calc(50% - var(--cubeSide)/2);
left: calc(50% - var(--cubeSide)/2);
width: var(--cubeSide);
height: var(--cubeSide);
}
.tiny-cube {
top: calc(50% - var(--cubeSideSm)/2);
left: calc(50% - var(--cubeSideSm)/2);
width: var(--cubeSideSm);
height: var(--cubeSideSm);
}
/* Sides */
.side {
background: var(--teal);
box-shadow: 0 0 calc(var(--cubeSide)/28) calc(var(--cubeSide)/20) var(--trans) inset;
display: flex;
flex-wrap: wrap;
justify-content: space-around;
align-items: center;
}
.one, .six {
background: var(--yellow);
}
.four, .three, .three > .six {
transform: rotateX(-90deg);
}
.four, .three {
transform-origin: 50% 100%;
}
.two, .five {
background: var(--darkred);
}
.two {
transform: rotateY(90deg);
transform-origin: 100% 50%;
}
.five {
transform: rotateY(-90deg);
transform-origin: 0% 50%;
}
.three > .six {
transform-origin: 50% 0%;
}
.tiny-cube .side {
box-shadow: 0 0 0 1px var(--trans) inset;
}
.tiny-cube .one {
box-shadow: none;
}
/* Animate sides */
.cube > .one > .three > .six > .four, .cube > .one > .three > .six {
animation: fold46 var(--dur) ease-in-out infinite var(--playState);
}
.cube > .one > .three > .six > .two {
animation: fold2 var(--dur) ease-in-out infinite var(--playState);
}
.cube > .one > .three > .six > .five {
animation: fold5 var(--dur) ease-in-out infinite var(--playState);
}
.cube > .one > .three {
animation: fold3 var(--dur) ease-in-out infinite var(--playState);
}
/* Animations */
@keyframes cameraMove {
from {
transform: rotateX(45deg) rotateZ(-45deg)
}
33% {
transform: rotateX(45deg) rotateZ(-45deg) translateY(calc(var(--cubeSide) * -1))
}
66%, to {
transform: rotateX(45deg) rotateZ(-45deg) translateY(calc(var(--cubeSide) * -2))
}
}
@keyframes cameraZoom {
from, 66% { transform: scale(1,1) }
to { transform: scale(7,7) }
}
@keyframes fold46 {
from, 33% { transform: rotateX(-90deg) }
67%, to { transform: rotateX(-180deg) }
}
@keyframes fold2 {
from, 33% { transform: rotateY(90deg) }
67%, to { transform: rotateY(180deg) }
}
@keyframes fold5 {
from, 33% { transform: rotateY(-90deg) }
67%, to { transform: rotateY(-180deg) }
}
@keyframes fold3 {
from { transform: rotateX(-90deg) }
33%, to { transform: rotateX(-179.9deg) }
}

Unfolding Cube Recursion

Man, there’s gotta be some super tiny legendary thing in all those cubes…

Definitely no IE support; hard use of CSS 3D and variables.

A Pen by Jon Kantner on CodePen.

License.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment