forked from qiushanhe/dm-manage-web
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
208 lines
6.2 KiB
208 lines
6.2 KiB
/* ========================================================*/
|
|
/* Light Loader
|
|
/*========================================================*/
|
|
var lightLoader = function (c, cw, ch) {
|
|
var _this = this;
|
|
this.c = c;
|
|
this.ctx = c.getContext('2d');
|
|
this.cw = cw;
|
|
this.ch = ch;
|
|
|
|
this.loaded = 0;
|
|
this.loaderSpeed = 1.5;
|
|
this.loaderHeight = 8;
|
|
this.loaderWidth = 428;
|
|
this.loader = {
|
|
x: this.cw / 2 - this.loaderWidth / 2,
|
|
y: this.ch / 2 - this.loaderHeight / 2
|
|
};
|
|
this.particles = [];
|
|
this.particleLift = 180;
|
|
this.gravity = 0.15;
|
|
this.particleRate = 8;
|
|
|
|
/* ========================================================*/
|
|
/* Initialize
|
|
/*========================================================*/
|
|
this.init = function () {
|
|
this.loop();
|
|
};
|
|
|
|
/* ========================================================*/
|
|
/* Utility Functions
|
|
/*========================================================*/
|
|
this.rand = function (rMi, rMa) {
|
|
return ~~(Math.random() * (rMa - rMi + 1) + rMi);
|
|
};
|
|
this.hitTest = function (x1, y1, w1, h1, x2, y2, w2, h2) {
|
|
return !(x1 + w1 < x2 || x2 + w2 < x1 || y1 + h1 < y2 || y2 + h2 < y1);
|
|
};
|
|
|
|
/* ========================================================*/
|
|
/* Update Loader
|
|
/*========================================================*/
|
|
this.updateLoader = function () {
|
|
if (this.loaded < 100) {
|
|
this.loaded += this.loaderSpeed;
|
|
} else {
|
|
this.loaded = 0;
|
|
}
|
|
};
|
|
|
|
/* ========================================================*/
|
|
/* Render Loader
|
|
/*========================================================*/
|
|
this.renderLoader = function () {
|
|
this.ctx.fillStyle = '#2F2F47';
|
|
this.ctx.fillRect(this.loader.x, this.loader.y, this.loaderWidth, this.loaderHeight);
|
|
|
|
var newWidth = (this.loaded / 100) * this.loaderWidth;
|
|
var linearGrad = this.ctx.createLinearGradient(0, 0, this.loaderWidth, 0);
|
|
linearGrad.addColorStop(0.0, '#24DED0');
|
|
linearGrad.addColorStop(1.0, '#1490EA');
|
|
this.ctx.fillStyle = linearGrad;
|
|
this.ctx.fillRect(this.loader.x, this.loader.y, newWidth, this.loaderHeight);
|
|
|
|
// this.ctx.fillStyle = '#2F2F47';
|
|
// this.ctx.fillRect(
|
|
// this.loader.x,
|
|
// this.loader.y,
|
|
// newWidth,
|
|
// this.loaderHeight
|
|
// );
|
|
};
|
|
|
|
/* ========================================================*/
|
|
/* Particles
|
|
/*========================================================*/
|
|
this.Particle = function () {
|
|
this.x = _this.loader.x + (_this.loaded / 100) * _this.loaderWidth - _this.rand(0, 1);
|
|
this.y = _this.ch / 2 + _this.rand(0, _this.loaderHeight) - _this.loaderHeight / 2;
|
|
this.vx = (_this.rand(0, 4) - 2) / 100;
|
|
this.vy = (_this.rand(0, _this.particleLift) - _this.particleLift * 2) / 100;
|
|
this.width = _this.rand(1, 4) / 2;
|
|
this.height = _this.rand(1, 4) / 2;
|
|
};
|
|
|
|
this.Particle.prototype.update = function (i) {
|
|
this.vx += (_this.rand(0, 6) - 3) / 100;
|
|
this.vy += _this.gravity;
|
|
this.x += this.vx;
|
|
this.y += this.vy;
|
|
|
|
if (this.y > _this.ch) {
|
|
_this.particles.splice(i, 1);
|
|
}
|
|
};
|
|
|
|
this.Particle.prototype.render = function () {
|
|
_this.ctx.fillStyle = 'rgba(50, 213, 203, 0.4)';
|
|
_this.ctx.fillRect(this.x, this.y, this.width, this.height);
|
|
};
|
|
|
|
this.createParticles = function () {
|
|
var i = this.particleRate;
|
|
while (i--) {
|
|
this.particles.push(new this.Particle());
|
|
}
|
|
};
|
|
|
|
this.updateParticles = function () {
|
|
var i = this.particles.length;
|
|
while (i--) {
|
|
var p = this.particles[i];
|
|
p.update(i);
|
|
}
|
|
};
|
|
|
|
this.renderParticles = function () {
|
|
var i = this.particles.length;
|
|
while (i--) {
|
|
var p = this.particles[i];
|
|
p.render();
|
|
}
|
|
};
|
|
|
|
/* ========================================================*/
|
|
/* Clear Canvas
|
|
/*========================================================*/
|
|
this.clearCanvas = function () {
|
|
this.ctx.globalCompositeOperation = 'source-over';
|
|
this.ctx.clearRect(0, 0, this.cw, this.ch);
|
|
this.ctx.globalCompositeOperation = 'lighter';
|
|
};
|
|
|
|
/* ========================================================*/
|
|
/* Animation Loop
|
|
/*========================================================*/
|
|
this.loop = function () {
|
|
var loopIt = function () {
|
|
requestAnimationFrame(loopIt, _this.c);
|
|
_this.clearCanvas();
|
|
|
|
_this.createParticles();
|
|
|
|
_this.updateLoader();
|
|
_this.updateParticles();
|
|
|
|
_this.renderLoader();
|
|
_this.renderParticles();
|
|
};
|
|
loopIt();
|
|
};
|
|
};
|
|
|
|
/* ========================================================*/
|
|
/* Check Canvas Support
|
|
/*========================================================*/
|
|
var isCanvasSupported = function () {
|
|
var elem = document.createElement('canvas');
|
|
return !!(elem.getContext && elem.getContext('2d'));
|
|
};
|
|
|
|
/* ========================================================*/
|
|
/* Setup requestAnimationFrame
|
|
/*========================================================*/
|
|
var setupRAF = function () {
|
|
var lastTime = 0;
|
|
var vendors = ['ms', 'moz', 'webkit', 'o'];
|
|
for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
|
|
window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];
|
|
window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];
|
|
}
|
|
|
|
if (!window.requestAnimationFrame) {
|
|
window.requestAnimationFrame = function (callback, element) {
|
|
var currTime = new Date().getTime();
|
|
var timeToCall = Math.max(0, 16 - (currTime - lastTime));
|
|
var id = window.setTimeout(function () {
|
|
callback(currTime + timeToCall);
|
|
}, timeToCall);
|
|
lastTime = currTime + timeToCall;
|
|
return id;
|
|
};
|
|
}
|
|
|
|
if (!window.cancelAnimationFrame) {
|
|
window.cancelAnimationFrame = function (id) {
|
|
clearTimeout(id);
|
|
};
|
|
}
|
|
};
|
|
|
|
/* ========================================================*/
|
|
/* Define Canvas and Initialize
|
|
/*========================================================*/
|
|
if (isCanvasSupported) {
|
|
var c = document.createElement('canvas');
|
|
c.width = 428;
|
|
c.height = 100;
|
|
var cw = c.width;
|
|
var ch = c.height;
|
|
// document.body.appendChild(c);
|
|
document.getElementById('loader-wrapper').appendChild(c);
|
|
var cl = new lightLoader(c, cw, ch);
|
|
|
|
setupRAF();
|
|
cl.init();
|
|
}
|
|
|