let width, height, largeHeader, canvas, ctx, circles, target, animateHeader = true; // Main export function bubble() { initHeader(); addListeners(); } function initHeader() { width = window.innerWidth; height = 500; target = { x: 0, y: height }; largeHeader = document.getElementById('header'); largeHeader.style.height = height + 'px'; canvas = document.getElementById('canvas'); canvas.width = width; canvas.height = height; ctx = canvas.getContext('2d'); // create particles circles = []; for (var x = 0; x < width * 0.5; x++) { var c = new Circle(); circles.push(c); } animate(); } // Event handling function addListeners() { window.addEventListener('scroll', scrollCheck); window.addEventListener('resize', resize); } function scrollCheck() { if (document.body.scrollTop > height) animateHeader = false; else animateHeader = true; } function resize() { width = window.innerWidth; height = 500; largeHeader.style.height = height + 'px'; canvas.width = width; canvas.height = height; } function animate() { if (animateHeader) { ctx.clearRect(0, 0, width, height); for (var i in circles) { circles[i].draw(); } } requestAnimationFrame(animate); } // Canvas manipulation function Circle() { var _this = this; // constructor (function() { _this.pos = {}; init(); })(); function init() { _this.pos.x = Math.random() * width; _this.pos.y = height + Math.random() * 100; _this.alpha = 0.1 + Math.random() * 0.3; _this.scale = 0.1 + Math.random() * 0.3; _this.velocity = Math.random(); } this.draw = function() { if (_this.alpha <= 0) { init(); } _this.pos.y -= _this.velocity; _this.alpha -= 0.0005; ctx.beginPath(); ctx.arc(_this.pos.x, _this.pos.y, _this.scale * 10, 0, 2 * Math.PI, false); ctx.fillStyle = 'rgba(255,255,255,' + _this.alpha + ')'; ctx.fill(); }; }