CSS-only floating balloon pikachu
A Pen by tiffany choong on CodePen.
CSS-only floating balloon pikachu
A Pen by tiffany choong on CodePen.
<div class="container pika"> | |
<div class="pika-head"> | |
<div class="pika-head-face"> | |
<div class="pika-eye pika-eye-left"></div> | |
<div class="pika-eye pika-eye-right"></div> | |
<div class="pika-nose"></div> | |
<div class="pika-mouth"></div> | |
</div> | |
<div class="pika-ear pika-ear-left"></div> | |
<div class="pika-ear pika-ear-right"></div> | |
</div> | |
<div class="pika-body"> | |
<div class="pika-body-body"></div> | |
<div class="pika-arm pika-arm-left"></div> | |
<div class="pika-arm pika-arm-right"></div> | |
<div class="pika-leg pika-leg-left"></div> | |
<div class="pika-leg pika-leg-right"></div> | |
<div class="pika-tail"></div> | |
<div class="strings"> | |
<div class="string"></div> | |
<div class="string"></div> | |
</div> | |
</div> | |
<div class="balloons"> | |
<div class="balloon cyan"> | |
<div class="string"></div> | |
</div> | |
<div class="balloon red"> | |
<div class="string"></div> | |
</div> | |
<div class="balloon pink"> | |
<div class="string"></div> | |
</div> | |
<div class="balloon blue"> | |
<div class="string"></div> | |
</div> | |
</div> | |
</div> |
// <(o ^-^ o)> |
@import 'https://fonts.googleapis.com/css?family=Roboto+Condensed:300'; | |
$black: #444; | |
$white: #fff; | |
$lavender-pink: #ffa5db; | |
$electric-blue: #6bf0ff; | |
$bleu: #388eff; | |
$primary-color: #f9ed7c; | |
$primary-color-dark: darken( $primary-color, 10% ); | |
$primary-color-tint: lighten( $primary-color, 15% ); | |
$secondary-color: #9c5200; | |
$accent-color: #e65a41; | |
$primary-font: "Roboto Condensed", sans-serif; | |
@mixin animateRotate($name, $end, $start: 0, $dur: 5s) { | |
animation-name: $name; | |
animation-duration: $dur; | |
animation-timing-function: ease-in-out; | |
animation-iteration-count: infinite; | |
@keyframes #{$name} { | |
0%, 100% { transform: rotate(#{$start}deg) } | |
50% { transform: rotate(#{$end}deg) } | |
} | |
} | |
* { box-sizing: border-box; } | |
body { | |
min-height: 100vh; | |
display: flex; | |
justify-content: center; | |
align-items: center; | |
background-color: $primary-color-tint; | |
font-family: $primary-font; | |
font-size: 16px; | |
line-height: 1; | |
} | |
.pika { | |
position: relative; | |
animation-name: floaty; | |
animation-duration: 5s; | |
animation-timing-function: ease-in-out; | |
animation-iteration-count: infinite; | |
&-head { | |
position: relative; | |
z-index: 10; | |
height: 9rem; | |
width: 10rem; | |
&-face { | |
position: absolute; | |
height: 100%; | |
width: 100%; | |
background-color: $primary-color; | |
overflow: hidden; | |
will-change: transform, opacity; | |
border: { | |
top: { | |
left-radius: 50% 4.5rem; | |
right-radius: 50% 4.5rem; | |
} | |
bottom: { | |
left-radius: 50% 3rem; | |
right-radius: 50% 3rem; | |
} | |
} | |
&::before, | |
&::after { | |
content: ''; | |
position: absolute; | |
bottom: 1.125rem; | |
height: 1.5rem; | |
width: 1.75rem; | |
border-radius: 50%; | |
background-color: $accent-color; | |
} | |
&::before { | |
left: -0.25rem; | |
} | |
&::after { | |
right: -0.25rem; | |
} | |
} | |
} | |
&-eye { | |
position: absolute; | |
background-color: $black; | |
bottom: 2.5rem; | |
height: 1.25rem; | |
width: 1.25rem; | |
overflow: hidden; | |
transform-origin: center 70%; | |
animation-name: blinky; | |
animation-duration: 7s; | |
animation-iteration-count: infinite; | |
border: { | |
top: { | |
left-radius: 50%; | |
right-radius: 50%; | |
} | |
bottom: { | |
left-radius: 45% 50%; | |
right-radius: 45% 50%; | |
} | |
} | |
&::before { | |
content: ''; | |
position: absolute; | |
top: 15%; | |
left: 15%; | |
height: 30%; | |
width: 30%; | |
background-color: $white; | |
border-radius: 50%; | |
} | |
&-left { | |
left: 1.5rem; | |
} | |
&-right { | |
right: 1.5rem; | |
} | |
} | |
&-nose { | |
position: absolute; | |
bottom: 2.5rem; | |
left: calc(50% - 0.125rem); | |
height: 0.125rem; | |
width: 0.25rem; | |
border-radius: 50%; | |
background-color: $black; | |
} | |
&-ear { | |
position: absolute; | |
top: -1rem; | |
height: 3.75rem; | |
width: 2rem; | |
background-color: $primary-color; | |
transform-origin: bottom center; | |
overflow: hidden; | |
border: { | |
top: { | |
left-radius: 50% 3rem; | |
right-radius: 50% 3rem; | |
} | |
} | |
&::before { | |
content: ''; | |
position: absolute; | |
left: 0; | |
top: 0; | |
width: 110%; | |
height: 45%; | |
background-color: $black; | |
} | |
&-left { | |
left: 0; | |
transform: rotate(-40deg); | |
@include animateRotate(rotateEarLeft, -35, -40); | |
&::before { | |
transform-origin: bottom left; | |
transform: rotate(-15deg) | |
} | |
} | |
&-right { | |
right: 0; | |
transform: rotate(40deg); | |
@include animateRotate(rotateEarRight, 35, 40); | |
&::before { | |
transform-origin: bottom right; | |
transform: rotate(15deg) | |
} | |
} | |
} | |
&-body { | |
position: absolute; | |
z-index: 9; | |
right: -2rem; | |
top: 35%; | |
height: 8rem; | |
width: 9rem; | |
.string { | |
position: absolute; | |
z-index: 6 !important; | |
bottom: 30%; | |
z-index: 9; | |
height: 1rem; | |
width: 9rem; | |
border-right: solid 1px $white; | |
border-left: solid 1px $white; | |
border-bottom: solid 1px $white; | |
transform: rotate(-15deg); | |
border: { | |
bottom: { | |
left-radius: 50% 1rem; | |
right-radius: 50% 1rem; | |
} | |
} | |
&:nth-child(2) { | |
transform: rotate(-20deg); | |
} | |
} | |
&-body { | |
position: absolute; | |
z-index: 5; | |
height: 100%; | |
width: 100%; | |
background-color: $primary-color; | |
transform: skew(15deg); | |
overflow: hidden; | |
border: { | |
top: { | |
left-radius: 50% 5.5rem; | |
right-radius: 50% 5.5rem; | |
} | |
bottom: { | |
left-radius: 40% 2.5rem; | |
right-radius: 40% 2.5rem; | |
} | |
} | |
&::before, | |
&::after { | |
content: ''; | |
position: absolute; | |
width: 2rem; | |
height: 0.75rem; | |
background-color: $secondary-color; | |
transform: skew(-15deg); | |
transform-origin: right center; | |
transform: rotate(-30deg); | |
border: { | |
top: { | |
left-radius: 2rem 50%; | |
} | |
bottom: { | |
left-radius: 2rem 50%; | |
} | |
} | |
} | |
&::before { | |
right: -0.5rem; | |
top: 2rem; | |
} | |
&::after { | |
right: -1rem; | |
top: 3rem; | |
} | |
} | |
} | |
&-arm { | |
position: absolute; | |
z-index: 9; | |
height: 1.5rem; | |
width: 1.25rem; | |
background-color: $primary-color-dark; | |
transform-origin: top center; | |
border: { | |
top: { | |
left-radius: 0.25rem; | |
right-radius: 0.25rem; | |
} | |
bottom: { | |
left-radius: 3rem 5.5rem; | |
right-radius: 3rem 5.5rem; | |
} | |
} | |
&-left { | |
top: 60%; | |
left: -0.5rem; | |
@include animateRotate(rotateLeft, 25); | |
} | |
&-right { | |
top: 60%; | |
left: 4.75rem; | |
@include animateRotate(rotateRight, -25); | |
} | |
} | |
&-leg { | |
position: absolute; | |
z-index: 1; | |
height: 1.75rem; | |
width: 1.25rem; | |
background-color: $primary-color-dark; | |
transform-origin: top center; | |
border: { | |
top: { | |
left-radius: 0.25rem; | |
right-radius: 0.25rem; | |
} | |
bottom: { | |
left-radius: 3rem 5.5rem; | |
right-radius: 3rem 5.5rem; | |
} | |
} | |
&-left { | |
top: calc(100% - 0.75rem); | |
left: 3rem; | |
@include animateRotate(rotateLeft, 25, 0, 2s); | |
} | |
&-right { | |
top: calc(100% - 0.75rem); | |
left: 7.5rem; | |
@include animateRotate(rotateRight, -25, 0, 2s); | |
} | |
} | |
&-tail { | |
position: absolute; | |
left: calc(100% - 0.75rem); | |
top: 40%; | |
height: 1.5rem; | |
width: 1rem; | |
background-color: $secondary-color; | |
transform-origin: bottom center; | |
transform: rotate(45deg); | |
@include animateRotate(rotateTail, 45, 55); | |
&::before, | |
&::after { | |
content: ''; | |
position: absolute; | |
transform-origin: bottom center; | |
background-color: $primary-color; | |
} | |
&::before { | |
top: -2.5rem; | |
left: 0.25rem; | |
height: 2rem; | |
width: 1.5rem; | |
transform: rotate(-90deg); | |
border: { | |
bottom: { | |
right-radius: 0.5rem; | |
} | |
} | |
} | |
&::after { | |
top: -2.75rem; | |
left: -2.5rem; | |
height: 3rem; | |
width: 2rem; | |
border: { | |
bottom: { | |
left-radius: 0.5rem; | |
} | |
top: { | |
right-radius: 0.5rem; | |
left-radius: 0.5rem; | |
} | |
} | |
} | |
} | |
} | |
.balloons { | |
position: absolute; | |
left: 0; | |
top: -10rem; | |
} | |
.balloon { | |
position: absolute; | |
height: 6.25rem; | |
width: 6rem; | |
border-radius: 50%; | |
background-color: currentColor; | |
&::before, | |
&::after { | |
content: ''; | |
position: absolute; | |
} | |
&::before { | |
top: 20%; | |
left: 10%; | |
width: 15%; | |
height: 20%; | |
border-radius: 50%; | |
background-color: $white; | |
} | |
&::after { | |
bottom: -0.5rem; | |
left: calc(50% - 0.75rem); | |
height: 0.75rem; | |
width: 1.5rem; | |
background-color: currentColor; | |
border: { | |
top: { | |
left-radius: 3rem; | |
right-radius: 3rem; | |
} | |
bottom: { | |
left-radius: 1rem; | |
right-radius: 1rem; | |
} | |
} | |
} | |
&:nth-child(1) { | |
z-index: 4; | |
.string { | |
transform: rotate(-10deg); | |
} | |
} | |
&:nth-child(2) { | |
z-index: 5; | |
top: 2rem; | |
left: 4rem; | |
.string { | |
transform: rotate(10deg); | |
} | |
} | |
&:nth-child(3) { | |
top: 3rem; | |
left: -2rem; | |
.string { | |
transform: rotate(-25deg); | |
} | |
} | |
&:nth-child(4) { | |
top: 0.5rem; | |
left: 7rem; | |
.string { | |
transform: rotate(20deg); | |
} | |
} | |
.string { | |
position: absolute; | |
top: 100%; | |
left: 50%; | |
height: 6rem; | |
border-left: solid 1px $white; | |
transform-origin: top center; | |
} | |
&.pink { | |
color: $lavender-pink; | |
} | |
&.cyan { | |
color: $electric-blue; | |
} | |
&.blue { | |
color: $bleu; | |
} | |
&.red { | |
color: $accent-color; | |
} | |
} | |
@keyframes floaty { | |
0%, 100% { transform: translateY(0) } | |
50% { transform: translateY(1rem) } | |
} | |
@keyframes blinky { | |
0%, 9%, 11%, 19%, 21%, 69%, 71%, 100% { transform: scaleY(1) } | |
10%, 20%, 70% { transform: scaleY(0.1) } | |
} |