Author: | Charles Ojukwu |
---|---|
Views Total: | 12,278 views |
Official Page: | Go to website |
Last Update: | June 19, 2018 |
License: | MIT |
Preview:

Description:
Smoothly animated waves generated with JavaScript and HTML5 canvas. Ideal for creative page header.
How to use it:
Create an empty canvas
element on the page.
<div class="canvas-wrap"> <canvas id="canvas"></canvas> </div>
The core JavaScript to generate animated waves.
(function(){ "use strict"; var cvs,ctx; //var nodes = 5; var waves = []; var waveHeight = 30; var colours = ["#f00","#0f0","#00f"] function init() { cvs = document.getElementById("canvas"); ctx = cvs.getContext("2d"); resizeCanvas(cvs); for (var i = 0; i < 3; i++) { var temp = new wave(colours[i],1,5); } setInterval(update,16); } function randomColour() { // body... var h = Math.round(Math.random()*360); return "hsl("+h+",100%,50%)"; } function update(array) { // body... //ctx.clearRect(0, 0, cvs.width, cvs.height); var fill = window.getComputedStyle(document.querySelector(".header"),null).getPropertyValue("background-color"); ctx.fillStyle = fill; ctx.globalCompositeOperation = "source-over"; ctx.fillRect(0,0,cvs.width,cvs.height); ctx.globalCompositeOperation = "screen"; for (var i = 0; i < waves.length; i++) { for (var j = 0; j < waves[i].nodes.length; j++) { bounce(waves[i].nodes[j]); } drawWave(waves[i]); //drawLine(waves[i].nodes); //drawNodes(waves[i].nodes); } ctx.globalCompositeOperation = "hue"; ctx.fillStyle = fill; //ctx.fillRect(0,0,cvs.width,cvs.height); } function wave(colour,lambda,nodes) { // body... this.colour = colour; this.lambda = lambda; this.nodes = []; var tick = 1; for (var i = 0; i <= nodes+2; i++) { var temp = [(i-1)*cvs.width/nodes,0,Math.random()*200,.3];//this.speed*plusOrMinus this.nodes.push(temp); console.log(temp); } console.log(this.nodes); waves.push(this); } function bounce(node) { node[1] = waveHeight/2*Math.sin(node[2]/20)+cvs.height/2; node[2] = node[2] + node[3]; } function drawWave (obj) { var diff = function(a,b) { return (b - a)/2 + a; } ctx.fillStyle = obj.colour; ctx.beginPath(); ctx.moveTo(0,cvs.height); ctx.lineTo(obj.nodes[0][0],obj.nodes[0][1]); for (var i = 0; i < obj.nodes.length; i++) { if (obj.nodes[i+1]) { ctx.quadraticCurveTo( obj.nodes[i][0],obj.nodes[i][1], diff(obj.nodes[i][0],obj.nodes[i+1][0]),diff(obj.nodes[i][1],obj.nodes[i+1][1]) ); }else{ ctx.lineTo(obj.nodes[i][0],obj.nodes[i][1]); ctx.lineTo(cvs.width,cvs.height); } } ctx.closePath(); ctx.fill(); } function drawNodes (array) { ctx.strokeStyle = "#888"; for (var i = 0; i < array.length; i++) { ctx.beginPath(); ctx.arc(array[i][0],array[i][1],4,0,2*Math.PI); ctx.closePath(); ctx.stroke(); } } function drawLine (array) { ctx.strokeStyle = "#888"; for (var i = 0; i < array.length; i++) { if (array[i+1]) { ctx.lineTo(array[i+1][0],array[i+1][1]); } } ctx.stroke(); } function resizeCanvas(canvas,width,height) { if (width && height) { canvas.width = width; canvas.height = height; } else { if (window.innerHeight > 1920) { canvas.width = window.innerWidth; } else { canvas.width = 1920; } canvas.height = waveHeight; } } document.addEventListener("DOMContentLoaded",init,false); })();
Adjust the height of waves.
var waveHeight = 30;
Override the default colors.
var colours = ["#f00","#0f0","#00f"]