Step into the gritty world of Breaking Bad with a fully realized 3D truck scene built entirely with CSS—no images, no frameworks, just code! In this blog, we’ll recreate the iconic mobile meth lab truck using advanced CSS techniques, including 3D transforms, gradients, and keyframe animations, to build every detail of the truck and its surroundings. From the bold contours of the vehicle to subtle shadows and textures, this project is a tribute to both the show and the art of CSS creativity. Ready to cook up some design brilliance? Let’s get started!
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 3D Breaking Bad – Pure CSS by Ricardo Oliva Alonso (@ricardoolivaalonso) 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.
#h.main .shake .shadows .shadow-1.shadow .shadow-2.shadow .shadow-3.shadow .truck .a0 .a0__front.face .a0__back.face .a0__right.face .a0__left.face .a0__top.face .a0__bottom.face .a1 .a1__front.face .a1__front-a.face .f-light .f-light .a1__back.face .a1__right.face .a1__left.face //- div.a1__top.face .a1__bottom.face .a2 .a2__front.face .a2__back.face .a2__right.face .a2__left.face //- div.a2__top.face .a2__bottom.face .a3 .a3__front.face .a3__back.face .a3__right.face .a3__left.face //- div.a3__top.face .a3__bottom.face .wheel-a.flex .circle.flex .circle-a - var n = 0; while n < 36 .circle-a__side - n++; .circle-a__bottom .circle-a__top .circle-b - var n = 0; while n < 36 .circle-b__side - n++; .circle-b__bottom .circle-b__top .wheel-b.flex .circle.flex .circle-a - var n = 0; while n < 36 .circle-a__side - n++; .circle-a__bottom .circle-a__top .circle-b - var n = 0; while n < 36 .circle-b__side - n++; .circle-b__bottom .circle-b__top .wheel-c.flex .circle.flex .circle-a - var n = 0; while n < 36 .circle-a__side - n++; .circle-a__bottom .circle-a__top .circle-b - var n = 0; while n < 36 .circle-b__side - n++; .circle-b__bottom .circle-b__top .wheel-d.flex .circle.flex .circle-a - var n = 0; while n < 36 .circle-a__side - n++; .circle-a__bottom .circle-a__top .circle-b - var n = 0; while n < 36 .circle-b__side - n++; .circle-b__bottom .circle-b__top .b1 .b1__front.face .f-light .f-hoods .f-hood .f-hood__front.face .f-hood__back.face .f-hood__right.face .f-hood__left.face .f-hood__top.face .f-hood__bottom.face .f-hood .f-hood__front.face .f-hood__back.face .f-hood__right.face .f-hood__left.face .f-hood__top.face .f-hood__bottom.face .f-light .b1__back.face .b1__right.face .b1__left.face //- div.b1__top.face .b1__bottom.face .c1 .c1__front.face .c1__front-a.face .f-lights .f-light .f-light .f-light .f-light .f-light .f-window .f-washers .f-washer .f-washer .f-reflexa .f-reflexb .f-a .f-a__front.face .f-a__back.face .f-a__right.face .f-a__left.face .f-a__top.face .f-a__bottom.face .f-line .c1__back.face .c1__right.face .f-swindows .f-swindow .f-swindow .f-swindow .f-swindow .f-swindow .f-swindow .c1__left.face .f-swindows.f-swindows--reverse .f-swindow .f-swindow .f-swindow .f-swindow .f-swindow .f-swindow .f-sdoor .c1__top.face .f-airs .f-air .f-air__front.face .f-air__back.face .f-air__right.face .f-air__left.face .f-air__top.face .f-air__bottom.face .f-sunr .f-sunr-t .f-bubble .f-bubble .f-bubble .f-bubble .f-bubble .f-bubble .f-bubble .f-bubble .f-bubble .f-bubble .f-air .f-air__front.face .f-air__back.face .f-air__right.face .f-air__left.face .f-air__top.face .f-air__bottom.face .c1__bottom.face .d1 .d1-l .d1-l__front.face .d1-l__back.face .d1-l__right.face .d1-l__left.face .d1-l__top.face .d1-l__bottom.face .d1-r .d1-r__front.face .d1-r__back.face .d1-r__right.face .d1-r__left.face .d1-r__top.face .d1-r__bottom.face .d1-f .d1-fa .d1-fa__front.face .d1-fa__back.face .d1-fa__right.face .d1-fa__left.face .d1-fa__top.face .d1-fa__bottom.face .d1-fa .d1-fa__front.face .d1-fa__back.face .d1-fa__right.face .d1-fa__left.face .d1-fa__top.face .d1-fa__bottom.face .d1-fa .d1-fa__front.face .d1-fa__back.face .d1-fa__right.face .d1-fa__left.face .d1-fa__top.face .d1-fa__bottom.face .d1-fa .d1-fa__front.face .d1-fa__back.face .d1-fa__right.face .d1-fa__left.face .d1-fa__top.face .d1-fa__bottom.face
CSS Code
Create a file style.css and paste the code below.
$bg-1: #76b9e9;
$bg-2: #518bb5;
$brown-1: #eeeada;
$brown-2: #dfd9c1;
$brown-3: #b9b49f;
$brown-4: #535149;
$black-1: #222222;
$black-2: #0f0f0f;
$black-3: #000000;
$white-1: #fffeff;
$white-2: #e2e2e2;
$white-3: #d1cece;
$orange-1: #ff6e49;
$orange-2: #cd4d2c;
$orange-3: #b12400;
$blue-1: #4a778c;
$blue-2: #1d3746;
$blue-3: #121f2e;
$meta: #388dbb;
/***********************/
@mixin cylinder($base, $sides, $degree, $pi, $width, $color) {
display: flex;
justify-content: center;
align-items: center;
position: absolute;
&__side {
position: absolute;
height: (2 * $pi * ($base / 2)) / $sides;
width: $width;
background-color: darken($color, 15);
@for $var from 1 to ($sides + 1) {
&:nth-of-type(#{$var}) {
transform: rotateX($var * $degree / $sides) translateZ($base / 2);
}
}
// @for $var from 1 to 20 {
// &:nth-of-type(#{$var}){ background-color: darken($color, $var * 1.5); }
// }
// @for $var from 1 to 20 {
// &:nth-last-of-type(#{$var}){ background-color: darken($color, $var * 1.5); }
// }
}
&__top,
&__bottom {
position: absolute;
width: $base;
height: $base;
border-radius: 50%;
transform: rotateY(90deg) translateZ($width / 2);
}
&__bottom {
transform: rotateY(90deg) translateZ($width / -2);
}
}
@mixin cube($width, $height, $depth) {
&__front {
@include cube-front($width, $height, $depth);
}
&__back {
@include cube-back($width, $height, $depth);
}
&__right {
@include cube-right($width, $height, $depth);
}
&__left {
@include cube-left($width, $height, $depth);
}
&__top {
@include cube-top($width, $height, $depth);
}
&__bottom {
@include cube-bottom($width, $height, $depth);
}
}
//----------------------
@mixin cube-front($width, $height, $depth) {
width: $width;
height: $height;
transform-origin: bottom left;
transform: rotateX(-90deg) translateZ(-($height - ($depth * 2)));
}
@mixin cube-back($width, $height, $depth) {
width: $width;
height: $height;
transform-origin: top left;
transform: rotateX(-90deg) rotateY(180deg) translateX(-$width)
translateY(-$height);
}
@mixin cube-right($width, $height, $depth) {
width: $depth * 2;
height: $height;
transform-origin: top left;
transform: rotateY(90deg) rotateZ(-90deg) translateZ($width)
translateX(-$depth * 2) translateY(-$height);
}
@mixin cube-left($width, $height, $depth) {
width: $depth * 2;
height: $height;
transform-origin: top left;
transform: rotateY(-90deg) rotateZ(90deg) translateY(-$height);
}
@mixin cube-top($width, $height, $depth) {
width: $width;
height: $depth * 2;
transform-origin: top left;
transform: translateZ($height);
}
@mixin cube-bottom($width, $height, $depth) {
width: $width;
height: $depth * 2;
transform-origin: top left;
transform: rotateY(180deg) translateX(-$width);
}
@mixin face-ani($animation, $time, $side, $width-el, $height-el, $depth-el) {
animation: #{$animation} #{$time} infinite ease;
@keyframes #{$animation} {
0%,
15%,
45%,
60%,
62%,
68% {
@if $side == "cube-front" {
@include cube-front($width-el, $height-el, $depth-el);
} @else if $side == "cube-back" {
@include cube-back($width-el, $height-el, $depth-el);
} @else if $side == "cube-right" {
@include cube-right($width-el, $height-el, $depth-el);
} @else if $side == "cube-left" {
@include cube-left($width-el, $height-el, $depth-el);
} @else if $side == "cube-top" {
@include cube-top($width-el, $height-el, $depth-el);
} @else if $side == "cube-bottom" {
@include cube-bottom($width-el, $height-el, $depth-el);
}
}
20%,
40%,
58%,
64%,
70%,
100% {
@if $side == "cube-front" {
@include cube-front($width-el, $height-finish, $depth-el);
} @else if $side == "cube-back" {
@include cube-back($width-el, $height-finish, $depth-el);
} @else if $side == "cube-right" {
@include cube-right($width-el, $height-finish, $depth-el);
} @else if $side == "cube-left" {
@include cube-left($width-el, $height-finish, $depth-el);
} @else if $side == "cube-top" {
@include cube-top($width-el, $height-finish, $depth-el);
} @else if $side == "cube-bottom" {
@include cube-bottom($width-el, $height-el, $depth-el);
}
}
}
}
@mixin cube-color($color) {
&__front {
background-color: darken($color, 5);
}
&__back {
background-color: darken($color, 10);
}
&__right {
background-color: darken($color, 10);
}
&__left {
background-color: darken($color, 20);
}
&__top {
background-color: $color;
}
&__bottom {
background-color: darken($color, 20);
}
}
/***********************/
/***********************/
*,
*::after,
*::before {
margin: 0;
padding: 0;
box-sizing: border-box;
transform-style: preserve-3d;
user-select: none;
-webkit-tap-highlight-color: transparent;
appearance: none;
font-family: sans-serif;
}
/***********************/
/***********************/
body {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
width: 100%;
overflow: hidden;
background-color: $bg-1;
}
.face {
position: absolute;
}
.flex {
display: flex;
justify-content: center;
align-items: center;
}
/***********************/
/***********************/
.main {
width: 20vmin;
height: 40vmin;
transform: perspective(30000px) scale(1.2) rotateX(55deg) rotateZ(35deg)
translateZ(-10vmin);
transition: 100ms linear;
cursor: grab;
}
.shake {
width: 100%;
height: 100%;
animation: shake 2500ms cubic-bezier(0.17, 0.67, 0.52, 0.94) infinite;
}
.truck {
position: absolute;
width: 20vmin;
height: 40vmin;
animation: truck 1000ms cubic-bezier(0.17, 0.67, 0.52, 0.94) infinite;
}
.shadows {
position: absolute;
width: 20vmin;
height: 40vmin;
}
.shadow {
position: absolute;
height: 100%;
transform-origin: bottom left;
box-shadow: 0 0 1vmin $bg-2;
&-1 {
width: 50%;
left: 100%;
transform: skewY(-15deg);
background-color: $bg-2;
filter: blur(0.35vmin);
}
&-2 {
width: 150%;
transform: skewY(-15deg);
background-color: $bg-2;
filter: blur(0.35vmin);
}
&-3 {
width: 100%;
background-image: linear-gradient(
to right,
rgba(darken($bg-2, 5), 0.85),
rgba(darken($bg-2, 20), 0.85),
rgba(darken($bg-2, 15), 0.85)
);
filter: blur(0.5vmin);
}
}
/***********************/
/***********************/
.a0 {
$width-el: 20vmin;
$height-el: 3vmin;
$depth-el: 0.75vmin;
@include cube($width-el, $height-el, $depth-el);
width: $width-el;
height: $depth-el * 2;
position: absolute;
top: -1.5vmin;
left: 0;
transform: translateZ(2.75vmin) rotateX(25deg);
&__front {
background-color: darken($brown-1, 10);
display: flex;
justify-content: space-between;
align-items: center;
width: 100%;
padding: 0 2.5vmin;
.f-light {
position: relative;
width: 1vmin;
height: 1vmin;
background-color: $orange-3;
border-radius: 50%;
}
}
&__back {
background-color: darken($brown-3, 15);
}
&__right {
background-color: darken($brown-3, 10);
}
&__left {
background-color: darken($brown-1, 5);
}
&__top {
background-color: darken($brown-3, 5);
}
&__bottom {
background-color: $brown-4;
}
}
.a1 {
$width-el: 20vmin;
$height-el: 3vmin;
$depth-el: 1vmin;
@include cube($width-el, $height-el, $depth-el);
width: $width-el;
height: $depth-el * 2;
position: absolute;
bottom: 0;
left: 0;
transform: translateZ(2vmin);
&__front {
background-color: $brown-1;
&-a {
display: flex;
justify-content: space-between;
position: absolute;
bottom: 0;
width: 100%;
height: 3.275vmin;
padding: 1vmin 2.5vmin;
transform-origin: bottom;
transform: rotateX(-25deg);
background-image: linear-gradient(
to bottom,
darken($brown-2, 5),
darken($brown-2, 10)
);
.f-light {
position: relative;
width: 1.15vmin;
height: 1.15vmin;
background-color: $orange-2;
border-radius: 50%;
}
}
}
&__back {
&::before {
content: "";
position: absolute;
bottom: 0;
width: 100%;
height: 3.275vmin;
transform-origin: bottom;
transform: rotateX(-25deg);
background-color: $brown-4;
}
}
&__right {
background-color: darken($brown-3, 15);
&::before {
content: "";
position: absolute;
right: -1.75vmin;
width: 1.75vmin;
height: 100%;
background-image: linear-gradient(
-65deg,
transparent 1.6vmin,
darken($brown-3, 15) 1.6vmin
);
}
&::after {
content: "";
position: absolute;
left: -1.75vmin;
width: 1.75vmin;
height: 100%;
background-image: linear-gradient(
65deg,
transparent 1.6vmin,
darken($brown-3, 15) 1.6vmin
);
}
}
&__left {
background-color: darken($brown-1, 5);
&::before {
content: "";
position: absolute;
left: -1.75vmin;
width: 1.75vmin;
height: 100%;
background-image: linear-gradient(
65deg,
transparent 1.6vmin,
darken($brown-1, 5) 1.6vmin
);
}
&::after {
content: "";
position: absolute;
right: -1.75vmin;
width: 1.75vmin;
height: 100%;
background-image: linear-gradient(
-65deg,
transparent 1.6vmin,
darken($brown-1, 5) 1.6vmin
);
}
}
&__top {
background-color: $brown-2;
top: -1.35vmin;
height: 3.35vmin;
}
&__bottom {
background-color: $brown-4;
}
}
.a2 {
$width-el: 20vmin;
$height-el: 3vmin;
$depth-el: 8vmin;
@include cube($width-el, $height-el, $depth-el);
width: $width-el;
height: $depth-el * 2;
position: absolute;
bottom: 9vmin;
left: 0;
transform: translateZ(2vmin);
&__front {
background-color: $brown-1;
&::before {
content: "";
position: absolute;
bottom: 0;
width: 100%;
height: 3.275vmin;
transform-origin: bottom;
transform: rotateX(-25deg);
background-color: $brown-4;
}
}
&__back {
background-color: $brown-3;
&::before {
content: "";
position: absolute;
bottom: 0;
width: 100%;
height: 3.275vmin;
transform-origin: bottom;
transform: rotateX(-25deg);
background-color: $brown-4;
}
}
&__right {
background-color: darken($brown-3, 15);
&::before {
content: "";
position: absolute;
left: -1.75vmin;
width: 1.75vmin;
height: 100%;
background-image: linear-gradient(
65deg,
transparent 1.6vmin,
darken($brown-3, 15) 1.6vmin
);
}
&::after {
content: "";
position: absolute;
right: -1.75vmin;
width: 1.75vmin;
height: 100%;
background-image: linear-gradient(
-65deg,
transparent 1.6vmin,
darken($brown-3, 15) 1.6vmin
);
}
}
&__left {
background-color: darken($brown-1, 5);
&::before {
content: "";
position: absolute;
left: -1.75vmin;
width: 1.75vmin;
height: 100%;
background-image: linear-gradient(
65deg,
transparent 1.6vmin,
darken($brown-1, 5) 1.6vmin
);
}
&::after {
content: "";
position: absolute;
right: -1.75vmin;
width: 1.75vmin;
height: 100%;
background-image: linear-gradient(
-65deg,
transparent 1.6vmin,
darken($brown-1, 5) 1.6vmin
);
}
}
&__top {
background-color: $brown-2;
top: -1.35vmin;
height: 18.75vmin;
}
&__bottom {
background-color: $brown-4;
}
}
.a3 {
$width-el: 20vmin;
$height-el: 3vmin;
$depth-el: 4vmin;
@include cube($width-el, $height-el, $depth-el);
width: $width-el;
height: $depth-el * 2;
position: absolute;
bottom: 32vmin;
left: 0;
transform: translateZ(2vmin);
&__front {
background-color: $brown-1;
&::before {
content: "";
position: absolute;
bottom: 0;
width: 100%;
height: 3.275vmin;
transform-origin: bottom;
transform: rotateX(-25deg);
background-color: $brown-4;
}
}
&__back {
&::before {
content: "";
position: absolute;
bottom: 0;
width: 100%;
height: 3.5vmin;
transform-origin: bottom;
transform: rotateX(-25deg);
background-color: darken($brown-3, 25);
}
}
&__right {
background-color: darken($brown-3, 15);
&::before {
content: "";
position: absolute;
left: -1.75vmin;
width: 1.75vmin;
height: 100%;
background-image: linear-gradient(
65deg,
transparent 1.6vmin,
darken($brown-3, 15) 1.6vmin
);
}
&::after {
content: "";
position: absolute;
right: -1.75vmin;
width: 1.75vmin;
height: 100%;
background-image: linear-gradient(
-65deg,
transparent 1.6vmin,
darken($brown-3, 15) 1.6vmin
);
}
}
&__left {
background-color: darken($brown-1, 5);
&::before {
content: "";
position: absolute;
right: -1.75vmin;
width: 1.75vmin;
height: 100%;
background-image: linear-gradient(
-65deg,
transparent 1.6vmin,
darken($brown-1, 5) 1.6vmin
);
}
&::after {
content: "";
position: absolute;
left: -1.75vmin;
width: 1.75vmin;
height: 100%;
background-image: linear-gradient(
65deg,
transparent 1.6vmin,
darken($brown-1, 5) 1.6vmin
);
}
}
&__top {
background-color: $brown-2;
bottom: -1.35vmin;
height: 9.35vmin;
}
&__bottom {
background-color: $brown-4;
}
}
.wheel-a,
.wheel-b,
.wheel-c,
.wheel-d {
position: absolute;
bottom: 2.75vmin;
left: -4.5vmin;
height: 5vmin;
width: 5vmin;
transform-origin: bottom right;
transform: rotateY(90deg);
.circle {
$sides: 36;
$degree: 360deg;
$width: 2vmin;
width: 2vmin;
height: 2vmin;
border-radius: 50%;
&-a {
$base: 5vmin;
$pi: 3.5;
position: absolute;
width: $width;
height: $base;
transform: rotateY(90deg) translateX(-50%);
@include cylinder($base, $sides, $degree, $pi, $width, $black-1);
&__top {
border: 0.5vmin solid $black-1;
}
&__bottom {
border: 0.5vmin solid $black-3;
}
}
&-b {
$base: 4vmin;
$pi: 3.5;
position: absolute;
width: $width;
height: $base;
transform: rotateY(90deg) translateX(-50%);
@include cylinder($base, $sides, $degree, $pi, $width, $black-1);
&__bottom {
border: 0.25vmin solid $white-3;
background-color: $black-2;
}
&__top {
border: 0.25vmin solid $white-1;
background-color: $black-1;
}
}
}
}
.wheel-b {
bottom: 25.75vmin;
}
.wheel-c {
bottom: 2.75vmin;
left: 12.5vmin;
}
.wheel-d {
bottom: 25.75vmin;
left: 12.5vmin;
}
.b1 {
$width-el: 20vmin;
$height-el: 5vmin;
$depth-el: 21.35vmin;
@include cube($width-el, $height-el, $depth-el);
width: $width-el;
height: $depth-el * 2;
position: absolute;
bottom: -1.35vmin;
left: 0;
transform: translateZ(5vmin);
&__front {
background-color: darken($brown-1, 5);
display: grid;
grid-template-columns: auto 1fr auto;
padding-top: 1.5vmin;
grid-column-gap: 1.25vmin;
.f-light {
position: relative;
top: 1.5vmin;
width: 2.5vmin;
height: 1vmin;
background-color: $orange-2;
box-shadow: inset 0 0 0.25vmin darken($orange-2, 10),
inset 0 0 1vmin rgba($orange-3, 0.15);
}
}
&__back {
&::before {
content: "";
position: absolute;
bottom: 0;
width: 100%;
height: 5.25vmin;
transform-origin: bottom;
transform: rotateX(-15deg);
background-color: darken($brown-3, 10);
}
}
&__right {
// background-color: $brown-3;
background-image: linear-gradient(
to top,
darken($brown-3, 10) 1vmin,
$orange-3 1vmin,
$orange-3 2vmin,
darken($brown-3, 5) 2vmin
);
&::before {
content: "";
position: absolute;
right: -1.75vmin;
width: 1.75vmin;
height: 100%;
background-image: linear-gradient(
-75deg,
transparent 1.675vmin,
darken($brown-3, 5) 1.675vmin
);
}
}
&__left {
background-color: $brown-1;
background-image: linear-gradient(
to top,
darken($brown-1, 4) 1vmin,
$orange-1 1vmin,
$orange-1 2vmin,
darken($brown-1, 1) 2vmin
);
&::before {
content: "";
position: absolute;
left: -1.75vmin;
width: 1.75vmin;
height: 100%;
background-image: linear-gradient(
75deg,
transparent 1.675vmin,
$brown-1 1.675vmin
);
}
}
&__top {
background-color: $brown-2;
height: 44.125vmin;
top: -1.4vmin;
}
&__bottom {
background-color: $brown-4;
}
}
.c1 {
$width-el: 20vmin;
$height-el: 10vmin;
$depth-el: 22vmin;
@include cube($width-el, $height-el, $depth-el);
width: $width-el;
height: $depth-el * 2;
position: absolute;
bottom: -1.35vmin;
left: 0;
transform: translateZ(10vmin);
&__front {
&-a {
display: grid;
grid-template-rows: auto 1fr auto;
position: absolute;
bottom: 0;
width: 100%;
height: 10.45vmin;
transform-origin: bottom;
transform: rotateX(15deg);
background-color: $brown-1;
.f-lights {
display: grid;
grid-template-columns: repeat(5, 1fr);
align-items: start;
padding: 0.9vmin 0.75vmin 0.6vmin;
}
.f-light {
justify-self: center;
width: 1vmin;
height: 1vmin;
background-color: $orange-2;
border-radius: 0.25vmin;
box-shadow: inset 0 0 0.25vmin darken($orange-2, 10),
inset 0 0 0.5vmin rgba($orange-3, 0.15);
}
.f-window {
width: 100%;
margin: 0.5vmin 0 0.25vmin;
background-image: linear-gradient(
to right,
darken($blue-1, 3),
darken($blue-1, 8)
);
box-shadow: inset 0 0 0.5vmin $blue-2,
inset 0 0 0.75vmin rgba($blue-3, 0.25);
overflow: hidden;
&::before {
content: "";
position: absolute;
width: 100%;
height: 0.675vmin;
background-color: rgba($blue-2, 0.35);
}
.f-reflexa {
position: absolute;
left: 1vmin;
top: 5vmin;
width: 6vmin;
height: 5vmin;
border-radius: 50%;
background-color: rgba($white-1, 0.05);
filter: blur(0.35vmin);
display: none;
}
.f-reflexb {
position: absolute;
top: 0;
left: 0;
width: 1.65vmin;
height: 100%;
border-radius: 0;
background-image: linear-gradient(
to right,
rgba($white-1, 0.075),
rgba($white-1, 0.05)
);
filter: blur(0.1vmin);
}
.f-washers {
position: absolute;
width: 100%;
height: 1.25vmin;
bottom: 0;
background-color: rgba($blue-2, 0.2);
}
.f-washer {
position: absolute;
width: 4vmin;
height: 0.3vmin;
background-color: $black-1;
&:nth-of-type(1) {
transform-origin: bottom right;
right: 52%;
animation: washer-r 800ms cubic-bezier(0.17, 0.67, 0.52, 0.94) alternate
infinite;
}
&:nth-of-type(2) {
transform-origin: bottom left;
left: 51.5%;
animation: washer-l 800ms cubic-bezier(0.17, 0.67, 0.52, 0.94) alternate
infinite;
}
}
}
.f-line {
width: 100%;
height: 0.5vmin;
background-color: $orange-2;
}
}
}
&__back {
background-color: $brown-3;
&::before {
content: "";
position: absolute;
width: calc(100% - 4vmin);
top: 2.85vmin;
left: 2vmin;
height: 6.25vmin;
background-color: $blue-2;
box-shadow: inset 0 0 0.5vmin darken($blue-3, 10),
inset 0 0 1vmin rgba(darken($blue-3, 10), 0.5);
}
}
&__right {
background-image: linear-gradient(
-75deg,
darken($brown-3, 2) 42.5vmin,
transparent 42.5vmin
);
&::before {
content: "";
position: absolute;
top: 0.75vmin;
width: 100%;
height: 1vmin;
background-image: linear-gradient(
-75deg,
$orange-3 40.25vmin,
transparent 40.25vmin
);
}
}
&__left {
background-image: linear-gradient(
75deg,
$brown-1 42.5vmin,
transparent 42.5vmin
);
&::before {
content: "";
position: absolute;
top: 0.75vmin;
width: 100%;
height: 1vmin;
background-image: linear-gradient(
75deg,
$orange-1 40.25vmin,
transparent 40.25vmin
);
}
}
&__top {
background-image: linear-gradient(
to right,
lighten($brown-2, 2),
darken($brown-2, 3)
);
height: 41.25vmin;
}
&__bottom {
background-color: $brown-4;
}
}
.d1-l,
.d1-r {
$width-el: 0.35vmin;
$height-el: 0.5vmin;
$depth-el: 15vmin;
position: absolute;
top: 3vmin;
@include cube($width-el, $height-el, $depth-el);
width: $width-el;
transform: translateZ(20.5vmin);
&__front {
background-color: $black-3;
}
&__back {
background-color: $black-1;
}
&__right {
background-color: $black-3;
}
&__left {
background-color: $black-1;
}
&__top {
background-color: $black-1;
}
&__bottom {
background-color: $black-3;
}
}
.d1-l {
left: 1vmin;
&__bottom {
&::before {
content: "";
position: absolute;
top: 1vmin;
right: 0;
width: 2vmin;
height: 28vmin;
border: 0.5vmin solid $brown-3;
border-left-width: 0.9vmin;
transform-origin: bottom right;
transform: translateZ(0.45vmin) skewY(25deg);
}
}
}
.d1-r {
right: 1vmin;
&__bottom {
&::before {
content: "";
position: absolute;
top: 1vmin;
right: 0;
width: 1.5vmin;
height: 28vmin;
border: 0.75vmin solid $brown-3;
border-left-width: 0;
transform-origin: bottom right;
transform: translateZ(0.45vmin) skewY(25deg);
}
}
}
.d1-fa {
$width-el: 0.35vmin;
$height-el: 0.5vmin;
$depth-el: 0.35vmin;
position: absolute;
@include cube($width-el, $height-el, $depth-el);
width: $width-el;
transform: translateZ(20vmin);
&__front {
background-color: $black-3;
}
&__back {
background-color: $black-1;
}
&__right {
background-color: $black-3;
}
&__left {
background-color: $black-1;
}
&__top {
background-color: $black-1;
}
&__bottom {
background-color: $black-3;
}
&:nth-of-type(1) {
top: 4vmin;
left: 1vmin;
}
&:nth-of-type(2) {
top: 4vmin;
right: 1vmin;
}
&:nth-of-type(3) {
top: 31vmin;
left: 1vmin;
}
&:nth-of-type(4) {
top: 31vmin;
right: 1vmin;
}
}
// ===========================================
.f-airs {
display: grid;
grid-template-rows: auto;
width: 100%;
height: 100%;
padding: 4vmin;
}
.f-air {
$width-el: 5vmin;
$height-el: 1vmin;
$depth-el: 4vmin;
@include cube($width-el, $height-el, $depth-el);
width: $width-el;
height: 8vmin;
justify-self: center;
transform: translateZ(0.1vmin);
&::before {
content: "";
position: absolute;
width: 120%;
height: 110%;
bottom: 0;
background-image: linear-gradient(
-35deg,
transparent 0.5vmin,
$brown-3 0.5vmin
);
}
&__front {
&::before {
content: "";
position: absolute;
bottom: 0;
transform-origin: bottom left;
transform: rotateX(66deg);
width: 100%;
height: 2.6vmin;
background-image: linear-gradient(to bottom, $white-1, darken($white-1, 3));
}
}
&__back {
background-color: darken($white-3, 8);
}
&__right {
background-image: linear-gradient(
-25deg,
darken($white-3, 4) 3.25vmin,
transparent 3.35vmin
);
}
&__left {
background-image: linear-gradient(
25deg,
$white-2 3.25vmin,
transparent 3.35vmin
);
}
&__top {
background-image: linear-gradient(to right, $white-2, darken($white-2, 3));
height: 5.5vmin;
}
&__bottom {
background-color: $white-2;
}
}
.f-sunr {
width: 4vmin;
height: 4vmin;
justify-self: center;
transform: translateZ(0.1vmin);
box-shadow: inset 0 0 0.25vmin $black-2;
background-image: linear-gradient(
to right,
darken($brown-4, 25),
darken($brown-4, 15)
);
&::before {
content: "";
position: absolute;
left: 100%;
width: 3vmin;
height: 100%;
bottom: 0;
background-image: linear-gradient(-45deg, transparent 2vmin, $brown-3 2vmin);
}
&-t {
position: absolute;
bottom: -0.1vmin;
width: 100%;
height: 100%;
transform-origin: bottom;
transform: rotateX(-70deg);
background-image: linear-gradient(to top, $white-1, darken($white-1, 5));
}
}
.f-hoods {
display: grid;
grid-template-columns: 1fr 1fr;
grid-column-gap: 0.25vmin;
padding-top: 0.5vmin;
}
.f-hood {
$width-el: 6vmin;
$height-el: 0.25vmin;
$depth-el: 1.5vmin;
@include cube($width-el, $height-el, $depth-el);
width: $width-el;
justify-self: center;
&__front {
background-color: darken($black-3, 20);
}
&__back {
background-color: darken($black-1, 20);
}
&__right {
background-color: darken($black-3, 20);
}
&__left {
background-color: darken($black-1, 20);
}
&__top {
background: repeating-linear-gradient(
$black-1 0,
$black-1 0.25vmin,
$black-2 0.25vmin,
$black-2 0.35vmin
);
}
&__bottom {
background-color: darken($black-3, 20);
}
}
.f-swindows {
height: 100%;
width: 100%;
padding: 2.85vmin 1vmin 0.8vmin 0;
display: grid;
grid-template-columns: auto auto 2fr auto 1fr 0.5fr;
grid-column-gap: 0.5vmin;
&--reverse {
padding: 2.85vmin 0 0.8vmin 1vmin;
grid-template-columns: auto auto 1fr auto 1.5fr 0.5fr;
direction: rtl;
.f-swindow {
background-color: $blue-1;
box-shadow: inset 0 0 0.35vmin darken($blue-2, 12),
inset 0 0 1vmin rgba(darken($blue-2, 12), 0.5);
&:nth-of-type(1) {
background-image: linear-gradient(
75deg,
$blue-1 2.75vmin,
transparent 2.75vmin
);
}
}
}
}
.f-swindow {
height: 100%;
width: 100%;
background-color: $blue-2;
box-shadow: inset 0 0 0.5vmin darken($blue-3, 10),
inset 0 0 1vmin rgba(darken($blue-3, 10), 0.5);
&:nth-of-type(1) {
width: 3vmin;
background-color: transparent;
background-image: linear-gradient(
-75deg,
$blue-2 2.75vmin,
transparent 2.75vmin
);
box-shadow: none;
}
&:nth-of-type(2) {
width: 5vmin;
}
&:nth-of-type(3) {
height: 50%;
}
&:nth-of-type(4) {
width: 10vmin;
background-color: transparent;
box-shadow: none;
}
}
.f-sdoor {
position: absolute;
top: 1.85vmin;
right: 19vmin;
height: 14vmin;
width: 6vmin;
transform: translateY(1vmin);
background-color: $brown-2;
border-radius: 0.75vmin;
border: 0.1vmin solid $brown-4;
box-shadow: inset 0 0 0.35vmin darken($brown-3, 12),
inset 0 0 1vmin rgba(darken($brown-3, 12), 0.5);
}
.f-a {
$width-el: 0.25vmin;
$height-el: 0.25vmin;
$depth-el: 3.175vmin;
@include cube($width-el, $height-el, $depth-el);
width: $width-el;
height: $depth-el * 2;
position: absolute;
left: 50%;
bottom: 1vmin;
transform: translateX(-50%);
&__front {
background-color: $black-1;
}
&__back {
background-color: $black-3;
}
&__right {
background-color: $black-3;
}
&__left {
background-color: $black-1;
}
&__top {
background-color: $black-2;
}
&__bottom {
background-color: $black-3;
}
}
.f-bubble {
position: absolute;
left: 0.5vmin;
top: 0.5vmin;
width: 1vmin;
height: 1vmin;
transform-origin: center;
transform: translateZ(-1vmin) rotateY(90deg) rotateX(90deg);
background-color: $meta;
border-radius: 50%;
animation: bubble 1000ms cubic-bezier(0.17, 0.67, 0.52, 0.94) infinite;
filter: blur(0.25vmin);
@for $var from 1 to 10 {
&:nth-of-type(#{$var}) {
animation-delay: 20ms * $var;
}
}
}
// *********************************
// *********************************
@keyframes shake {
0%,
90%,
100% {
transform: translateY(0);
}
20% {
transform: translateY(1vmin);
}
30% {
transform: translateY(3vmin);
}
40% {
transform: translateY(1.95vmin);
}
50% {
transform: translateY(1vmin);
}
60% {
transform: translateY(1.85vmin);
}
70% {
transform: translateY(0.95vmin);
}
80% {
transform: translateY(-1vmin);
}
}
@keyframes truck {
0%,
20%,
40%,
60%,
80%,
100% {
transform-origin: center;
transform: translateZ(0) rotateY(-0.65deg) rotateX(-0.65deg);
}
10%,
30%,
50%,
70%,
90% {
transform-origin: center;
transform: translateZ(0.125vmin) rotateY(0.5deg) rotateX(0.5deg);
}
}
@keyframes bubble {
0% {
width: 0;
height: 0;
left: 0.5vmin;
top: 0.5vmin;
opacity: 0;
transform: translateZ(-1vmin) rotateY(90deg) rotateX(90deg);
}
20% {
width: 0.25vmin;
height: 0.25vmin;
left: 2vmin;
transform: translateZ(1vmin) rotateY(90deg) rotateX(90deg);
}
30% {
width: 0.5vmin;
height: 1vmin;
left: 3vmin;
transform: translateZ(2vmin) rotateY(90deg) rotateX(90deg);
}
50% {
left: 1.5vmin;
transform: translateZ(3vmin) rotateY(90deg) rotateX(90deg);
}
60% {
width: 2vmin;
height: 3vmin;
left: 5vmin;
transform: translateZ(5vmin) rotateY(90deg) rotateX(90deg);
opacity: 0.75;
}
80% {
width: 1vmin;
height: 2vmin;
left: 6vmin;
transform: translateZ(5.5vmin) rotateY(90deg) rotateX(90deg);
opacity: 0.5;
}
100% {
width: 1vmin;
height: 1.5vmin;
left: 7vmin;
transform: translateZ(7vmin) rotateY(90deg) rotateX(90deg);
opacity: 0.1;
}
}
@keyframes washer-r {
to {
transform: rotateZ(80deg);
}
}
@keyframes washer-l {
to {
transform: rotateZ(-80deg);
}
}
Final Output

Written by: Piyush Patil
Code Credits: https://codepen.io/ricardoolivaalonso/pen/LYLEJBK
If you found any mistakes or have any doubts please feel free to Contact Us
Hope you find this post helpful💖





