An animated 3D bouncy castle created with just HTML and CSS.
A Pen by Matthew Brandon Davis on CodePen.
An animated 3D bouncy castle created with just HTML and CSS.
A Pen by Matthew Brandon Davis on CodePen.
<div class="scene"> | |
<div class="bouncy-castle"> | |
<div class="floor"> | |
<div class="floor__section floor__section--1"> | |
<div class="face face--top"></div> | |
<div class="face face--bottom"></div> | |
<div class="face face--front"></div> | |
<div class="face face--back"></div> | |
<div class="face face--left"></div> | |
<div class="face face--right"></div> | |
</div> | |
<div class="floor__section floor__section--2 floor__section--teal"> | |
<div class="face face--top"></div> | |
<div class="face face--bottom"></div> | |
<div class="face face--front"></div> | |
<div class="face face--back"></div> | |
<div class="face face--left"></div> | |
<div class="face face--right"></div> | |
</div> | |
<div class="floor__section floor__section--3"> | |
<div class="face face--top"></div> | |
<div class="face face--bottom"></div> | |
<div class="face face--front"></div> | |
<div class="face face--back"></div> | |
<div class="face face--left"></div> | |
<div class="face face--right"></div> | |
</div> | |
<div class="floor__section floor__section--4 floor__section--teal"> | |
<div class="face face--top"></div> | |
<div class="face face--bottom"></div> | |
<div class="face face--front"></div> | |
<div class="face face--back"></div> | |
<div class="face face--left"></div> | |
<div class="face face--right"></div> | |
</div> | |
<div class="floor__section floor__section--5"> | |
<div class="face face--top"></div> | |
<div class="face face--bottom"></div> | |
<div class="face face--front"></div> | |
<div class="face face--back"></div> | |
<div class="face face--left"></div> | |
<div class="face face--right"></div> | |
</div> | |
<div class="floor__grass"> | |
<div class="face face--top"></div> | |
<div class="face face--front"></div> | |
<div class="face face--back"></div> | |
<div class="face face--left"></div> | |
<div class="face face--right"></div> | |
</div> | |
</div> | |
<div class="rope rope--left"> | |
<div class="face"></div> | |
</div> | |
<div class="rope rope--right"> | |
<div class="face"></div> | |
</div> | |
<div class="wall wall--back"> | |
<div class="face face--top"></div> | |
<div class="face face--bottom"></div> | |
<div class="face face--front"></div> | |
<div class="face face--back"></div> | |
<div class="face face--left"></div> | |
<div class="face face--right"></div> | |
</div> | |
<div class="wall wall--left"> | |
<div class="face face--top"></div> | |
<div class="face face--bottom"></div> | |
<div class="face face--front"></div> | |
<div class="face face--back"></div> | |
<div class="face face--left"></div> | |
<div class="face face--right"></div> | |
</div> | |
<div class="wall wall--right"> | |
<div class="face face--top"></div> | |
<div class="face face--bottom"></div> | |
<div class="face face--front"></div> | |
<div class="face face--back"></div> | |
<div class="face face--left"></div> | |
<div class="face face--right"></div> | |
</div> | |
<div class="pillar pillar-top-left"> | |
<div class="face face--top"></div> | |
<div class="face face--bottom"></div> | |
<div class="face face--front"></div> | |
<div class="face face--back"></div> | |
<div class="face face--left"></div> | |
<div class="face face--right"></div> | |
</div> | |
<div class="pillar pillar-top-right"> | |
<div class="face face--top"></div> | |
<div class="face face--bottom"></div> | |
<div class="face face--front"></div> | |
<div class="face face--back"></div> | |
<div class="face face--left"></div> | |
<div class="face face--right"></div> | |
</div> | |
<div class="pillar pillar-bottom-left"> | |
<div class="face face--top"></div> | |
<div class="face face--bottom"></div> | |
<div class="face face--front"></div> | |
<div class="face face--back"></div> | |
<div class="face face--left"></div> | |
<div class="face face--right"></div> | |
</div> | |
<div class="pillar pillar-bottom-right"> | |
<div class="face face--top"></div> | |
<div class="face face--bottom"></div> | |
<div class="face face--front"></div> | |
<div class="face face--back"></div> | |
<div class="face face--left"></div> | |
<div class="face face--right"></div> | |
</div> | |
<div class="steve"> | |
<div class="steve__head"> | |
<div class="face face--top"></div> | |
<div class="face face--bottom"></div> | |
<div class="face face--front"></div> | |
<div class="face face--back"></div> | |
<div class="face face--left"></div> | |
<div class="face face--right"></div> | |
</div> | |
<div class="steve__body"> | |
<div class="face face--top"></div> | |
<div class="face face--bottom"></div> | |
<div class="face face--front"></div> | |
<div class="face face--back"></div> | |
<div class="face face--left"></div> | |
<div class="face face--right"></div> | |
</div> | |
<div class="steve__arm steve__arm--left"> | |
<div class="face face--top"></div> | |
<div class="face face--bottom"></div> | |
<div class="face face--front"></div> | |
<div class="face face--back"></div> | |
<div class="face face--left"></div> | |
<div class="face face--right"></div> | |
</div> | |
<div class="steve__arm steve__arm--right"> | |
<div class="face face--top"></div> | |
<div class="face face--bottom"></div> | |
<div class="face face--front"></div> | |
<div class="face face--back"></div> | |
<div class="face face--left"></div> | |
<div class="face face--right"></div> | |
</div> | |
<div class="steve__leg steve__leg--left"> | |
<div class="face face--top"></div> | |
<div class="face face--bottom"></div> | |
<div class="face face--front"></div> | |
<div class="face face--back"></div> | |
<div class="face face--left"></div> | |
<div class="face face--right"></div> | |
</div> | |
<div class="steve__leg steve__leg--right"> | |
<div class="face face--top"></div> | |
<div class="face face--bottom"></div> | |
<div class="face face--front"></div> | |
<div class="face face--back"></div> | |
<div class="face face--left"></div> | |
<div class="face face--right"></div> | |
</div> | |
</div> | |
<div class="robot"> | |
<div class="face face--top"></div> | |
<div class="face face--bottom"></div> | |
<div class="face face--front"></div> | |
<div class="face face--back"></div> | |
<div class="face face--left"></div> | |
<div class="face face--right"></div> | |
</div> | |
</div> | |
</div> |
//Variables | |
$animation-speed: 800ms; | |
$animation-delay: 0.5s; | |
$castle-size: 400px; | |
$grass-size: $castle-size + 240px; | |
$grass-depth: 48px; | |
$floor-section-size: $castle-size / 5; | |
$floor-depth: 72px; | |
$pillar-depth: 128px; | |
$pillar-thickness: 64px; | |
$wall-depth: 116px; | |
$wall-height: 32px; | |
$wall-width: $castle-size - ($pillar-thickness * 2) + 24px; | |
$snap-edge: ($castle-size / 2) - ($pillar-thickness / 2); | |
//Pivot Mixin | |
@mixin pivot(){ | |
position: absolute; | |
left: 50%; | |
top: 50%; | |
transform-origin: 50%; | |
transform-style: preserve-3d; | |
} | |
//Face Mixin | |
@mixin face( | |
$texture: 'face-placeholder.jpg', | |
$texture-size: 128px, | |
$texture-position: 'center', | |
$height: 128px, | |
$width: 128px | |
){ | |
backface-visibility: hidden; | |
background-image: url('https://s3-us-west-2.amazonaws.com/s.cdpn.io/1678849/' + $texture); | |
background-position: $texture-position; | |
background-size: $texture-size; | |
height: $height; | |
position: absolute; | |
transform-style: preserve-3d; | |
width: $width; | |
image-rendering: -webkit-optimize-contrast; | |
image-rendering: -moz-crisp-edges; | |
image-rendering: pixelated; | |
} | |
//Box Mixin | |
@mixin box( | |
$pivot-position-x: "center", | |
$pivot-position-y: "center", | |
$pivot-position-z: "center", | |
$depth: 128px, | |
$height: 128px, | |
$width: 128px, | |
$shadow-bottom: true, | |
$texture: "box-placeholder.jpg", | |
$texture-top: $texture, | |
$texture-bottom: $texture, | |
$texture-left: $texture, | |
$texture-right: $texture, | |
$texture-front: $texture, | |
$texture-back: $texture, | |
$texture-size: 128px, | |
$top-x: 0, | |
$bottom-x: 0, | |
$sides-x: 0, | |
$top-y: 0, | |
$bottom-y: 0, | |
$sides-y: 0, | |
$top-z: 0, | |
$bottom-z: 0, | |
$sides-z: 0 | |
){ | |
@if($pivot-position-z == 'top'){ | |
$top-z: 0; | |
$bottom-z: - $depth; | |
$sides-z: - $depth /2; | |
}@else if($pivot-position-z == 'center'){ | |
$top-z: $depth / 2; | |
$bottom-z: - $depth / 2; | |
$sides-z: 0; | |
}@else{ | |
$top-z: $depth; | |
$bottom-z: 0; | |
$sides-z: $depth /2; | |
} | |
@if($pivot-position-y == 'top'){ | |
$top-y: 0; | |
$bottom-y: 0; | |
$sides-y: calc( -50% + #{$height / 2}); | |
}@else if($pivot-position-y == 'center'){ | |
$top-y: -50%; | |
$bottom-y: -50%; | |
$sides-y: -50%; | |
}@else{ | |
$top-y: -$height; | |
$bottom-y: -$height; | |
$sides-y: calc( -50% - #{$height / 2}); | |
} | |
@if($pivot-position-x == 'left'){ | |
$top-x: 0; | |
$bottom-x: 0; | |
$sides-x: calc( -50% + #{$width / 2}); | |
}@else if($pivot-position-x == 'center'){ | |
$top-x: -50%; | |
$bottom-x: -50%; | |
$sides-x: -50%; | |
}@else{ | |
$top-x: -$width; | |
$bottom-x: -$width; | |
$sides-x: calc( -50% - #{$width / 2}); | |
} | |
@include pivot; | |
.face--top{ | |
@include face($texture-top, $texture-size, center, $height, $width); | |
transform: translate3d($top-x, $top-y, $top-z); | |
} | |
.face--bottom{ | |
@include face($texture-bottom, $texture-size, center, $height, $width); | |
transform: translate3d($bottom-x, $bottom-y, $bottom-z); | |
@if($shadow-bottom){ | |
box-shadow: 0 0 10px rgba(0,0,0,0.8); | |
} | |
} | |
.face--front{ | |
@include face($texture-front, $texture-size, top center, $depth, $width); | |
transform: translate3d($sides-x, $sides-y, $sides-z) | |
translateY( $height / 2 ) | |
rotateX(270deg); | |
} | |
.face--back{ | |
@include face($texture-back, $texture-size, top center, $depth, $width); | |
transform: translate3d($sides-x, $sides-y, $sides-z) | |
translateY( -$height / 2 ) | |
rotateX(270deg) | |
rotateY(180deg); | |
} | |
.face--left { | |
@include face($texture-left, $texture-size, top center, $depth, $height); | |
transform: translate3d($sides-x, $sides-y, $sides-z) | |
translateX( $width / 2 ) | |
rotateX(270deg) | |
rotateY(90deg); | |
} | |
.face--right{ | |
@include face($texture-right, $texture-size, top center, $depth, $height); | |
transform: translate3d($sides-x, $sides-y, $sides-z) | |
translateX( -$width / 2 ) | |
rotateX(270deg) | |
rotateY(270deg); | |
} | |
} | |
//HTML & BODY | |
html{ | |
height: 100%; | |
} | |
body { | |
background-color: #252c36; | |
background-image: linear-gradient(rgba(0,0,0,0.4),rgba(0,0,0,0.4),rgba(0,0,0,0)); | |
height: 100%; | |
overflow: hidden; | |
transform: scale(0.75); | |
} | |
//Scene | |
.scene{ | |
@include pivot; | |
transform: rotateX(45deg) rotateZ(225deg); | |
animation: sceneSpin 30s infinite linear; | |
} | |
@keyframes sceneSpin{ | |
0%{ transform: rotateX(45deg) rotateZ(225deg); } | |
50%{ transform: rotateX(45deg) rotateZ(135deg); } | |
100%{ transform: rotateX(45deg) rotateZ(225deg); } | |
} | |
//Bouncy Castle | |
.bouncy-castle{ | |
@include pivot; | |
} | |
//Floor | |
.floor{ | |
@include pivot; | |
transform: translateZ(-2px); | |
} | |
.floor__grass{ | |
@include box( | |
$pivot-position-z: 'top', | |
$depth: $grass-depth, | |
$height: $grass-size, | |
$width: $grass-size, | |
$texture: "grass-side.png", | |
$texture-top: "grass.png", | |
$texture-size: cover | |
); | |
transform: translateZ(-$floor-depth - 40px); | |
} | |
.floor__section{ | |
@include box( | |
$pivot-position-z: 'top', | |
$depth: $floor-depth, | |
$height: $castle-size, | |
$width: $castle-size / 5, | |
$texture: "bouncy-dark.png", | |
$texture-left: "bouncy-dark-side.png", | |
$texture-right: "bouncy-dark-side.png", | |
$texture-front: "bouncy-dark-cap.png", | |
$texture-back: "bouncy-dark-cap.png", | |
$texture-size: cover | |
); | |
animation-duration: $animation-speed; | |
animation-iteration-count: infinite; | |
animation-timing-function: ease-in-out; | |
animation-delay: $animation-delay; | |
} | |
.floor__section--teal{ | |
@include box( | |
$pivot-position-z: 'top', | |
$depth: $floor-depth, | |
$height: $castle-size, | |
$width: $castle-size / 5, | |
$texture: "bouncy-teal.png", | |
$texture-left: "bouncy-teal-side.png", | |
$texture-right: "bouncy-teal-side.png", | |
$texture-front: "bouncy-teal-cap.png", | |
$texture-back: "bouncy-teal-cap.png", | |
$texture-size: cover | |
); | |
} | |
.floor__section--1{ | |
animation-name: floorSection1; | |
transform: translateX( ($castle-size / 2) - ($floor-section-size / 2)) translateZ(-8px); | |
} | |
.floor__section--2{ | |
animation-name: floorSection2; | |
transform: translateX( ($castle-size / 2) - ($floor-section-size / 2) - $floor-section-size) translateZ(-20px); | |
} | |
.floor__section--3{ | |
animation-name: floorSection3; | |
transform: translateZ(-28px); | |
} | |
.floor__section--4{ | |
animation-name: floorSection4; | |
transform: translateX( - (($castle-size / 2) - ($floor-section-size / 2) - $floor-section-size)) translateZ(-16px); | |
} | |
.floor__section--5{ | |
animation-name: floorSection5; | |
transform: translateX( - (($castle-size / 2) - ($floor-section-size / 2))) translateZ(-8px); | |
} | |
@keyframes floorSection1{ | |
0%{ transform: translateX( ($castle-size / 2) - ($floor-section-size / 2)) translateZ(-8px); } | |
50%{ transform: translateX( ($castle-size / 2) - ($floor-section-size / 2)) translateZ(-0); } | |
100%{ transform: translateX( ($castle-size / 2) - ($floor-section-size / 2)) translateZ(-8px); } | |
} | |
@keyframes floorSection2{ | |
0%{ transform: translateX( ($castle-size / 2) - ($floor-section-size / 2) - $floor-section-size) translateZ(-20px); } | |
50%{ transform: translateX( ($castle-size / 2) - ($floor-section-size / 2) - $floor-section-size) translateZ(0); } | |
100%{ transform: translateX( ($castle-size / 2) - ($floor-section-size / 2) - $floor-section-size) translateZ(-20px); } | |
} | |
@keyframes floorSection3{ | |
0%{ transform: translateZ(-28px); } | |
50%{ transform: translateZ(0); } | |
100%{ transform: translateZ(-28px); } | |
} | |
@keyframes floorSection4{ | |
0%{ transform: translateX( - (($castle-size / 2) - ($floor-section-size / 2) - $floor-section-size)) translateZ(-16px); } | |
50%{ transform: translateX( - (($castle-size / 2) - ($floor-section-size / 2) - $floor-section-size)) translateZ(0); } | |
100%{ transform: translateX( - (($castle-size / 2) - ($floor-section-size / 2) - $floor-section-size)) translateZ(-16px); } | |
} | |
@keyframes floorSection5{ | |
0%{ transform: translateX( - (($castle-size / 2) - ($floor-section-size / 2))) translateZ(-8px); } | |
50%{ transform: translateX( - (($castle-size / 2) - ($floor-section-size / 2))) translateZ(0); } | |
100%{ transform: translateX( - (($castle-size / 2) - ($floor-section-size / 2))) translateZ(-8px); } | |
} | |
//Pillars | |
.pillar{ | |
@include box( | |
$pivot-position-z: 'bottom', | |
$depth: $pillar-depth, | |
$height: $pillar-thickness, | |
$width: $pillar-thickness, | |
$texture: 'bouncy-pillar.png', | |
$texture-top: 'bouncy-pillar-cap.png', | |
$texture-size: cover | |
); | |
animation-duration: $animation-speed; | |
animation-iteration-count: infinite; | |
animation-timing-function: ease-in-out; | |
animation-delay: $animation-delay; | |
} | |
.pillar-top-left{ | |
animation-name: pillarTopLeft; | |
transform: translateY(-$snap-edge) translateX(-$snap-edge) rotateX(0) rotateY(0); | |
} | |
.pillar-top-right{ | |
animation-name: pillarTopRight; | |
transform: translateY(-$snap-edge) translateX($snap-edge) rotateX(0) rotateY(0); | |
} | |
.pillar-bottom-left{ | |
animation-name: pillarBottomLeft; | |
transform: translateY($snap-edge) translateX(-$snap-edge) rotateX(0) rotateY(0); | |
} | |
.pillar-bottom-right{ | |
animation-name: pillarBottomRight; | |
transform: translateY($snap-edge) translateX($snap-edge) rotateX(0) rotateY(0); | |
} | |
@keyframes pillarTopLeft{ | |
0%{ transform: translateY(-$snap-edge) translateX(-$snap-edge) rotateX(0) rotateY(0); } | |
50%{ transform: translateY(-$snap-edge) translateX(-$snap-edge) rotateX(6deg) rotateY(-6deg); } | |
100%{ transform: translateY(-$snap-edge) translateX(-$snap-edge) rotateX(0) rotateY(0); } | |
} | |
@keyframes pillarTopRight{ | |
0%{ transform: translateY(-$snap-edge) translateX($snap-edge) rotateX(0) rotateY(0); } | |
50%{ transform: translateY(-$snap-edge) translateX($snap-edge) rotateX(6deg) rotateY(6deg); } | |
100%{ transform: translateY(-$snap-edge) translateX($snap-edge) rotateX(0) rotateY(0); } | |
} | |
@keyframes pillarBottomLeft{ | |
0%{ transform: translateY($snap-edge) translateX(-$snap-edge) rotateX(0) rotateY(0); } | |
50%{ transform: translateY($snap-edge) translateX(-$snap-edge) rotateX(-6deg) rotateY(-6deg); } | |
100%{ transform: translateY($snap-edge) translateX(-$snap-edge) rotateX(0) rotateY(0); } | |
} | |
@keyframes pillarBottomRight{ | |
0%{ transform: translateY($snap-edge) translateX($snap-edge) rotateX(0) rotateY(0); } | |
50%{ transform: translateY($snap-edge) translateX($snap-edge) rotateX(-6deg) rotateY(6deg); } | |
100%{ transform: translateY($snap-edge) translateX($snap-edge) rotateX(0) rotateY(0); } | |
} | |
//Walls | |
.wall{ | |
@include box( | |
$pivot-position-z: 'bottom', | |
$depth: $wall-depth, | |
$height: $wall-height, | |
$width: $wall-width, | |
$texture: "bouncy-wall.png", | |
$texture-top: "bouncy-wall-top.png", | |
$texture-size: cover | |
); | |
animation-duration: $animation-speed; | |
animation-iteration-count: infinite; | |
animation-timing-function: ease-in-out; | |
animation-delay: $animation-delay; | |
} | |
.wall--back{ | |
animation-name: wallBack; | |
transform: translateY($snap-edge) rotateX(0deg); | |
} | |
.wall--left{ | |
animation-name: wallLeft; | |
transform: translateX(-$snap-edge) rotateZ(90deg) rotateX(0); | |
} | |
.wall--right{ | |
animation-name: wallRight; | |
transform: translateX($snap-edge) rotateZ(90deg) rotateX(0); | |
} | |
@keyframes wallBack{ | |
0%{ transform: translateY($snap-edge) rotateX(0deg); } | |
50%{ transform: translateY($snap-edge) rotateX(-8deg); } | |
100%{ transform: translateY($snap-edge) rotateX(0deg); } | |
} | |
@keyframes wallRight{ | |
0%{ transform: translateX($snap-edge) rotateZ(90deg) rotateX(0); } | |
50%{ transform: translateX($snap-edge) rotateZ(90deg) rotateX(8deg); } | |
100%{ transform: translateX($snap-edge) rotateZ(90deg) rotateX(0); } | |
} | |
@keyframes wallLeft{ | |
0%{ transform: translateX(-$snap-edge) rotateZ(90deg) rotateX(0); } | |
50%{ transform: translateX(-$snap-edge) rotateZ(90deg) rotateX(-8deg); } | |
100%{ transform: translateX(-$snap-edge) rotateZ(90deg) rotateX(0); } | |
} | |
//Robot | |
.robot{ | |
@include box( | |
$pivot-position-z: 'bottom', | |
$depth: 27px, | |
$height: 54px, | |
$width: 27px, | |
$shadow-bottom: false, | |
$texture: "face-placeholder.jpg", | |
$texture-bottom: "robot-bottom.gif", | |
$texture-top: "robot-top.png", | |
$texture-left: "robot-side.png", | |
$texture-right: "robot-side.png", | |
$texture-front: "robot-cap.png", | |
$texture-back: "robot-cap.png", | |
$texture-size: cover | |
); | |
animation: robot $animation-speed infinite ease-in-out $animation-delay; | |
transform: translateY(-100px) translateX(100px) translateZ(-20px) rotateZ(45deg); | |
.face--bottom{ | |
height: 78px; | |
width: 51px; | |
transform: translate3d(-50%, -50%, 13px); | |
} | |
} | |
@keyframes robot{ | |
0%{ transform: translateY(-100px) translateX(100px) translateZ(-20px) rotateZ(45deg); } | |
50%{ transform: translateY(-100px) translateX(100px) translateZ(0) rotateZ(45deg); } | |
100%{ transform: translateY(-100px) translateX(100px) translateZ(-20px) rotateZ(45deg); } | |
} | |
//Steve | |
.steve{ | |
@include pivot; | |
animation: steve $animation-speed infinite ease-in-out $animation-delay; | |
transform: translateZ(18px); | |
} | |
.steve__head{ | |
@include box( | |
$pivot-position-z: 'bottom', | |
$depth: 32px, | |
$height: 32px, | |
$width: 32px, | |
$shadow-bottom: false, | |
$texture: "steve-head-top.png", | |
$texture-back: "steve-face.png", | |
$texture-left: "steve-head-right.png", | |
$texture-right: "steve-head-left.png", | |
$texture-size: cover | |
); | |
animation: steveHead $animation-speed infinite ease-in-out $animation-delay; | |
transform: translateZ(54px); | |
} | |
.steve__body{ | |
@include box( | |
$pivot-position-z: 'top', | |
$depth: 48px, | |
$height: 24px, | |
$width: 32px, | |
$shadow-bottom: false, | |
$texture: "steve-body.png", | |
$texture-back: "steve-body-front.png", | |
$texture-size: cover | |
); | |
transform: translateZ(52px); | |
} | |
.steve__leg{ | |
@include box( | |
$pivot-position-z: 'top', | |
$depth: 52px, | |
$height: 16px, | |
$width: 16px, | |
$texture: "steve-leg.png", | |
$texture-size: cover | |
); | |
animation-duration: $animation-speed; | |
animation-iteration-count: infinite; | |
animation-timing-function: ease-in-out; | |
animation-delay: $animation-delay; | |
} | |
.steve__arm{ | |
@include box( | |
$pivot-position-z: 'top', | |
$depth: 52px, | |
$height: 16px, | |
$width: 16px, | |
$shadow-bottom: false, | |
$texture: "steve-arm.png", | |
$texture-size: cover | |
); | |
animation-duration: $animation-speed; | |
animation-iteration-count: infinite; | |
animation-timing-function: ease-in-out; | |
animation-delay: $animation-delay; | |
} | |
.steve__arm--left{ | |
animation-name: steveArmLeft; | |
transform: translateX(-24px) translateZ(48px); | |
} | |
.steve__arm--right{ | |
animation-name: steveArmRight; | |
transform: translateX(24px) translateZ(48px); | |
} | |
.steve__leg--left{ | |
animation-name: steveLegLeft; | |
transform: translateX(-8px); | |
} | |
.steve__leg--right{ | |
animation-name: steveLegRight; | |
transform: translateX(8px); | |
} | |
@keyframes steve{ | |
0%{ transform: translateZ(18px); } | |
50%{ transform: translateZ(128px); } | |
100%{ transform: translateZ(18px); } | |
} | |
@keyframes steveHead{ | |
0%{ transform: translateZ(54px) rotateX(0); } | |
50%{ transform: translateZ(54px) rotateX(-8deg); } | |
100%{ transform: translateZ(54px) rotateX(0); } | |
} | |
@keyframes steveArmLeft{ | |
0%{ transform: translateX(-24px) translateZ(48px) rotateY(0); } | |
50%{ transform: translateX(-24px) translateZ(48px) rotateY(40deg); } | |
100%{ transform: translateX(-24px) translateZ(48px) rotateY(0); } | |
} | |
@keyframes steveArmRight{ | |
0%{ transform: translateX(24px) translateZ(48px) rotateY(0); } | |
50%{ transform: translateX(24px) translateZ(48px) rotateY(-40deg); } | |
100%{ transform: translateX(24px) translateZ(48px) rotateY(0); } | |
} | |
@keyframes steveLegLeft{ | |
0%{ transform: translateX(-8px) rotateY(0); } | |
50%{ transform: translateX(-8px) rotateY(20deg); } | |
100%{ transform: translateX(-8px) rotateY(0); } | |
} | |
@keyframes steveLegRight{ | |
0%{ transform: translateX(8px) rotateY(0); } | |
50%{ transform: translateX(8px) rotateY(-20deg); } | |
100%{ transform: translateX(8px) rotateY(0); } | |
} | |
//Rope | |
.rope{ | |
@include pivot; | |
animation-duration: $animation-speed; | |
animation-iteration-count: infinite; | |
animation-timing-function: ease-in-out; | |
animation-delay: $animation-delay; | |
} | |
.rope .face{ | |
@include face('rope.png', cover, center, 124px, $castle-size); | |
transform: translate3d(-50%, -50%, 0); | |
} | |
.rope--left{ | |
animation-name: ropeLeft; | |
transform: translateX(252px) translateZ(-74px) rotateY(30deg) rotateZ(-90deg); | |
} | |
.rope--right{ | |
animation-name: ropeRight; | |
transform: translateX(-252px) translateZ(-74px) rotateY(-30deg) rotateZ(-270deg); | |
} | |
@keyframes ropeLeft{ | |
0%{ transform: translateX(252px) translateZ(-74px) rotateY(30deg) rotateZ(-90deg); } | |
50%{ transform: translateX(252px) translateZ(-74px) rotateY(40deg) rotateZ(-90deg); } | |
100%{ transform: translateX(252px) translateZ(-74px) rotateY(30deg) rotateZ(-90deg); } | |
} | |
@keyframes ropeRight{ | |
0%{ transform: translateX(-252px) translateZ(-74px) rotateY(-30deg) rotateZ(-270deg); } | |
50%{ transform: translateX(-252px) translateZ(-74px) rotateY(-40deg) rotateZ(-270deg); } | |
100%{ transform: translateX(-252px) translateZ(-74px) rotateY(-30deg) rotateZ(-270deg); } | |
} |