<div id='rocket'></div>
<div id='exhaust'></div>
<div id='sky'></div>
<section>scroll to launch</section>
<section></section>
<section></section>
<section></section>
:root {
--base-padding: 3vw;
--white-25: rgba(255,255,255,.25);
--white-50: rgba(255,255,255,.5);
}
body {
margin: var(--base-padding);
font-family: system-ui;
}
* {
box-sizing: border-box;
}
section {
display: block;
min-height: 100vh;
display: grid;
place-items: center;
}
#rocket {
width: 40px;
height: 125px;
background:
linear-gradient(to right, transparent 45%, firebrick 45%, firebrick 55%, transparent 55%),
radial-gradient(circle at 50% 40%, rgba(255,255,255,1) 10%, #aaa 11%, #aaa 15%, transparent 16%),
linear-gradient(to right, transparent 50%, rgba(0,0,0,.1) 50%),
linear-gradient(to bottom, firebrick 12%, transparent 12%),
lightgray;
background-size: 100% 40%, 100% 100%, 100% 100%, 100% 100%, 100% 100%, 100% 100%;
background-position: 50% 95%, 0 0, 0 0, 0 0, 0 0;
background-repeat: no-repeat;
border-radius: 50px 50px 50px 50px / 200px 200px 10px 10px;
position: fixed;
bottom: 0;
left: calc(50% - 20px);
box-shadow: 0 15px 0 -5px #666;
filter: drop-shadow(0px -5px 2px rgba(0,0,0,.15));
}
#rocket:before {
content:'';
width: 200%;
height: 50%;
position: absolute;
top: 55%;
left: -50%;
background:
radial-gradient(circle at 50% 100%, transparent 50%, firebrick 51%);
clip-path: polygon(0% 0%, 25% 0%, 25% 100%, 75% 100%, 75% 0%, 100% 0%, 100% 100%, 0% 100%);
border-radius: 100% 100% 0 0;
}
#rocket:after {
content:'';
width: 60%;
height: 25%;
position: absolute;
top: 108%;
left: 20%;
background:
linear-gradient(to bottom, orangered, gold);
border-radius: 0 0 25% 25%;
filter: blur(2px);
opacity: .5;
animation: blast_off .25s linear infinite;
}
@keyframes blast_off {
33% {
background:
linear-gradient(to bottom, orangered 25%, gold 75%);
}
66% {
background:
linear-gradient(to bottom, orangered 50%, gold 90%);
}
}
.shake_rocket {
animation: shake .1s linear infinite;
}
@keyframes shake {
25% { transform: translateX(-1px); }
75% { transform: translateX(1px); }
}
#sky {
min-height: 200vh;
width: 100%;
position: fixed;
bottom: 0;
left: 0;
background:
radial-gradient(circle at 75% 24%, rgba(255,255,255,.5) .25%, transparent .25%),
radial-gradient(circle at 10% 23%, rgba(255,255,255,.25) .25%, transparent .25%),
radial-gradient(circle at 98% 29%, rgba(255,255,255,.25) .25%, transparent .25%),
radial-gradient(circle at 63% 10%, rgba(255,255,255,.25) .25%, transparent .25%),
radial-gradient(circle at 20% 6%, rgba(255,255,255,.25) .25%, transparent .25%),
radial-gradient(circle at 75% 5%, rgba(255,255,255,.25) .25%, transparent .25%),
radial-gradient(circle at 35% 15%, rgba(255,255,255,.25) .25%, transparent .25%),
radial-gradient(circle at 94% 10%, rgba(255,255,255,.25) .25%, transparent .25%),
radial-gradient(circle at 55% 30%, rgba(255,255,255,.25) .25%, transparent .25%),
radial-gradient(circle at 4% 40%, rgba(255,255,255,.25) .25%, transparent .25%),
radial-gradient(circle at 91% 35%, rgba(255,255,255,.25) .25%, transparent .25%),
radial-gradient(circle at -1% 3%, rgba(0,0,0,.15) 2%, transparent 2.5%),
radial-gradient(circle at 11% 6.5%, rgba(0,0,0,.15) 1%, transparent 1.5%),
radial-gradient(circle at 15% 0%, rgba(0,0,0,.15) 2%, transparent 2.5%),
radial-gradient(circle at 5% 8%, rgba(0,0,0,.15) 2%, transparent 2.5%),
radial-gradient(circle at -5% -5%, rgba(255,255,255,.15) 9%, transparent 10%),
radial-gradient(circle at 0% 0%, #888 10%, transparent 12%),
linear-gradient(to top, beige, #306);
z-index: -1;
}
#exhaust {
width: 400px;
height: 100px;
position: fixed;
bottom: -50px;
left: calc(50% - 200px);
opacity: 0;
transition-origin: 50% 100%;
transition: 1s;
}
#exhaust:after {
content: '';
width: 400px;
height: 100px;
position: absolute;
bottom: 0;
left: 0;
background:
radial-gradient(circle at 20% 90%, white 50px, transparent 51px),
radial-gradient(circle at 35% 115%, white 50px, transparent 51px),
radial-gradient(circle at 50% 135%, white 50px, transparent 51px),
radial-gradient(circle at 65% 115%, white 50px, transparent 51px),
radial-gradient(circle at 80% 90%, white 50px, transparent 51px);
filter: blur(1px) drop-shadow(0px -5px rgba(0,0,0,.025));
animation: shake .1s linear infinite;
}
.exhaust {
opacity: 1 !important;
bottom: 0 !important;
}
const rocket = document.querySelector('#rocket')
const sky = document.querySelector('#sky')
const ex = document.querySelector('#exhaust')
var bottom = 0
var last_y = 0
var wheel;
window.addEventListener('wheel', function(e){
wheel = e.deltaY
})
window.addEventListener('scroll', function(e){
var h = window.innerHeight
var y = document.documentElement.scrollTop
var doc = document.body.offsetHeight - 250
var perc = y / (doc - h)
// console.log(perc)
if(perc < 1){
sky.style.bottom = -1*(perc)*100 + '%'
}
if(perc > 0) {
rocket.classList.add('shake_rocket')
ex.classList.add('exhaust')
} else {
rocket.classList.remove('shake_rocket')
ex.classList.remove('exhaust')
}
if(perc > .37) {
ex.classList.remove('exhaust')
}
if(perc > .25) {
bottom = (perc - .25)*133
}
if(perc > 0) {
bottom = (perc - .25)*133
if(perc - .25 < 0) {
bottom = 0
}
}
rocket.style.bottom = bottom + '%'
last_y = y
})
This Pen doesn't use any external CSS resources.
This Pen doesn't use any external JavaScript resources.