JSFiddle - React, Tailwind, and code Playground
by sc0rp10
HTML
<canvas id="canvas"></canvas>
CSS
body, html {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
overflow: hidden;
}
body {
background-image: url("http://cdn.weblab.pro/fY5MOk61.jpg");
background-repeat: no-repeat;
background-size: cover;
}
.foo {
width: 700px;
background-color: rgba(255, 255, 255, 0.5);
height: 700px;
margin: auto;
}
canvas {
display: block;
margin: auto;
width: 700px;
}
JavaScript
(function () {
var requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;
window.requestAnimationFrame = requestAnimationFrame;
})();
var canvas = document.getElementById("canvas"),
ctx = canvas.getContext("2d");
canvas.height = document.body.offsetHeight;
canvas.width = 700;
var parts = [],
minSpawnTime = 40,
lastTime = new Date().getTime(),
maxLifeTime = Math.min(5000, (canvas.height/(1.5*60)*1000)),
emitterX = canvas.width / 2,
emitterY = canvas.height - 10,
smokeImage = new Image();
function spawn() {
if (new Date().getTime() > lastTime + minSpawnTime) {
lastTime = new Date().getTime();
parts.push(new smoke(emitterX, emitterY));
}
}
function render() {
var len = parts.length;
ctx.clearRect(0, 0, canvas.width, canvas.height);
while (len--) {
if (parts[len].y < 0 || parts[len].lifeTime > maxLifeTime) {
parts.splice(len, 1);
} else {
parts[len].update();
ctx.save();
var offsetX = -parts[len].size/2,
offsetY = -parts[len].size/2;
ctx.translate(parts[len].x-offsetX, parts[len].y-offsetY);
ctx.rotate(parts[len].angle / 180 * Math.PI);
ctx.globalAlpha = parts[len].alpha;
ctx.drawImage(smokeImage, offsetX,offsetY, parts[len].size, parts[len].size);
ctx.restore();
}
}
spawn();
requestAnimationFrame(render);
}
function smoke(x, y, index) {
this.x = x;
this.y = y - 250;
this.size = 1;
this.startSize = 132;
this.endSize = 140;
this.angle = Math.random() * 359;
this.startLife = new Date().getTime();
this.lifeTime = 0;
this.velY = -1 - (Math.random()*0.5);
this.velX = Math.floor(Math.random() * (-6) + 3) / 10;
}
smoke.prototype.update = function () {
this.lifeTime = new...