<!-- original art and inspiration https://twitter.com/84Aleha/status/1570778115928117248 -->
<div class="frame">
<div class="ambient"></div>
<div class="weather">
<div class="snow" id="snow">
</div>
</div>
<div class="bat-1"></div>
<div class="bat-4">
<div class="level">
<div class="window"></div>
<div class="window"></div>
<div class="window"></div>
</div>
<div class="level">
<div class="window tv"></div>
<div class="window"></div>
<div class="window"></div>
</div>
<div class="level">
<div class="window"></div>
<div class="window"></div>
<div class="window yellow"></div>
</div>
<div class="level">
<div class="window white"></div>
<div class="window"></div>
<div class="window"></div>
</div>
<div class="level">
<div class="window"></div>
<div class="window"></div>
<div class="window"></div>
</div>
<div class="level">
<div class="window"></div>
<div class="window"></div>
<div class="window green"></div>
</div>
<div class="level">
<div class="window"></div>
<div class="window"></div>
<div class="window"></div>
</div>
<div class="level">
<div class="window"></div>
<div class="window blue"></div>
<div class="window"></div>
</div>
<div class="level">
<div class="window"></div>
<div class="window"></div>
<div class="window"></div>
</div>
<div class="level">
<div class="window blue"></div>
<div class="window"></div>
<div class="window"></div>
</div>
<div class="level">
<div class="window"></div>
<div class="window"></div>
<div class="window"></div>
</div>
<div class="level">
<div class="window"></div>
<div class="window"></div>
<div class="window"></div>
</div>
<div class="level">
<div class="window"></div>
<div class="window"></div>
<div class="window"></div>
</div>
<div class="level">
<div class="window"></div>
<div class="window yellow"></div>
<div class="window"></div>
</div>
</div>
<div class="bat-3">
<div class="level">
<div class="window"></div>
<div class="window"></div>
<div class="window"></div>
</div>
<div class="level">
<div class="window"></div>
<div class="window"></div>
<div class="window"></div>
</div>
<div class="level">
<div class="window"></div>
<div class="window yellow"></div>
<div class="window"></div>
</div>
<div class="level">
<div class="window"></div>
<div class="window"></div>
<div class="window"></div>
</div>
<div class="level">
<div class="window"></div>
<div class="window"></div>
<div class="window white"></div>
</div>
<div class="level">
<div class="window"></div>
<div class="window"></div>
<div class="window"></div>
</div>
<div class="level">
<div class="window"></div>
<div class="window"></div>
<div class="window"></div>
</div>
<div class="level">
<div class="window"></div>
<div class="window"></div>
<div class="window"></div>
</div>
<div class="level">
<div class="window"></div>
<div class="window"></div>
<div class="window"></div>
</div>
<div class="level">
<div class="window"></div>
<div class="window"></div>
<div class="window"></div>
</div>
<div class="level">
<div class="window"></div>
<div class="window"></div>
<div class="window"></div>
</div>
</div>
<div class="bat-2">
<div class="level">
<div class="window tv"></div>
<div class="window blue"></div>
<div class="window"></div>
</div>
<div class="level">
<div class="window"></div>
<div class="window"></div>
<div class="window"></div>
</div>
<div class="level">
<div class="window"></div>
<div class="window green"></div>
<div class="window"></div>
</div>
<div class="level">
<div class="window white"></div>
<div class="window"></div>
<div class="window"></div>
</div>
<div class="level">
<div class="window"></div>
<div class="window blue"></div>
<div class="window green"></div>
</div>
<div class="level">
<div class="window"></div>
<div class="window"></div>
<div class="window"></div>
</div>
<div class="level">
<div class="window"></div>
<div class="window"></div>
<div class="window"></div>
</div>
<div class="level">
<div class="window"></div>
<div class="window"></div>
<div class="window"></div>
</div>
<div class="level">
<div class="window"></div>
<div class="window"></div>
<div class="window"></div>
</div>
<div class="level">
<div class="window"></div>
<div class="window"></div>
<div class="window"></div>
</div>
<div class="level">
<div class="window blue"></div>
<div class="window blue"></div>
<div class="window"></div>
</div>
<div class="level">
<div class="window"></div>
<div class="window"></div>
<div class="window"></div>
</div>
<div class="level">
<div class="window"></div>
<div class="window"></div>
<div class="window"></div>
</div>
<div class="level">
<div class="window"></div>
<div class="window"></div>
<div class="window"></div>
</div>
</div>
<div class="pole"></div>
<div class="pole-curve"></div>
<div class="lamp"></div>
</div>
// original art and inspiration https://twitter.com/84Aleha/status/1570778115928117248
.frame {
position: relative;
margin: auto;
aspect-ratio: 1/1.5;
height: 99%;
background: linear-gradient(to bottom, #3E383A, #4D4A4E, #444452);
overflow: hidden;
.ambient {
z-index: 1;
position: absolute;
background: yellow;
inset: -35%;
top: -56%;
left: -29%;
mask-image: radial-gradient(circle, #ffffffff, #ffffff66 13%, #ffffff00 100%);
-webkit-mask-image: radial-gradient(circle, #ffffffff, #ffffff66 13%, #ffffff00 100%);
opacity: .25;
}
.weather {
z-index: 1;
position: absolute;
inset: -2%;
mask-image: radial-gradient(circle, #ffffffff, #ffffff66 13%, #ffffff33 30%, #ffffff11 100%);
-webkit-mask-image: radial-gradient(circle, #ffffffff, #ffffff66 13%, #ffffff33 30%, #ffffff15 100%);
top: -15%;
left: -4%;
}
.snow {
z-index: 1;
position: absolute;
inset: 0;
.dot {
height: .35vh;
width: .35vh;
max-width: 4px;
max-height: 4px;
border-radius: 40%;
position: absolute;
background: whitesmoke;
}
}
[class^="bat"] {
.level {
padding-right: 6%;
display: flex;
align-items: center;
justify-content: space-evenly;
rotate: -16deg;
margin-bottom: 27%;
.window {
aspect-ratio: 1/1;
background: #20181599;
transform: skew(-10deg);
width: 14%;
&.tv {
animation-name: watchingtv;
animation-duration: 4s;
animation-timing-function: linear;
animation-iteration-count: infinite;
box-shadow: 0 0 16px #7AABC6;
}
&.yellow {
background: #DF9A62AA !important;
box-shadow: 0 0 16px #DF9A62;
}
&.green {
background: #67A796AA !important;
box-shadow: 0 0 16px #67A796;
}
&.white {
background: #CDC4BCAA !important;
box-shadow: 0 0 16px #CDC4BC;
}
&.blue {
background: #7AABC6AA !important;
box-shadow: 0 0 16px #7AABC6;
}
}
}
}
.bat-1 {
position: absolute;
right: -21%;
bottom: 0;
width: 45%;
height: 80%;
background: linear-gradient(to bottom, #201815, #2D2320);
clip-path: polygon(13% 15%, 100% 0%, 100% 100%, 0% 100%);
}
.bat-2 {
rotate: -6deg;
position: absolute;
right: 2%;
bottom: -10%;
width: 23%;
height: 80%;
background: linear-gradient(to bottom, #3B3332, #483B3E);
clip-path: polygon(0 6%, 69% 0%, 100% 100%, 0% 100%);
filter: blur(0.5px);
padding-top: 10%;
padding-right: 6%;
box-sizing: border-box;
.level {
@for $i from 2 through 14 {
&:nth-child(#{$i}) {
width: calc(100% + #{$i * 1.7}#{"%"});
rotate: calc(-14deg + #{$i * 1.7}#{"deg"});
.window {
transform: skew(calc(-14deg + #{$i * 2}#{"deg"}));
}
}
}
}
}
.bat-3 {
rotate: 0deg;
position: absolute;
right: 12%;
bottom: -10%;
width: 40%;
height: 75%;
background: linear-gradient(to bottom, #494341, #493C3F);
clip-path: polygon(0 10%, 69% 0%, 100% 100%, 0% 100%);
filter: blur(1px);
padding-top: 10%;
padding-right: 15%;
box-sizing: border-box;
.level {
rotate: -14deg;
margin-bottom: 25%;
.window {
width: 10%;
background: #20181560;
transform: skew(-10deg);
}
@for $i from 2 through 14 {
&:nth-child(#{$i}) {
width: calc(100% + #{$i * 2}#{"%"});
rotate: calc(-14deg + #{$i * 2}#{"deg"});
.window {
transform: skew(calc(-14deg + #{$i * 1}#{"deg"}));
}
}
}
}
}
.bat-4 {
rotate: 4deg;
position: absolute;
right: 26%;
bottom: -10%;
width: 40%;
height: 65%;
background: linear-gradient(to bottom, #4A474D, #4A4049);
clip-path: polygon(0 13%, 69% 0%, 100% 100%, 0% 100%);
filter: blur(1.5px);
padding-top: 10%;
padding-right: 25%;
box-sizing: border-box;
.level {
rotate: -16deg;
margin-bottom: 27%;
.window {
width: 10%;
background: #20181544;
transform: skew(-10deg);
}
@for $i from 2 through 14 {
&:nth-child(#{$i}) {
width: calc(100% + #{$i * 1.7}#{"%"});
rotate: calc(-14deg + #{$i * 1.7}#{"deg"});
.window {
transform: skew(calc(-14deg + #{$i * 1}#{"deg"}));
}
}
}
}
}
.pole {
rotate: 14deg;
position: absolute;
right: 68%;
bottom: -10%;
width: 10%;
height: 68%;
clip-path: polygon(0 0, 21% 0, 100% 100%, 0% 100%);
background: linear-gradient(31deg, #29180E, #29180E, #614121 90%, #614121);
}
.lamp {
rotate: -90deg;
position: absolute;
right: 45%;
top: 37.5%;
border-radius: 40% 50% 50% 40%;
height: 4%;
width: 3.5%;
background: yellow;
box-shadow: 0 0 16px yellow;
}
.pole-curve {
rotate: 14deg;
position: absolute;
right: 68%;
bottom: -10%;
width: 10%;
height: 68%;
&::after {
rotate: -9deg;
content: "";
position: absolute;
background: #614121;
top: -12%;
left: -7%;
width: 220%;
height: 12%;
clip-path: polygon(62% 41%, 37% 48%, 16% 59%, 0% 80%, 0 100%, 11% 100%, 13% 80%, 25% 66%, 42% 55%, 56% 50%, 100% 44%, 100% 39%);
}
}
}
@keyframes watchingtv {
0% { background-color: #67A796AA; }
25% { background-color: #7AABC6; }
25.5% { background-color: #67A796AA; }
97% { background-color: #67A796AA; }
99% { background-color: #FFBF00AA; }
100% { background-color: #67A796AA; }
}
body, html {
margin: 0;
padding: 0;
height: 100%;
background-color: black;
color: #ffffffAA;
font-family: 'Avenir', sans-serif;
}
View Compiled
let flocons = null;
const maxOverflow = 110;
const nbFlocons = 5000;
function randomIntFromInterval(min = 0, max = maxOverflow) {
return Math.random() * (max - min + 1) + min;
}
function downFall() {
const list = flocons || document.getElementsByClassName('dot');
flocons = Array.from(list);
if (!flocons) {
throw new Error('flocons undefined');
}
for (let flocon of Array.from(flocons)) {
const x = +flocon.style.top.replace('%', '');
const y = +flocon.style.left.replace('%', '');
let top = randomIntFromInterval(0, 1) + x;
let left = randomIntFromInterval(-4, 0) + y;
top = top > maxOverflow ? 0 : top;
left = left < 0 ? maxOverflow : left;
flocon.style.top = `${top}%`;
flocon.style.left = `${left}%`;
}
}
const snowContainer = document.getElementById('snow');
if (!snowContainer) {
throw new Error('snowContainer undefined');
}
for (let i = 0; i < nbFlocons; i++) {
const flocon = document.createElement('div');
flocon.classList.add('dot');
const top = randomIntFromInterval();
const left = randomIntFromInterval();
flocon.style.top = `${top}%`;
flocon.style.left = `${left}%`;
snowContainer.appendChild(flocon);
}
setInterval(() => this.downFall(), 100);
This Pen doesn't use any external CSS resources.
This Pen doesn't use any external JavaScript resources.