console
let particles = []
let microparticles = []
const c1 = createCanvas({width: $(window).width(), height: $(window).height()})
const tela = c1.canvas;
const canvas = c1.context;
$("body").append(c1.canvas);
class Particle{
constructor(canvas){
this.random = Math.random()
this.random1 = Math.random()
this.random2 = Math.random()
this.progress = 0;
this.canvas = canvas;
this.life = 1000 + (Math.random()*3000)
this.x = ($(window).width()/2) + (Math.random()*20 - Math.random()*20)
this.y = $(window).height()
this.s = 2 + Math.random();
this.w = $(window).width()
this.h = $(window).height()
this.direction = this.random > .5 ? -1 : 1
this.radius = 1 + (3 * this.random)
this.color = "#ff417d"
this.ID = setInterval(function(){
microparticles.push(new microParticle(c1.context,{
x: this.x,
y: this.y
}))
}.bind(this), this.random*20)
setTimeout(function(){
clearInterval(this.ID)
}.bind(this), this.life )
}
render(){
this.canvas.beginPath();
this.canvas.arc(this.x, this.y, this.radius, 0, 2 * Math.PI);
this.canvas.shadowOffsetX = 0;
this.canvas.shadowOffsetY = 0;
this.canvas.shadowColor = "#000000";
this.canvas.fillStyle = this.color;
this.canvas.fill();
this.canvas.closePath();
}
move(){
this.x -= (this.direction) * Math.sin(this.progress/((this.random1*430))) * this.s;
this.y -= Math.cos(this.progress/this.h) * this.s;
if(this.x < 0 || this.x > this.w - this.radius){
clearInterval(this.ID)
return false
}
if(this.y < 0){
clearInterval(this.ID)
return false
}
this.render()
this.progress++
return true
}
}
class microParticle{
constructor(canvas, options){
this.random = Math.random()
this.random1 = Math.random()
this.random2 = Math.random()
this.progress = 0;
this.canvas = canvas;
this.x = options.x
this.y = options.y
this.s = 2 + Math.random() * 3;
this.w = $(window).width()
this.h = $(window).height()
this.radius = 1 + this.random*0.5
this.color = "#4EFCFE";
}
render(){
this.canvas.beginPath();
this.canvas.arc(this.x, this.y, this.radius, 0, 2 * Math.PI);
this.canvas.lineWidth = 2;
this.canvas.fillStyle = this.color;
this.canvas.fill();
this.canvas.closePath();
}
move(){
this.x -= Math.sin(this.progress/(100/(this.random1 - this.random2*10))) * this.s;
this.y += Math.cos(this.progress/this.h) * this.s;
if(this.x < 0 || this.x > this.w - this.radius){
return false
}
if(this.y > this.h){
return false
}
this.render()
this.progress++
return true
}
}
var random_life = 1000
setInterval(
function(){
particles.push(new Particle(canvas))
random_life = 2000 * Math.random()
}.bind(this)
, random_life)
function clear(){
let grd = canvas.createRadialGradient(tela.width/2, tela.height/2, 0, tela.width/2, tela.height/2, tela.width);
grd.addColorStop(0,"rgba(82,42,114,1)");
grd.addColorStop(1,"rgba(26,14,4,0)");
canvas.globalAlpha=0.16;
canvas.fillStyle=grd;
canvas.fillRect(0, 0, tela.width, tela.height);
}
function blur(ctx,canvas, amt) {
}
function update(){
clear();
particles = particles.filter(function(p) {
return p.move()
})
microparticles = microparticles.filter(function(mp) {
return mp.move()
})
requestAnimationFrame(update.bind(this))
}
function createCanvas(properties){
let canvas = document.createElement('canvas');
canvas.width = properties.width;
canvas.height = properties.height;
let context = canvas.getContext('2d');
return {
canvas: canvas,
context: context
}
}
update()
<a class="codepen-promotion" target="_blank" href="https://codepen.io/collection/nZpPbz/" title="The Most Hearted of 2017">
<img class="codepen-promotion__image" src="https://www.plasm.it/images/codepen-promotion.png" alt="">
</a>
<div class="title">
<h3>PLASM.it - 2018</h3>
<h1>STARDUST</h1>
<h3>A N O T H E R <strong>C O D E P E N</strong></h3>
</div>
<div class="more-pens">
<a target="_blank" href="https://codepen.io/plasm/pen/LeBdEO" class="white-mode">VIEW MY LAST PEN</a>
<a target="_blank" href="http://codepen.io/collection/nZpPbz/" class="white-mode">VIEW OTHER PARTICLES</a>
</div>
body
padding: 0
margin: 0
@import url('https://fonts.googleapis.com/css?family=Montserrat:200,300,400,600')
.more-pens
position: fixed
left: 20px
bottom: 20px
z-index: 10
font-family: "Montserrat"
font-size: 12px
a.white-mode, a.white-mode:link, a.white-mode:visited, a.white-mode:active
font-family: "Montserrat"
font-size: 12px
text-decoration: none
background:
padding: 4px 8px
color:
&:hover
background:
color:
body
margin: 0
padding: 0
overflow: hidden
width: 100%
height: 100%
background:
.title
z-index: 10
position: absolute
left: 50%
top: 50%
transform: translateX(-50%) translateY(-50%)
font-family: "Montserrat"
text-align: center
width: 100%
h1
position: relative
color:
font-weight: 100
font-size: 90px
padding: 0
margin: 0
line-height: 1
text-shadow: 0 0 10px
span
font-weight: 600
padding: 0
margin: 0
color:
h3
font-weight: 200
font-size: 20px
padding: 0
margin: 0
line-height: 1
color:
letter-spacing: 2px
.codepen-promotion:active, .codepen-promotion:hover, .codepen-promotion:link, .codepen-promotion:visited
position: absolute
display: block
width: 200px
z-index: 111
right: 40px
bottom: 40px
.codepen-promotion__image
width: 100%