Beautiful star effect, forked from Mads Cordes's Pen Constellations but modified to re-draw the star field when the user resizes browser.
Doesn't work on iOS devices for some reason :(
A Pen by Owen Williams on CodePen.
Beautiful star effect, forked from Mads Cordes's Pen Constellations but modified to re-draw the star field when the user resizes browser.
Doesn't work on iOS devices for some reason :(
A Pen by Owen Williams on CodePen.
canvas#sky |
var timer; | |
(function(){ | |
var $ = (function(elm){ | |
return document.querySelector(elm); | |
}), | |
Stars = function(){ | |
var num = (Math.min(window.innerWidth, window.innerHeight) / Math.max(window.innerWidth, window.innerHeight)) * 750, //Math.abs(window.innerWidth - window.innerHeight), | |
makeStar = function(){ | |
return { | |
radius: Math.random() * (3 - .5) + .5, | |
pos: { | |
x: Math.random() * c.width, | |
y: Math.random() * c.height | |
}, | |
moveTo: { | |
x: Math.random() * c.width, | |
y: Math.random() * c.height | |
}, | |
bigger: ~~(Math.random() * 2), | |
speed: Math.random() * (c.width / c.height / 40) | |
} | |
}, | |
stars = [], | |
draw = function(star){ | |
ctx.fillStyle = "#fff"; | |
ctx.beginPath(); | |
ctx.arc(star.pos.x, star.pos.y, star.radius, 0, Math.PI * 2); | |
ctx.fill(); | |
if(star.bigger){ | |
star.radius += .01; | |
if(star.radius >= 3) star.bigger = false; | |
}else{ | |
star.radius -= .01; | |
if(star.radius <= .3) star.bigger = true; | |
} | |
if( | |
star.moveTo.x >= star.pos.x - 5 && | |
star.moveTo.x <= star.pos.x + 5 | |
){ | |
star.moveTo.x = Math.random() * c.width; | |
} | |
else if(star.moveTo.x < star.pos.x) star.pos.x -= star.speed; | |
else if(star.moveTo.x > star.pos.x) star.pos.x += star.speed; | |
if( | |
star.moveTo.y >= star.pos.y - 5 && | |
star.moveTo.y <= star.pos.y + 5 | |
){ | |
star.moveTo.y = Math.random() * c.height; | |
} | |
else if(star.moveTo.y < star.pos.y) star.pos.y -= star.speed; | |
else if(star.moveTo.y > star.pos.y) star.pos.y += star.speed; | |
for(var i = 0; i < stars.length; i++){ | |
if( | |
star != stars[i] && | |
Math.sqrt( | |
(star.pos.x - stars[i].pos.x) * (star.pos.x - stars[i].pos.x) + | |
(star.pos.y - stars[i].pos.y) * (star.pos.y - stars[i].pos.y) | |
) < 50 | |
){ | |
ctx.beginPath(); | |
ctx.moveTo(star.pos.x, star.pos.y); | |
ctx.lineTo(stars[i].pos.x, stars[i].pos.y); | |
ctx.closePath(); | |
ctx.strokeStyle = "#fff"; | |
ctx.lineWidth = .025; | |
ctx.stroke(); | |
} | |
} | |
} | |
return { | |
init: function(){ | |
for(var i = 0; i < num; i++){ | |
stars.push(new makeStar()); | |
} | |
}, | |
move: function(){ | |
timer = setInterval(function(){ | |
ctx.clearRect(0, 0, c.width, c.height); | |
background(); | |
for(var i = 0; i < stars.length; i++){ | |
draw(stars[i]); | |
} | |
}, 1); | |
} | |
} | |
} | |
c = $("#sky"), | |
background = function(){ | |
var grdnt = ctx.createLinearGradient(0, 0, 0, c.height); | |
grdnt.addColorStop(0, "#000"); | |
grdnt.addColorStop(.5, "#135288"); | |
grdnt.addColorStop(1, "#0C5663"); | |
ctx.fillStyle = grdnt; | |
ctx.fillRect(0, 0, c.width, c.height); | |
}, | |
sky = new Stars(); | |
c.width = window.innerWidth; | |
c.height = window.innerHeight; | |
var ctx = c.getContext("2d"); | |
sky.init(); | |
background(); | |
sky.move(); | |
window.addEventListener("resize", function(){ | |
c.width = window.innerWidth; | |
c.height = window.innerHeight; | |
clearInterval(timer); | |
timer = ""; | |
sky = ""; | |
ctx.clearRect(0, 0, c.width, c.height); | |
sky = new Stars(); | |
sky.init(); | |
background(); | |
sky.move(); | |
}, true); | |
}()); |
Thanks for this.