Skip to content

Instantly share code, notes, and snippets.

@vineeth-pappu
Created June 6, 2022 09:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vineeth-pappu/8bb00a4f24a3550cd3ab71160ad71a31 to your computer and use it in GitHub Desktop.
Save vineeth-pappu/8bb00a4f24a3550cd3ab71160ad71a31 to your computer and use it in GitHub Desktop.
Hologram shooter
<!-- ALL THE HTML -->
<template>
<div id="app">
<div
v-for="(item, index) in clouds"
class="cloud"
:id="'cloud-' + index"
:style="makeStarStyles(index)"
></div>
<!--<button class="testbtn" @click="changeDisplay">Fire!</button> -->
<div id="holoLoader" :class="displayMode ? 'active' : 'notActive'">
<div class="holoLayer" id="core"><canvas id="coreCanvas" /></div>
<div class="holoLayer" id="firstCircle">
<canvas width="450" height="450" id="secondCanvas" />
</div>
<div class="holoLayer" id="secondCircle">
<div class="slider a">
<div class="sliderPoint a">
<!-- <div v-for="item in sparks" class="spark" /> -->
</div>
</div>
</div>
<div class="holoLayer" id="thirdCircle"></div>
<div class="holoLayer" id="fourthCircle"></div>
<div class="holoLayer" id="fifthCircle">
<canvas id="firstCanvas" />
</div>
<div class="holoLayer" id="sixthCircle"></div>
</div>
<canvas width="470" height="200" id="shootingParticles" :class="displayMode ? 'active' : 'notActive'"/>
</div>
</template>
<!-- ALL THE JAVASRIPT -->
<script>
export default {
data() {
return {
clouds: 50,
particles:300,
particleArray:[],
shootingParticles:100,
shootingParticlesArray:[],
ringNumber:8,
stylesArray:[],
ringArray:[],
instances: 4,
count:300,
countArray:[],
start:65,
then: Date.now(),
displayModeEngage:Date.now(),
displayMode:false,
angles:[[0,25,10,'rgba(255,255,255,1)'],
[50,76,10,'rgba(255,255,255,1)'],
[101,126,10,'rgba(255,255,255,1)'],
[152,177,10,'rgba(255,255,255,1)'],
[203,227,10,'rgba(255,255,255,1)'],
[258,279,10,'rgba(255,255,255,1)'],
[305,334,10,'rgba(255,255,255,1)'],
],
};
},
methods: {
changeDisplay() {
this.displayMode = !this.displayMode
this.displayModeEngage = Date.now();
//console.log("changed display!")
},
loop() {
let now = Date.now();
let delta = now - this.then;
this.update();
this.render();
this.then = now;
requestAnimationFrame(this.loop);
},
update() {
if(this.displayMode === false) {
this.start = this.start + 0.2;
this.start >= 100 ? (this.changeDisplay(), this.start = 100) : null;
}
else {
this.start = this.start - 0.4;
this.start <= 0 ? (this.changeDisplay(), this.start = 0) : null;
}
//console.log(this.start)
this.particleArray.forEach((item, index) => {
this.adjustLength(item);
this.moveParticle(item);
})
this.shootingParticlesArray.forEach((item, index) => {
this.moveShootingParticle(item)
})
this.ringArray.forEach((item, index) => {
this.updateRings(item)
})
this.countArray.forEach((item, index) => {
this.updateCount(item)
})
//console.log("we updating!")
},
render() {
let canvas1 = document.getElementById("coreCanvas");
let canvas2 = document.getElementById("firstCanvas");
let canvas3 = document.getElementById("secondCanvas");
let canvas4 = document.getElementById("shootingParticles")
let ctx = canvas1.getContext("2d");
let ctx2 = canvas2.getContext("2d");
let ctx3 = canvas3.getContext("2d");
let ctx4 = canvas4.getContext("2d");
ctx.globalCompositeOperation = 'screen'; //test */
ctx4.globalCompositeOperation = 'screen'; //test */
ctx.clearRect(0, 0, canvas1.width, canvas1.height);
this.particleArray.forEach((item, index) => {
this.renderParticle(item, ctx)
})
ctx2.clearRect(0, 0, canvas2.width, canvas2.height);
this.drawCircularPlate(this.angles, ctx2);
ctx3.clearRect(0, 0, canvas3.width, canvas3.height);
this.countArray.forEach((item, index) => {
this.drawCounter(item, ctx3)
})
this.drawShootTime(this.start, ctx3)
this.drawOuterRing(this.ringArray, ctx3);
ctx4.clearRect(0,0,canvas4.width, canvas4.height);
this.shootingParticlesArray.forEach((item, index) => {
this.renderShootingParticles(item, ctx4)
})
/* ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.globalCompositeOperation = 'lighten'; //test */
//console.log("we rendering!")
},
createShootingParticles(number) {
for(let n=0;n<number;n++) {
let obj = {
x:470,
y:95 + (Math.random() * 12 - 6),
radius:Math.random() * 5 + 15,
speed:Math.random() * 7 + 1,
opacity:1,
delay:Math.floor(Math.random() * 1000),
}
this.shootingParticlesArray.push(obj);
}
},
drawCounterInitiation(number) {
for(let n=0; n<number; n++) {
let obj = {
number: n,
opacity:Math.random(),
reverse:true,
start: n * (360/number),
finish:(n + 1) * (360/number) ,
fill: "transparent",
shadow: "rgba(255,255,255,0.5)",
strokeStyle:"255,255,255",
lineWidth: Math.floor(Math.random() * 5 + 3)
}
this.countArray.push(obj)
}
},
drawShootTime(start, ctx) {
let finish = 360/100 * start - 90;
ctx.strokeStyle = "rgba(255,255,255," + start/100 + ")";
ctx.beginPath();
ctx.arc(450/2, 450/2, 185, -90 * (Math.PI / 180), finish * (Math.PI / 180));
ctx.stroke();
ctx.closePath();
//X = Math.cos(angle*Math.PI/180) * length + startPointX
let calculateX = Math.cos((finish+5)*Math.PI/180) * 185 + (450/2)
//Y = Math.sin(angle*Math.PI/180) * length + startPointY
let calculateY = Math.sin((finish+5)*Math.PI/180) * 185 + (450/2)
ctx.fillStyle = "white";
ctx.textAlign = "center";
ctx.font = "10px Arial";
ctx.fillText(start.toString().substring(0,2) + "%", calculateX, calculateY);
},
updateCount(item) {
if(item.reverse === true) {
item.opacity -= 0.01;
item.opacity < 0.1 ? item.reverse = false : null
}
if(item.reverse === false) {
item.opacity += 0.01;
item.opacity > 0.9 ? item.reverse = true : null
}
},
drawCounter(item, ctx) {
if(item.number % 2) {
ctx.beginPath();
ctx.strokeStyle = "rgba(" + item.strokeStyle + "," + item.opacity + ")";
ctx.arc(450/2, 450/2, 215 + (item.lineWidth/2), item.start * (Math.PI / 180), item.finish * (Math.PI / 180));
ctx.fillStyle = item.fill;
ctx.fill();
ctx.shadowColor = item.shadow;
ctx.shadowBlur = 8;
ctx.lineWidth = item.lineWidth
ctx.strokeStyle = 1;
ctx.stroke();
ctx.closePath();
}
},
createCoreParticles(number) {
for(let n=0;n<number;n++) {
let angle = Math.floor(Math.random() * 360);
let ring = Math.floor(Math.random() * 25);
let length = 80 + Math.random() * 40;
let speed = Math.random() - 0.5;
speed > 0.3 ? speed = 0.3 : speed = speed;
let particle = {
x:250 + (length + ring * Math.cos(angle * (Math.PI / 180))),
y:250 + (length + ring * Math.sin(angle * (Math.PI / 180))),
radius:Math.random() * 2 + 2,
startRadius:Math.random() * 2 + 2,
length:length,
speed:speed,
usedLength:length,
grow:Math.random() > 0.5 ? true : false,
startAngle:angle,
number:n,
usedAngle:angle,
ring: ring,
color: Math.random() > 0.5 ? "rgba(255, 255, 255,0.3)" : "rgba(214,107,24,0.3)",
shadow:"rgba(0, 0, 0,1)",
number:n,
}
this.particleArray.push(particle);
}
},
makeStarStyles(cloud) {
if(document.getElementById("cloud-" + cloud) === null) {
let radius = Math.floor(Math.random() * 230 + 130);
let x = "top:" + Math.floor(Math.random() * document.body.clientHeight - radius/2) + "px";
let y = "left:" + Math.floor(Math.random() * document.body.clientWidth - radius/2) + "px";
let animationTime = Math.floor(Math.random() * 10 + 5);
let animationDelay = Math.floor(Math.random() * 15);
let background = "background:radial-gradient(circle, rgba(255,255,255,0.12) 0%, rgba(255,255,255,0.05) 34%, rgba(217,217,217,0.0) 70%)";
let style = "position:absolute;" + x + ";" + y + ";" + "height:" + radius + "px;" + "width:" + radius + "px;" + "border-radius:180px;" + background + ";animation-duration: " + animationTime + "s;animation-delay:" + animationDelay + "s;";
this.stylesArray.push(style)
//console.log(style)
return style;
}
else {
return this.stylesArray[cloud]
}
},
renderParticle(particle, ctx) {
var grd = ctx.createRadialGradient(particle.x, particle.y, 1, particle.x, particle.y, particle.radius-particle.radius/10);
grd.addColorStop(0,particle.color);
grd.addColorStop(1,"rgba(255,255,255,0)");
ctx.fillStyle = grd;
ctx.beginPath();
ctx.arc(particle.x, particle.y, particle.radius, 0, 2 * Math.PI);
ctx.closePath();
ctx.fill();
},
renderShootingParticles(particle, ctx) {
if(particle.x < 470) {
ctx.fillStyle = "rgba(255,255,255," + particle.opacity + ")";
ctx.beginPath();
ctx.arc(particle.x, particle.y, particle.radius, 0, 2 * Math.PI);
ctx.closePath();
ctx.fill();
}
},
moveShootingParticle(item) {
if(this.displayMode === true && Date.now() > this.displayModeEngage + 1000) {
item.opacity = item.x/470;
item.x/470 * 10 > 0 ? item.radius = item.x/470 * 10 : item.radius = 0;
if(item.x > 0) {
if(Date.now() > this.displayModeEngage + 1000 + item.delay) {
item.x = item.x - item.speed
}
}
else {
item.x = 470
}
}
else if(this.displayMode === false && Date.now() < this.displayModeEngage + 1500) {
item.opacity = item.x/470;
item.x/470 * 10 > 0 ? item.radius = item.x/470 * 10 : item.radius = 0;
item.x = item.x - item.speed
}
else if(this.displayMode === false && Date.now() > this.displayModeEngage + 1500) {
item.x = 470;
}
},
createRings(rings, array) {
//console.logs
for(let i = 0; i < rings ; i ++) {
let distance = (360/rings)
let startAng = Math.floor(Math.random() * 360)
let endAng = startAng + Math.random() * 50 + 50;
//let distance = Math.floor(Math.random() * 50 + 50)
let distandeDrawn = (360/rings) / 100 * 90
let distanceTransparent = (360/rings) / 100 * 10
let obj = {
startAng: startAng * (Math.PI / 180),
endAng: endAng * (Math.PI / 180),
length: 120 + 7 * i,
shown:true,
moveDirection:Math.random() > 0.5 ? true : false,
moveDone:false,
}
array.push(obj);
console.log(obj)
}
},
updateRings(ring) {
if(ring.moveDone === false) {
ring.moveDirection ?
(ring.startAng -= 0.01, ring.endAng -= 0.01) :
(ring.startAng += 0.01, ring.endAng += 0.01);
Math.random() < 0.02 ? ring.moveDone = true : null;
}
else {
ring.moveDirection = !ring.moveDirection;
ring.moveDone = false
}
},
drawOuterRing(points, ctx) {
points.forEach(item => {
if(item.shown === true) {
//console.log(item.startAng, item.endAng)
ctx.beginPath();
ctx.arc(450/2, 450/2, item.length, item.startAng, item.endAng, 0, 2 * Math.PI);
ctx.fillStyle = 'transparent'
ctx.fill();
ctx.shadowColor = 'rgba(255,255,255,1)';
ctx.shadowBlur = 15;
ctx.lineWidth = 5;
ctx.strokeStyle = "rgba(255,255,255,1)";
ctx.stroke();
ctx.closePath();
}
})
},
adjustLength(particle) {
//particle.number === 0 ? console.log(particle.grow) : null
if(particle.grow && !this.displayMode) {
particle.usedLength += Math.abs(particle.speed) / 2;
particle.usedLength > particle.length + 20 ? particle.grow = false : null;
particle.radius > particle.startRadius ? (particle.radius -= 0.5, particle.usedLength += particle.radius / 3) : null;
}
else if(!particle.grow && !this.displayMode) {
particle.usedLength -= Math.abs(particle.speed) / 2;
particle.usedLength < particle.length - 20 ? particle.grow = true : null;
particle.radius > particle.startRadius ? (particle.radius -= 1) : null;
}
else if(this.displayMode) {
!particle.grow ? particle.grow = true : null;
particle.usedLength > 0 ? particle.usedLength -= particle.radius / 10 : null;
particle.radius < 25 ? particle.radius += 1 : null;
}
},
moveParticle(particle) {
//Math.random() < 0.5 ? particle.usedLength++ : particle.usedLength--;
particle.usedAngle = particle.usedAngle + particle.speed;
particle.x = 250 + particle.usedLength * Math.cos(particle.usedAngle * (Math.PI / 180));
particle.y = 250 + particle.usedLength * Math.sin(particle.usedAngle * (Math.PI / 180));
},
drawCircularPlate(angles,ctx) {
angles.forEach((item) => {
ctx.beginPath();
ctx.arc(450/2, 450/2, 150, item[0] * (Math.PI / 180), item[1] * (Math.PI / 180));
ctx.fillStyle = 'transparent'
ctx.fill();
ctx.shadowColor = item[3];
ctx.shadowBlur = 15;
ctx.lineWidth = item[2];
ctx.strokeStyle = item[3];
ctx.stroke();
ctx.closePath();
})
ctx.beginPath();
ctx.arc(450/2, 450/2, 138, 0, 2 * Math.PI);
ctx.fillStyle = 'transparent'
ctx.fill();
ctx.shadowColor = 'rgba(255,255,255,1)';
ctx.shadowBlur = 15;
ctx.lineWidth = 2;
ctx.strokeStyle = 'rgba(255,255,255,1)';
ctx.stroke();
ctx.closePath();
ctx.beginPath();
ctx.arc(450/2, 450/2, 163, 0, 2 * Math.PI);
ctx.fillStyle = 'transparent'
ctx.fill();
ctx.shadowColor = 'rgba(255,255,255,1)';
ctx.shadowBlur = 15;
ctx.lineWidth = 2;
ctx.strokeStyle = 'rgba(255,255,255,1)';
ctx.stroke();
ctx.closePath();
}
},
mounted() {
this.drawCounterInitiation(this.count);
this.createCoreParticles(this.particles);
this.createShootingParticles(this.shootingParticles);
this.createRings(this.ringNumber,this.ringArray);
let canvas1 = document.getElementById("coreCanvas");
canvas1.width = document.getElementById("core").offsetWidth;
canvas1.height = document.getElementById("core").offsetHeight;
let canvas2 = document.getElementById("firstCanvas");
canvas2.width = document.getElementById("firstCircle").offsetWidth;
canvas2.height = document.getElementById("firstCircle").offsetHeight;
let ctx2 = canvas2.getContext("2d");
this.drawCircularPlate(this.angles, ctx2);
let canvas3 = document.getElementById("secondCanvas");
canvas2.width = document.getElementById("firstCircle").offsetWidth;
canvas2.height = document.getElementById("firstCircle").offsetHeight;
window.addEventListener("resize", function(){
let canvas1 = document.getElementById("coreCanvas");
canvas1.width = document.getElementById("core").offsetWidth;
canvas1.height = document.getElementById("core").offsetHeight;
let canvas2 = document.getElementById("firstCanvas");
canvas2.width = document.getElementById("firstCircle").offsetWidth;
canvas2.height = document.getElementById("firstCircle").offsetHeight;
let canvas3 = document.getElementById("secondCanvas");
canvas2.width = document.getElementById("firstCircle").offsetWidth;
canvas2.height = document.getElementById("firstCircle").offsetHeight;
}, true);
//Let's start this!
//we go!
this.loop();
}
};
</script>
<!-- ALL THE STYLES -->
<style>
:root {
--main-blue-color: #13aeff;
--main-white-color: #ffffff;
--main-orange-color: #d66b18;
}
body {
width:100vw;
height:100vh;
margin:0;
padding:0;
overflow:hidden;
background-image: radial-gradient( circle farthest-corner at 10% 20%, rgba(28,38,47,1) 0%, rgba(37,47,57,1) 90% );
}
.testbtn {
position: absolute;
top: 20px;
left: calc(50vw - 25px);
height: 20px;
box-shadow: 0px 0px 15px 0px rgba(255, 255, 255, 0.5);
text-transform: uppercase;
height: 25px;
width: 70px;
background-color: transparent;
z-index: 10000000000000;
color: white;
border: 1px solid white;
}
.cloud {
z-index:-1;
opacity:0.5;
animation:cloudFade;
}
@keyframes cloudFade {
0% {opacity:0.5;}
50% {opacity:0;}
100% {opacity:0.5;}
}
@keyframes reverseRotate {
from { transform:rotate(0deg) }
to { transform:rotate(360deg) }
}
@keyframes rotate {
from { transform:rotate(360deg) }
to { transform:rotate(0deg) }
}
#secondCircle .slider {
background-color: transparent;
width: calc(50% + 4px);
box-sizing: border-box;
height: 8px;
top:calc(50% - 4px);
left:calc(50% - 4px);
position: relative;
animation:rotate 8s infinite linear;
transform-origin: 4px 4px;
}
#secondCircle .sliderPoint.a {
box-shadow: 0px 0px 3px 2px rgba(255,255,255,0.55);
left: calc(100% - 2px);
width: 4px;
background-color: rgba(255,255,255,0.55);
position:relative;
box-sizing: border-box;
border-radius: 100%;
height: 4px;
}
#secondCircle .sliderPoint.a:before {
content: '';
box-shadow: 0px 0px 3px 2px rgba(255,255,255,0.55);
width: 4px;
position: relative;
top: 183px;
left: -285px;
border-radius: 90px;
height: 4px;
display: block;
background-color: rgba(255,255,255,0.55);
}
#secondCircle .sliderPoint.a:after {
content: '';
box-shadow: 0px 0px 3px 2px rgba(255,255,255,0.55);
width: 4px;
position: relative;
top: -190px;
left: -270px;
border-radius: 90px;
height: 4px;
display: block;
background-color: rgba(255,255,255,0.55);
}
#holoLoader.active .sliderPoint.a:after {
animation:sparks 3s infinite linear 0s;
}
#holoLoader.active .sliderPoint.a:before {
animation:sparks 3s infinite linear 1.2s;
}
#holoLoader.active .sliderPoint.a {
animation:sparks 3s infinite linear 0.3s;
}
@keyframes sparks {
0% {
box-shadow: 0px 0px 5px 3px rgba(255,255,255,0.75);
}
60% {
box-shadow: 0px 0px 5px 3px rgba(255,255,255,0.75);
}
61% {
box-shadow: 0px 0px 5px 8px rgba(255,255,255,0.75);
}
62% {
box-shadow: 0px 0px 5px 3px rgba(255,255,255,0.75);
}
84% {
box-shadow: 0px 0px 5px 3px rgba(255,255,255,0.75);
}
85% {
box-shadow: 0px 0px 5px 8px rgba(255,255,255,0.75);
}
86% {
box-shadow: 0px 0px 5px 3px rgba(255,255,255,0.75);
}
}
#holoLoader {
z-index:1;
//box-shadow: 0px 0px 39px 0px rgba(148,255,241,1);
position:relative;
border-radius:50%;
background-color:rgba(255,255,255,0);
width:500px;
height:500px;
margin:auto;
margin-top:calc(50vh - 250px);
transition:all 0.5s ease-in-out 0.4s;
//transform: perspective(1000px) rotateX(30deg) rotateY(-50deg) rotateZ(0deg);
}
.holoLayer {
//background: radial-gradient(circle, rgba(255,255,255,0) 0%, rgba(202,226,255,0) 65%, rgba(147,196,255,1) 100%);
//box-shadow: 0px 0px 39px 0px rgba(148,255,241,0.3);
border-radius:360px;
transition:all 0.5s ease-in-out 0s;
}
#holoLoader.active {
transform: perspective(1000px) rotateX(30deg) rotateY(-50deg) rotateZ(0deg);
transition:all 0.5s ease-in-out;
}
#core {
width:100%;
height:100%;
background:radial-gradient(circle, rgba(255,255,255,0) 0%, rgba(255,255,255,0) 17%, rgba(147,196,255,0.1) 24%, rgba(255,255,255,0) 30%)
}
#coreCanvas, #firstCanvas, #secondCanvas {
width:100%;
height:100%;
}
#firstCircle {
position:absolute;
top:0px;
width:90%;
height:90%;
margin:5%;
}
@keyframes stutterMovement {
0% {
transform:rotate(0deg)
}
10% {
transform:rotate(50deg)
}
30% {
transform:rotate(50deg)
}
40% {
transform:rotate(50deg)
}
45% {
transform:rotate(70deg)
}
60% {
transform:rotate(-20deg)
}
70% {
transform:rotate(0deg)
}
85% {
transform:rotate(20deg)
}
90% {
transform:rotate(0deg)
}
100% {
transform:rotate(0deg)
}
}
#holoLoader.active #firstCircle {
transform: translateX(-130px) translateY(-80px);
transition:all 0.5s ease-in-out 0.4s;
}
#secondCircle {
position:absolute;
top:0px;
width:80%;
height:80%;
margin:10%;
border:1px solid var(--main-orange-color);
}
#secondCircle:before {
transition:all 0.5s ease-in-out 0s;
content:'';
border:7px dotted rgba(79, 223, 255,0.3);
position:absolute;
top:0px;
width:100%;
height:100%;
top: 0px;
left: 0px;
border-radius:360%;
opacity:0;
}
#secondCircle:after {
transition:all 0.5s ease-in-out 0s;
content:'';
border:5px solid rgba(79, 223, 255,0.7);
position:absolute;
top:0px;
width:100%;
height:100%;
border-radius:360%;
opacity:0;
}
#holoLoader.active #secondCircle {
border:2px solid rgba(255, 255, 255,0.5);
transform:translateX(-180px) translateY(-120px);
transition:all 0.5s ease-in-out 0.4s;
}
#holoLoader.active #secondCircle:before {
opacity:1;
top: -55px;
left: -75px;
transition:all 0.5s ease-in-out 0.4s;
animation: rotation 5s linear 0s infinite;
transformation-origin:100% 100%;
}
@keyframes rotation {
0% {
transform:rotateZ(0deg)
}
100% {
transform:rotateZ(360deg)
}
}
#holoLoader.active #secondCircle:after {
opacity:1;
transform: translateX(45px) translateY(35px);
transition:all 0.5s ease-in-out 0.4s;
}
#thirdCircle {
position:absolute;
top:0px;
width:70%;
height:70%;
margin:15%;
border:0px solid white;
opacity:0;
transition:all 0.5s ease-in-out 0s;
}
#holoLoader.active #thirdCircle:before {
content:'';
display:block;
width:100%;
height:100%;
position:absolute;
}
#holoLoader.active #thirdCircle:after {
content:'';
position:absolute;
display:block;
border-radius:180%;
width:100%;
height:100%;
}
#holoLoader.active #thirdCircle {
border:5px solid white;
opacity:1;
transform: translateX(-520px) translateY(-330px);
transition:all 0.5s ease-in-out 0.4s;
}
#fourthCircle {
position:absolute;
top:0px;
width:60%;
height:60%;
margin:20%;
}
#holoLoader.active #fourthCircle {
transform: translateX(-810px) translateY(-540px);
transition:all 0.5s ease-in-out 0.4s;
}
#fifthCircle {
position:absolute;
top:0px;
width:50%;
height:50%;
margin:25%;
animation: stutterMovement 5s infinite linear;
}
#holoLoader.active #fifthCircle {
transform: translateX(-600px) translateY(-400px);
transition:all 0.5s ease-in-out 0.4s;
}
#sixthCircle {
position:absolute;
top:0px;
width:40%;
height:40%;
margin:30%;
border:1px dashed var(--main-orange-color);
border-radius:180%;
}
#holoLoader.active #sixthCircle {
border:3px solid var(--main-white-color);
transition:all 0.5s ease-in-out 0.4s;
}
#holoLoader.active #sixthCircle:before {
position:absolute;
width:40%;
height:40%;
margin:30%;
top:-5px;
left:-5px;
border:1px dashed var(--main-white-color);
border-radius:180%;
transition: all 0.5s ease-in-out 0s;
animation: bubbleEffect 4s infinite linear;
box-shadow: 0px 0px 0px rgba(255,255,255,0);
}
#sixthCircle:before {
content:'';
position:absolute;
border-radius:180%;
width:20%;
display: block;
height:20%;
margin:40%;
top: -5px;
left: -5px;
border:1px solid var(--main-white-color);
box-shadow: 0px 0px 5px 2px rgba(214,107,24,1), inset 0 0px 5px rgba(214,107,24,1);
transition:all 0.5s ease-in-out 0.4s;
animation: rotationY 4s infinite linear;
}
#holoLoader.active #sixthCircle:after {
position:absolute;
width:40%;
height:40%;
margin:30%;
top:-5px;
left:-5px;
border:1px dashed var(--main-white-color);
border-radius:180%;
transition: all 0.5s ease-in-out 0s;
animation: bubbleEffect 4s infinite linear;
box-shadow: 0px 0px 0px rgba(255,255,255,0);
}
#sixthCircle:after {
content:'';
position:absolute;
display: block;
width:20%;
height:20%;
border-radius:180%;
margin:40%;
top: -5px;
left: -5px;
box-shadow: 0px 0px 5px 2px var(--main-orange-color), inset 0 0px 5px var(--main-orange-color);
border:1px solid var(--main-white-color);
transition:all 0.5s ease-in-out 0.4s;
animation: rotationX 8s infinite linear;
}
@keyframes rotationX {
0% {
transform:rotateX(0deg) rotateY(0deg) scale(1);
}
100% {
transform:rotateX(360deg) rotateY(-360deg) scale(1);
}
}
@keyframes rotationY {
0% {
transform:rotateY(0deg) rotateX(0deg) scale(1)
}
100% {
transform:rotateY(360deg) rotateX(360deg) scale(1)
}
}
@keyframes bubbleEffect {
0% {
animation-timing-function: linear;
transform:scale(1);
}
25% {
animation-timing-function: linear;
opacity:1;
transform:scale(1.2);
}
50% {
animation-timing-function: linear;
opacity:0.5;
transform:scale(1);
}
75% {
animation-timing-function: linear;
opacity:0.5;
transform:scale(0.8);
}
100%{
animation-timing-function: linear;
opacity:1;
transform:scale(1);
}
}
#shootingParticles {
opacity:0;
width: 470px;
height: 200px;
z-index:1;
position: absolute;
top: calc(50vh - 168px);
left: calc(50vw - 460px);
transform: rotateZ(18deg);
transition:all 0.5s linear 0.5s;
}
#shootingParticles.active {
transition:all 0.5s linear 1s;
opacity:1;
}
</style>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment