http://thecodeplayer.com/walkthrough/html5-canvas-snow-effect
html
โค๊ด: [Select]
<canvas id="canvas"></canvas>
css
โค๊ด: [Select]
/*Some basic styles*/
* { margin: 0; padding: 0;}
#canvas {
display: block;
/*Fill canvas with black by default*/
background: #000;
}
js
window.onload = function(){ var canvas = document.getElementById("canvas"); var ctx = canvas.getContext("2d"); //Lets make the canvas occupy the full page var W = window.innerWidth, H = window.innerHeight; canvas.width = W; canvas.height = H; //Lets make some particles var particles = []; for(var i = 0; i < 25; i++) { particles.push(new particle()); } function particle() { //location on the canvas this.location = {x: Math.random()*W, y: Math.random()*H}; //radius - lets make this 0 this.radius = 0; //speed this.speed = 3; //steering angle in degrees range = 0 to 360 this.angle = Math.random()*360; //colors var r = Math.round(Math.random()*255); var g = Math.round(Math.random()*255); var b = Math.round(Math.random()*255); var a = Math.random(); this.rgba = "rgba("+r+", "+g+", "+b+", "+a+")"; } //Lets draw the particles function draw() { //re-paint the BG //Lets fill the canvas black //reduce opacity of bg fill. //blending time ctx.globalCompositeOperation = "source-over"; ctx.fillStyle = "rgba(0, 0, 0, 0.02)"; ctx.fillRect(0, 0, W, H); ctx.globalCompositeOperation = "lighter"; for(var i = 0; i < particles.length; i++) { var p = particles[i]; ctx.fillStyle = "white"; ctx.fillRect(p.location.x, p.location.y, p.radius, p.radius); //Lets move the particles //So we basically created a set of particles moving in random direction //at the same speed //Time to add ribbon effect for(var n = 0; n < particles.length; n++) { var p2 = particles[n]; //calculating distance of particle with all other particles var yd = p2.location.y - p.location.y; var xd = p2.location.x - p.location.x; var distance = Math.sqrt(xd*xd + yd*yd); //draw a line between both particles if they are in 200px range if(distance < 200) { ctx.beginPath(); ctx.lineWidth = 1; ctx.moveTo(p.location.x, p.location.y); ctx.lineTo(p2.location.x, p2.location.y); ctx.strokeStyle = p.rgba; ctx.stroke(); //The ribbons appear now. } } //We are using simple vectors here //New x = old x + speed * cos(angle) p.location.x = p.location.x + p.speed*Math.cos(p.angle*Math.PI/180); //New y = old y + speed * sin(angle) p.location.y = p.location.y + p.speed*Math.sin(p.angle*Math.PI/180); //You can read about vectors here: //http://physics.about.com/od/mathematics/a/VectorMath.htm if(p.location.x < 0) p.location.x = W; if(p.location.x > W) p.location.x = 0; if(p.location.y < 0) p.location.y = H; if(p.location.y > H) p.location.y = 0; } } setInterval(draw, 30); }