What’s on our mind?

Collection of articles, design, site, and resources made by designers and publisher @Menu View

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

let canvas = document.getElementById('canvas');
let ctx = canvas.getContext('2d');

canvas.width = window.innerWidth;
canvas.height = window.innerHeight;

window.addEventListener('resize', function () {
    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;
    ctx = canvas.getContext('2d');
    ctx.globalCompositeOperation = 'lighter';
});
let backgroundColors = ['#000', '#000'];
let colors = [
    ['#002aff', "#009ff2"],
    ['#0054ff', '#27e49b'],
    ['#202bc5', '#873dcc']
];
let count = 70;
let blur = [12, 70];
let radius = [1, 120];

ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.globalCompositeOperation = 'lighter';

let grd = ctx.createLinearGradient(0, canvas.height, canvas.width, 0);
grd.addColorStop(0, backgroundColors[0]);
grd.addColorStop(1, backgroundColors[1]);
ctx.fillStyle = grd;
ctx.fillRect(0, 0, canvas.width, canvas.height);

let items = [];

while (count--) {
    let thisRadius = rand(radius[0], radius[1]);
    let thisBlur = rand(blur[0], blur[1]);
    let x = rand(-100, canvas.width + 100);
    let y = rand(-100, canvas.height + 100);
    let colorIndex = Math.floor(rand(0, 299) / 100);
    let colorOne = colors[colorIndex][0];
    let colorTwo = colors[colorIndex][1];

    ctx.beginPath();
    ctx.filter = `blur(${thisBlur}px)`;
    let grd = ctx.createLinearGradient(x - thisRadius / 2, y - thisRadius / 2, x + thisRadius, y + thisRadius);

    grd.addColorStop(0, colorOne);
    grd.addColorStop(1, colorTwo);
    ctx.fillStyle = grd;
    ctx.fill();
    ctx.arc(x, y, thisRadius, 0, Math.PI * 2);
    ctx.closePath();

    let directionX = Math.round(rand(-99, 99) / 100);
    let directionY = Math.round(rand(-99, 99) / 100);

    items.push({
        x: x,
        y: y,
        blur: thisBlur,
        radius: thisRadius,
        initialXDirection: directionX,
        initialYDirection: directionY,
        initialBlurDirection: directionX,
        colorOne: colorOne,
        colorTwo: colorTwo,
        gradient: [x - thisRadius / 2, y - thisRadius / 2, x + thisRadius, y + thisRadius],
    });
}

function changeCanvas(timestamp) {
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    let adjX = 2;
    let adjY = 2;
    let adjBlur = 1;
    items.forEach(function (item) {

        if (item.x + (item.initialXDirection * adjX) >= canvas.width && item.initialXDirection !== 0 ||
            item.x + (item.initialXDirection * adjX) <= 0 && item.initialXDirection !== 0) {
            item.initialXDirection = item.initialXDirection * -1;
        }
        if (item.y + (item.initialYDirection * adjY) >= canvas.height && item.initialYDirection !== 0 ||
            item.y + (item.initialYDirection * adjY) <= 0 && item.initialYDirection !== 0) {
            item.initialYDirection = item.initialYDirection * -1;
        }

        if (item.blur + (item.initialBlurDirection * adjBlur) >= radius[1] && item
            .initialBlurDirection !== 0 || item.blur + (item.initialBlurDirection * adjBlur) <= radius[
                0] && item.initialBlurDirection !== 0) {
            item.initialBlurDirection *= -1;
        }

        item.x += (item.initialXDirection * adjX);
        item.y += (item.initialYDirection * adjY);
        item.blur += (item.initialBlurDirection * adjBlur);
        ctx.beginPath();
        ctx.filter = `blur(${item.blur}px)`;
        let grd = ctx.createLinearGradient(item.gradient[0], item.gradient[1], item.gradient[2], item
            .gradient[3]);
        grd.addColorStop(0, item.colorOne);
        grd.addColorStop(1, item.colorTwo);
        ctx.fillStyle = grd;
        ctx.arc(item.x, item.y, item.radius, 0, Math.PI * 2);
        ctx.fill();
        ctx.closePath();

    });
    window.requestAnimationFrame(changeCanvas);

}

window.requestAnimationFrame(changeCanvas);