Fork of Stars
A Pen by HARUN PEHLİVAN on CodePen.
Fork of Stars
A Pen by HARUN PEHLİVAN on CodePen.
<canvas id="canvas"></canvas> |
"use strict"; | |
var canvas = document.getElementById('canvas'), | |
ctx = canvas.getContext('2d'), | |
w = canvas.width = window.innerWidth, | |
h = canvas.height = window.innerHeight, | |
hue = 217, | |
stars = [], | |
count = 0, | |
maxStars = 1400; | |
// Thanks @jackrugile for the performance tip! https://codepen.io/jackrugile/pen/BjBGoM | |
// Cache gradient | |
var canvas2 = document.createElement('canvas'), | |
ctx2 = canvas2.getContext('2d'); | |
canvas2.width = 100; | |
canvas2.height = 100; | |
var half = canvas2.width/2, | |
gradient2 = ctx2.createRadialGradient(half, half, 0, half, half, half); | |
gradient2.addColorStop(0.025, '#fff'); | |
gradient2.addColorStop(0.1, 'hsl(' + hue + ', 61%, 33%)'); | |
gradient2.addColorStop(0.25, 'hsl(' + hue + ', 64%, 6%)'); | |
gradient2.addColorStop(1, 'transparent'); | |
ctx2.fillStyle = gradient2; | |
ctx2.beginPath(); | |
ctx2.arc(half, half, half, 0, Math.PI * 2); | |
ctx2.fill(); | |
// End cache | |
function random(min, max) { | |
if (arguments.length < 2) { | |
max = min; | |
min = 0; | |
} | |
if (min > max) { | |
var hold = max; | |
max = min; | |
min = hold; | |
} | |
return Math.floor(Math.random() * (max - min + 1)) + min; | |
} | |
var Star = function() { | |
this.orbitRadius = random(w / 2 - 50); | |
this.radius = random(100, this.orbitRadius) / 10; | |
this.orbitX = w / 2; | |
this.orbitY = h / 2; | |
this.timePassed = random(0, maxStars); | |
this.speed = random(this.orbitRadius) / 100000; | |
this.alpha = random(2, 10) / 10; | |
count++; | |
stars[count] = this; | |
} | |
Star.prototype.draw = function() { | |
var x = Math.sin(this.timePassed + 1) * this.orbitRadius + this.orbitX, | |
y = Math.cos(this.timePassed) * this.orbitRadius/2 + this.orbitY, | |
twinkle = random(10); | |
if (twinkle === 1 && this.alpha > 0) { | |
this.alpha -= 0.05; | |
} else if (twinkle === 2 && this.alpha < 1) { | |
this.alpha += 0.05; | |
} | |
ctx.globalAlpha = this.alpha; | |
ctx.drawImage(canvas2, x - this.radius / 2, y - this.radius / 2, this.radius, this.radius); | |
this.timePassed += this.speed; | |
} | |
for (var i = 0; i < maxStars; i++) { | |
new Star(); | |
} | |
function animation() { | |
ctx.globalCompositeOperation = 'source-over'; | |
ctx.globalAlpha = 0.8; | |
ctx.fillStyle = 'hsla(' + hue + ', 64%, 6%, 1)'; | |
ctx.fillRect(0, 0, w, h) | |
ctx.globalCompositeOperation = 'lighter'; | |
for (var i = 1, l = stars.length; i < l; i++) { | |
stars[i].draw(); | |
}; | |
window.requestAnimationFrame(animation); | |
} | |
animation(); |
body { | |
background: #060e1b; | |
overflow: hidden; | |
} | |
canvas { | |
//opacity: 0.5; | |
} |