Starting to play around with html5 canvas more I came across this loader by Jack Rugile and proceeded to try and make something similar. End result seems okay. Any tips would be welcome :)!
A Pen by Lennart Hase on CodePen.
Starting to play around with html5 canvas more I came across this loader by Jack Rugile and proceeded to try and make something similar. End result seems okay. Any tips would be welcome :)!
A Pen by Lennart Hase on CodePen.
| <canvas></canvas> |
| particle_no = 25; | |
| window.requestAnimFrame = (function(){ | |
| return window.requestAnimationFrame || | |
| window.webkitRequestAnimationFrame || | |
| window.mozRequestAnimationFrame || | |
| window.oRequestAnimationFrame || | |
| window.msRequestAnimationFrame || | |
| function( callback ){ | |
| window.setTimeout(callback, 1000 / 60); | |
| }; | |
| })(); | |
| var canvas = document.getElementsByTagName("canvas")[0]; | |
| var ctx = canvas.getContext("2d"); | |
| var counter = 0; | |
| var particles = []; | |
| var w = 400, h = 200; | |
| canvas.width = w; | |
| canvas.height = h; | |
| function reset(){ | |
| ctx.fillStyle = "#272822"; | |
| ctx.fillRect(0,0,w,h); | |
| ctx.fillStyle = "#171814"; | |
| ctx.fillRect(25,80,350,25); | |
| } | |
| function progressbar(){ | |
| this.widths = 0; | |
| this.hue = 0; | |
| this.draw = function(){ | |
| ctx.fillStyle = 'hsla('+this.hue+', 100%, 40%, 1)'; | |
| ctx.fillRect(25,80,this.widths,25); | |
| var grad = ctx.createLinearGradient(0,0,0,130); | |
| grad.addColorStop(0,"transparent"); | |
| grad.addColorStop(1,"rgba(0,0,0,0.5)"); | |
| ctx.fillStyle = grad; | |
| ctx.fillRect(25,80,this.widths,25); | |
| } | |
| } | |
| function particle(){ | |
| this.x = 23 + bar.widths; | |
| this.y = 82; | |
| this.vx = 0.8 + Math.random()*1; | |
| this.v = Math.random()*5; | |
| this.g = 1 + Math.random()*3; | |
| this.down = false; | |
| this.draw = function(){ | |
| ctx.fillStyle = 'hsla('+(bar.hue+0.3)+', 100%, 40%, 1)';; | |
| var size = Math.random()*2; | |
| ctx.fillRect(this.x, this.y, size, size); | |
| } | |
| } | |
| bar = new progressbar(); | |
| function draw(){ | |
| reset(); | |
| counter++ | |
| bar.hue += 0.8; | |
| bar.widths += 2; | |
| if(bar.widths > 350){ | |
| if(counter > 215){ | |
| reset(); | |
| bar.hue = 0; | |
| bar.widths = 0; | |
| counter = 0; | |
| particles = []; | |
| } | |
| else{ | |
| bar.hue = 126; | |
| bar.widths = 351; | |
| bar.draw(); | |
| } | |
| } | |
| else{ | |
| bar.draw(); | |
| for(var i=0;i<particle_no;i+=10){ | |
| particles.push(new particle()); | |
| } | |
| } | |
| update(); | |
| } | |
| function update(){ | |
| for(var i=0;i<particles.length;i++){ | |
| var p = particles[i]; | |
| p.x -= p.vx; | |
| if(p.down == true){ | |
| p.g += 0.1; | |
| p.y += p.g; | |
| } | |
| else{ | |
| if(p.g<0){ | |
| p.down = true; | |
| p.g += 0.1; | |
| p.y += p.g; | |
| } | |
| else{ | |
| p.y -= p.g; | |
| p.g -= 0.1; | |
| } | |
| } | |
| p.draw(); | |
| } | |
| } | |
| function animloop() { | |
| draw(); | |
| requestAnimFrame(animloop); | |
| } | |
| animloop(); |
| body{ | |
| margin: 0; | |
| padding: 0; | |
| background: #272822; | |
| } | |
| canvas{ | |
| position: absolute; | |
| top: calc(50% - 50px); | |
| top: -webkit-calc(50% - 100px); | |
| left: calc(50% - 200px); | |
| left: -webkit-calc(50% - 200px); | |
| } |