HTML5 canvas粒子飞射的loading进度条特效

当前位置:主页 > Html5库 > html5 canvas > HTML5 canvas粒子飞射的loading进度条特效
HTML5 canvas粒子飞射的loading进度条特效
分享:

    插件介绍

    这是一款使用HTML5 canvas制作的效果非常酷的loading进度条特效。该loading进度条在动画的时候会有粒子从进度条头部不断的飞射出来,并且进度条的颜色还会随机改变,非常有创意。

    浏览器兼容性

    浏览器兼容性
    时间:2015-06-01
    阅读:
简要教程

这是一款使用HTML5 canvas制作的效果非常酷的loading进度条特效。该loading进度条在动画的时候会有粒子从进度条头部不断的飞射出来,并且进度条的颜色还会随机改变,非常有创意。

制作方法

HTML结构

这个loading进度条使用一个空的canvas来制作。

<canvas></canvas>                
              
JAVASCRIPT

progressbar()函数用于绘制进度条,particle()函数用于绘制粒子。在draw()方法中判断当前进度条的总进度,在指定刻度时改变进度条的颜色。update()函数循环每一个粒子,不断的修改粒子的高度,从而制作出粒子飞射的效果。最后使用animloop()方法来不断的循环动画。

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();