SOURCE

console 命令行工具 X clear

                    
>
console
var c1 = document.getElementById('c1'),
    ctx1 = c1.getContext('2d'),
    c2 = document.getElementById('c2'),
    ctx2 = c2.getContext('2d'),
    twopi = Math.PI * 2,
    parts = [],
    sizeBase,
    cw,
    opt,
    hue,
    count;

function rand(min, max) {
    return Math.random() * (max - min) + min;
}

function hsla(h, s, l, a) {
    return 'hsla(' + h + ',' + s + '%,' + l + '%,' + a + ')';
}

function create() {
    sizeBase = cw + ch;
    count = Math.floor(sizeBase * 0.3),
        hue = rand(0, 360),
        opt = {
            radiusMin: 1,
            radiusMax: sizeBase * 0.04,
            blurMin: 10,
            blurMax: sizeBase * 0.04,
            hueMin: hue,
            hueMax: hue + 100,
            saturationMin: 10,
            saturationMax: 70,
            lightnessMin: 20,
            lightnessMax: 50,
            alphaMin: 0.1,
            alphaMax: 0.5
        }
    ctx1.clearRect(0, 0, cw, ch);
    ctx1.globalCompositeOperation = 'lighter';
    while (count--) {
        var radius = rand(opt.radiusMin, opt.radiusMax),
            blur = rand(opt.blurMin, opt.blurMax),
            x = rand(0, cw),
            y = rand(0, ch),
            hue = rand(opt.hueMin, opt.hueMax),
            saturation = rand(opt.saturationMin, opt.saturationMax),
            lightness = rand(opt.lightnessMin, opt.lightnessMax),
            alpha = rand(opt.alphaMin, opt.alphaMax);

        ctx1.shadowColor = hsla(hue, saturation, lightness, alpha);
        ctx1.shadowBlur = blur;
        ctx1.beginPath();
        ctx1.arc(x, y, radius, 0, twopi);
        ctx1.closePath();
        ctx1.fill();
    }

    parts.length = 0;
    for (var i = 0; i < Math.floor((cw + ch) * 0.03); i++) {
        parts.push({
            radius: rand(1, sizeBase * 0.03),
            x: rand(0, cw),
            y: rand(0, ch),
            angle: rand(0, twopi),
            vel: rand(0.1, 0.5),
            tick: rand(0, 10000)
        });
    }
}

function init() {
    resize();
    create();
    loop();
}

function loop() {
    requestAnimationFrame(loop);

    ctx2.clearRect(0, 0, cw, ch);
    ctx2.globalCompositeOperation = 'source-over';
    ctx2.shadowBlur = 0;
    ctx2.drawImage(c1, 0, 0);
    ctx2.globalCompositeOperation = 'lighter';

    var i = parts.length;
    ctx2.shadowBlur = 15;
    ctx2.shadowColor = '#fff';
    while (i--) {
        var part = parts[i];

        part.x += Math.cos(part.angle) * part.vel;
        part.y += Math.sin(part.angle) * part.vel;
        part.angle += rand(-0.05, 0.05);

        ctx2.beginPath();
        ctx2.arc(part.x, part.y, part.radius, 0, twopi);
        ctx2.fillStyle = hsla(0, 0, 100, 0.075 + Math.cos(part.tick * 0.02) * 0.05);
        ctx2.fill();

        if (part.x - part.radius > cw) { part.x = -part.radius }
        if (part.x + part.radius < 0) { part.x = cw + part.radius }
        if (part.y - part.radius > ch) { part.y = -part.radius }
        if (part.y + part.radius < 0) { part.y = ch + part.radius }

        part.tick++;
    }
}

function resize() {
    cw = c1.width = c2.width = window.innerWidth,
        ch = c1.height = c2.height = window.innerHeight;
    create();
}

function click() {
    create()
}

window.addEventListener('resize', resize);
window.addEventListener('click', click);

init();
<canvas id="c1"></canvas>
<canvas id="c2"></canvas>
body {
	background: #000;
	overflow: hidden;
}

canvas {
	bottom: 0;
	left: 0;
	position: absolute;
	right: 0;
	top: 0;
}

#c1 {
	opacity: 0;
}

#c2 {
	background: #000;
}