{"id":432,"date":"2026-08-17T21:44:49","date_gmt":"2026-08-17T21:44:49","guid":{"rendered":"https:\/\/x.sheep-mine.ts.net\/index.php\/using-javascript-and-html-canvas-to-make-animated-interactive-backgrounds\/"},"modified":"2026-08-17T21:44:49","modified_gmt":"2026-08-17T21:44:49","slug":"using-javascript-and-html-canvas-to-make-animated-interactive-backgrounds","status":"publish","type":"post","link":"https:\/\/x.sheep-mine.ts.net\/index.php\/using-javascript-and-html-canvas-to-make-animated-interactive-backgrounds\/","title":{"rendered":"Using Javascript and HTML canvas to make Animated Interactive Backgrounds"},"content":{"rendered":"<p><br \/>\n<\/p>\n<div>\n<p class=\"dpsp-share-text \" style=\"margin-bottom:10px\">\n\t\tSharing is caring!\t<\/p>\n<h3>What is a canvas?<\/h3>\n<p>A canvas is similar to a real life physical canvas used by painters. It is basically a space that can be used to draw on. Unlike a real canvas an HTML canvas can have the image data added and removed with ease. Canvases are usually used when you want to have some form of interaction with the user or you want the users computer to do all the computation instead of the server.<\/p>\n<h3>What is Javascript?<\/h3>\n<p>If you don\u2019t know what Javascript is then I don\u2019t even know why you\u2019re here. Where do you live? where do you come from? is this your first time on this planet? All jokes aside Javascript is just a scripting language used a lot on websites that want some computation done on teh users computer instead of the server.<\/p>\n<h3>Create and Inject a canvas<\/h3>\n<p>The first thing we need is to create a canvas. We could create a canvas in HTMLthen just get a reference to it in javascript or we can create on in Javascript and inject it into the webpage. I will be showing you the inject method as this allows you to add this script to any HTML page without the need for the HTML to be edited. We add 4 variables for storing information used in other functions and then the setupCanvas function itself. The comments should explain what each part of the code does.<\/p>\n<p><!-- Urvanov Syntax Highlighter v2.8.38 --><\/p>\n<div id=\"urvanov-syntax-highlighter-6a8380cfdeb7c605151977\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-mac print-yes notranslate\" data-settings=\" minimize scroll-mouseover\" style=\" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;\">\n<p><textarea wrap=\"soft\" class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly=\"readonly\" style=\"-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;\"><br \/>\nvar w = window.innerWidth; \/\/ ge the width of the browser window<br \/>\nvar h = window.innerHeight; \/\/ get the height of teh browser window<br \/>\nvar bgcan   \/\/ something to store our canvas<br \/>\nvar ctx     \/\/ something to store our canvas context<\/p>\n<p>function setupCanvas(){<br \/>\n    bgcan = document.createElement(&#8216;canvas&#8217;); \/\/ make a new canvas object<br \/>\n    bgcan.id = &#8216;bgcan&#8217;; \/\/ give it a name<\/p>\n<p>    \/\/ set the webpage body&#8217;s margin and padding to 0 (no gap between webpage contents and browser wall)<br \/>\n    document.body.style.margin = &#8220;0&#8221;<br \/>\n    document.body.style.padding = &#8220;0&#8221;<br \/>\n    document.body.appendChild(bgcan); \/\/ adds the canvas to the webpage body<\/p>\n<p>    bgcan.width = w;    \/\/ set width of canvas to window width<br \/>\n    bgcan.height = h;   \/\/ same as above for height<br \/>\n    bgcan.style.position = &#8220;fixed&#8221;   \/\/ set position (absolute,fixed)<br \/>\n    bgcan.style.top = &#8220;0&#8221;   \/\/ pixels from top<br \/>\n    bgcan.style.left = &#8220;0&#8221;  \/\/ pixels from left<br \/>\n    bgcan.style.zIndex = &#8220;-99&#8221;  \/\/ place behind<br \/>\n    ctx = bgcan.getContext(&#8220;2d&#8221;);   \/\/ set canvas to 2d mode<br \/>\n}<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\" style=\"\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"urvanov-syntax-highlighter-nums-content\" style=\"font-size: 12px !important; line-height: 15px !important;\">\n<p>1<\/p>\n<p>2<\/p>\n<p>3<\/p>\n<p>4<\/p>\n<p>5<\/p>\n<p>6<\/p>\n<p>7<\/p>\n<p>8<\/p>\n<p>9<\/p>\n<p>10<\/p>\n<p>11<\/p>\n<p>12<\/p>\n<p>13<\/p>\n<p>14<\/p>\n<p>15<\/p>\n<p>16<\/p>\n<p>17<\/p>\n<p>18<\/p>\n<p>19<\/p>\n<p>20<\/p>\n<p>21<\/p>\n<p>22<\/p>\n<\/div>\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\" style=\"font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;\">\n<p><span class=\"crayon-t\">var<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">w<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">window<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">innerWidth<\/span><span class=\"crayon-sy\">;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-c\">\/\/ ge the width of the browser window<\/span><\/p>\n<p><span class=\"crayon-t\">var<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">h<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">window<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">innerHeight<\/span><span class=\"crayon-sy\">;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-c\">\/\/ get the height of teh browser window<\/span><\/p>\n<p><span class=\"crayon-t\">var<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">bgcan<\/span><span class=\"crayon-h\">\u00a0\u00a0 <\/span><span class=\"crayon-c\">\/\/ something to store our canvas<\/span><\/p>\n<p><span class=\"crayon-t\">var<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">ctx<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-c\">\/\/ something to store our canvas context<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-t\">function<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">setupCanvas<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">{<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">bgcan<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">document<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">createElement<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8216;canvas&#8217;<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-c\">\/\/ make a new canvas object<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">bgcan<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e \">id<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;bgcan&#8217;<\/span><span class=\"crayon-sy\">;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-c\">\/\/ give it a name<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-c\">\/\/ set the webpage body&#8217;s margin and padding to 0 (no gap between webpage contents and browser wall)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">document<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">body<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">style<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e \">margin<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;0&#8221;<\/span><span class=\"crayon-h\"> <\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">document<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">body<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">style<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e \">padding<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;0&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">document<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">body<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">appendChild<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">bgcan<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-c\">\/\/ adds the canvas to the webpage body<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">bgcan<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">width<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">w<\/span><span class=\"crayon-sy\">;<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-c\">\/\/ set width of canvas to window width<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">bgcan<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">height<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">h<\/span><span class=\"crayon-sy\">;<\/span><span class=\"crayon-h\">\u00a0\u00a0 <\/span><span class=\"crayon-c\">\/\/ same as above for height<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">bgcan<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">style<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e \">position<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;fixed&#8221;<\/span><span class=\"crayon-h\">\u00a0\u00a0 <\/span><span class=\"crayon-c\">\/\/ set position (absolute,fixed)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">bgcan<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">style<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e \">top<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;0&#8221;<\/span><span class=\"crayon-h\">\u00a0\u00a0 <\/span><span class=\"crayon-c\">\/\/ pixels from top<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">bgcan<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">style<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e \">left<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;0&#8221;<\/span><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-c\">\/\/ pixels from left<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">bgcan<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">style<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e \">zIndex<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;-99&#8221;<\/span><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-c\">\/\/ place behind <\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">ctx<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">bgcan<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">getContext<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;2d&#8221;<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;<\/span><span class=\"crayon-h\">\u00a0\u00a0 <\/span><span class=\"crayon-c\">\/\/ set canvas to 2d mode<\/span><\/p>\n<p><span class=\"crayon-sy\">}<\/span><\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table><\/div>\n<\/p><\/div>\n<p><!-- [Format Time: 0.0028 seconds] --><\/p>\n<p>The code above will add a canvas the same height and width of the browser window to the web page when we call it with setupCanvas()<\/p>\n<p>If the browser windo is resized the canvas will no longer be the correct size and this is not what we want. So we will add a resize finction for when this happens:<\/p>\n<p><!-- Urvanov Syntax Highlighter v2.8.38 --><\/p>\n<div id=\"urvanov-syntax-highlighter-6a8380cfdeb87685827090\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-mac print-yes notranslate\" data-settings=\" minimize scroll-mouseover\" style=\" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;\">\n<p><textarea wrap=\"soft\" class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly=\"readonly\" style=\"-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;\"><br \/>\n\/\/ if window is resized do canvas too<br \/>\nfunction resize(){<br \/>\n    w = window.innerWidth;<br \/>\n    h = window.innerHeight;<br \/>\n    bgcan.width = w;<br \/>\n    bgcan.height = h;<br \/>\n}<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\" style=\"\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\" style=\"font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;\">\n<p><span class=\"crayon-c\">\/\/ if window is resized do canvas too<\/span><\/p>\n<p><span class=\"crayon-t\">function<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">resize<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">{<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">w<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">window<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">innerWidth<\/span><span class=\"crayon-sy\">;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">h<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">window<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">innerHeight<\/span><span class=\"crayon-sy\">;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">bgcan<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">width<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">w<\/span><span class=\"crayon-sy\">;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">bgcan<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">height<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">h<\/span><span class=\"crayon-sy\">;<\/span><\/p>\n<p><span class=\"crayon-sy\">}<\/span><\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table><\/div>\n<\/p><\/div>\n<p><!-- [Format Time: 0.0007 seconds] --><\/p>\n<h3>Handling Events<\/h3>\n<p>The setupCanvas function isnt going to run itself and needs some sort fo event to start it. We will want it to run once the page has finished loading so that the correct window width and height is captured. While were doing this will will set up the other events we want to capture for this example:<\/p>\n<p><!-- Urvanov Syntax Highlighter v2.8.38 --><\/p>\n<div id=\"urvanov-syntax-highlighter-6a8380cfdeb90284748315\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-mac print-yes notranslate\" data-settings=\" minimize scroll-mouseover\" style=\" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;\">\n<p><textarea wrap=\"soft\" class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly=\"readonly\" style=\"-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;\"><br \/>\n\/\/ MAIN \/\/<br \/>\n\/\/ when page finishes loading<br \/>\nwindow.addEventListener(&#8220;load&#8221;, function(){<br \/>\n    \/\/ create and add canvas<br \/>\n    setupCanvas(&#8220;bgcanvas&#8221;);<\/p>\n<p>    \/\/ run 1 frame every 16 milliseconds<br \/>\n    window.setInterval(update, 16);<\/p>\n<p>    \/\/ listen for resize event from browser<br \/>\n    window.addEventListener(&#8216;resize&#8217;, resize, false);<\/p>\n<p>    \/\/ when mouse  moves<br \/>\n    onmousemove = function(e){ storemp(e.x, e.y)}<br \/>\n});<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\" style=\"\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\" style=\"font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;\">\n<p><span class=\"crayon-c\">\/\/ MAIN \/\/<\/span><\/p>\n<p><span class=\"crayon-c\">\/\/ when page finishes loading<\/span><\/p>\n<p><span class=\"crayon-v\">window<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">addEventListener<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;load&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-t\">function<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">{<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-c\">\/\/ create and add canvas<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">setupCanvas<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;bgcanvas&#8221;<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-c\">\/\/ run 1 frame every 16 milliseconds<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">window<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">setInterval<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">update<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">16<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-c\">\/\/ listen for resize event from browser<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">window<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">addEventListener<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8216;resize&#8217;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">resize<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-t\">false<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-c\">\/\/ when mouse\u00a0\u00a0moves<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">onmousemove<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-t\">function<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">e<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">storemp<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">e<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">e<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">y<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-h\"> <\/span><\/p>\n<p><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;<\/span><\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table><\/div>\n<\/p><\/div>\n<p><!-- [Format Time: 0.0009 seconds] --><\/p>\n<p>The window.addEventListener(\u201cload\u201d\u2026 function will run once the page finishes loading. Here we create the canvas with setupCanvas, add a timer to run the update function once every 16 milliseconds, run the resize function when the resize event is fired and run the storemp function when the mouse is moved. Dont worry abuot the missing function we are going to add them now:<\/p>\n<p><!-- Urvanov Syntax Highlighter v2.8.38 --><\/p>\n<div id=\"urvanov-syntax-highlighter-6a8380cfdeb93237307365\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-mac print-yes notranslate\" data-settings=\" minimize scroll-mouseover\" style=\" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;\">\n<p><textarea wrap=\"soft\" class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly=\"readonly\" style=\"-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;\"><br \/>\nvar x = 0   \/\/ store mouse pointer x<br \/>\nvar y = 0;  \/\/ store mouse pointer y<\/p>\n<p>\/\/ store mouse pointer position<br \/>\nfunction storemp(mpx,mpy){<br \/>\n    x = mpx;<br \/>\n    y = mpy<br \/>\n}<\/p>\n<p>function update(){<\/p>\n<p>}<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\" style=\"\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\" style=\"font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;\">\n<p><span class=\"crayon-t\">var<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-h\">\u00a0\u00a0 <\/span><span class=\"crayon-c\">\/\/ store mouse pointer x<\/span><\/p>\n<p><span class=\"crayon-t\">var<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">y<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-sy\">;<\/span><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-c\">\/\/ store mouse pointer y<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-c\">\/\/ store mouse pointer position<\/span><\/p>\n<p><span class=\"crayon-t\">function<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">storemp<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">mpx<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-v\">mpy<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">{<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">mpx<\/span><span class=\"crayon-sy\">;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">y<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-i\">mpy<\/span><\/p>\n<p><span class=\"crayon-sy\">}<\/span><\/p>\n<p>\u00a0<\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-t\">function<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">update<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">{<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><\/p>\n<p><span class=\"crayon-sy\">}<\/span><\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table><\/div>\n<\/p><\/div>\n<p><!-- [Format Time: 0.0006 seconds] --><\/p>\n<p>We now have everything in place except the animation code that draws the images on the canvas.<\/p>\n<h3>Drawing on the Canvas<\/h3>\n<p>This is the meat of the project where we get to use cool maths..(yeah I said it..COOL MATHS) to draw lines and shapes to the canvas. But before we do that we will add a few variabls which we wil use in the code:<\/p>\n<p><!-- Urvanov Syntax Highlighter v2.8.38 --><\/p>\n<div id=\"urvanov-syntax-highlighter-6a8380cfdeb9e043860577\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-mac print-yes notranslate\" data-settings=\" minimize scroll-mouseover\" style=\" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;\">\n<p><textarea wrap=\"soft\" class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly=\"readonly\" style=\"-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;\"><br \/>\nvar initMS = 0  \/\/ store the milliseconds since page load<br \/>\nvar pitwo = 2*Math.PI; \/\/ pi * 2 for drawing circles<br \/>\nvar sndrop = [] \/\/ an array for storing each drawn object<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\" style=\"\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\" style=\"font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;\">\n<p><span class=\"crayon-t\">var<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">initMS<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-c\">\/\/ store the milliseconds since page load<\/span><\/p>\n<p><span class=\"crayon-t\">var<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">pitwo<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">2<\/span><span class=\"crayon-o\">*<\/span><span class=\"crayon-v\">Math<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">PI<\/span><span class=\"crayon-sy\">;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-c\">\/\/ pi * 2 for drawing circles<\/span><\/p>\n<p><span class=\"crayon-t\">var<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">sndrop<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-c\">\/\/ an array for storing each drawn object<\/span><\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table><\/div>\n<\/p><\/div>\n<p><!-- [Format Time: 0.0004 seconds] --><\/p>\n<p>Now we add the drawing code inside our update function we already made:<\/p>\n<p><!-- Urvanov Syntax Highlighter v2.8.38 --><\/p>\n<div id=\"urvanov-syntax-highlighter-6a8380cfdeba1208913205\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-mac print-yes notranslate\" data-settings=\" minimize scroll-mouseover\" style=\" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;\">\n<p><textarea wrap=\"soft\" class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly=\"readonly\" style=\"-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;\"><br \/>\nfunction update(){<br \/>\n    initMS=initMS+1 \/\/increase our timer<\/p>\n<p>    \/\/clear canvas<br \/>\n    ctx.fillStyle=&#8221;#ffffff&#8221;;<br \/>\n    ctx.fillRect(0, 0, w,h);<br \/>\n    ctx.beginPath()<\/p>\n<p>    \/\/ create new drop<br \/>\n    if(initMS%4 == 0){ \/\/ once every 4 frames<br \/>\n        \/\/ create new drop\/snowflake at a random width and add to array<br \/>\n        sndrop.push({posx:Math.random()*w,posy:-10,size:1+Math.floor(Math.abs(Math.sin(initMS*0.1))*10)})<br \/>\n    }<\/p>\n<p>    ctx.fillStyle=&#8221;#f0f0f0&#8243;; \/\/ set drop colour<\/p>\n<p>    \/\/draw drop falling\/flowwing<br \/>\n    sndrop.forEach(function(item,index){<br \/>\n        ctx.beginPath();    \/\/ start a new drawing path<br \/>\n\t\tctx.arc(item.posx,item.posy,item.size,0,pitwo);         \/\/ draw a filled circle<br \/>\n\t\titem.posx += Math.sin(initMS*0.01) * item.size*0.15 ;   \/\/add hosrizontal  motion<br \/>\n\t\titem.posy += item.size*0.15;    \/\/add vertical motion<br \/>\n\t\tctx.fill(); \/\/ fill the drawn shape(works as endpath)<\/p>\n<p>        \/\/ if item is off screen<br \/>\n\t\tif(item.posy > ((item.size*2)+h)){<br \/>\n            sndrop.splice( index, 1 ); \/\/ removes element at index position<br \/>\n\t\t}<br \/>\n    });<\/p>\n<p>    \/\/ make drop avoid mouse<br \/>\n    sndrop.forEach(function(item,index){<br \/>\n        \/\/is close to mp<br \/>\n        var xdist = (item.posx &#8211; x) \/\/ x distance from mouse<br \/>\n        var ydist = (item.posy &#8211; y) \/\/ y distance from mouse<br \/>\n        var squaredDist = xdist * xdist + ydist * ydist \/\/ squared distance<br \/>\n        var incircl = (squaredDist < 50000) \/\/ is less than roughly 707 squared\n        var invertCircle = (50000 - squaredDist)\/50000 \/\/0-1 range ofr items in 707px range\n\n        \/\/if in range\n        if(incircl){\n            item.posx +=xdist * invertCircle * 0.05 \/\/ move away from mouse\n            item.posy +=ydist * invertCircle * 0.05\n        }\n    });\n}<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\" style=\"\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"urvanov-syntax-highlighter-nums-content\" style=\"font-size: 12px !important; line-height: 15px !important;\">\n<p>1<\/p>\n<p>2<\/p>\n<p>3<\/p>\n<p>4<\/p>\n<p>5<\/p>\n<p>6<\/p>\n<p>7<\/p>\n<p>8<\/p>\n<p>9<\/p>\n<p>10<\/p>\n<p>11<\/p>\n<p>12<\/p>\n<p>13<\/p>\n<p>14<\/p>\n<p>15<\/p>\n<p>16<\/p>\n<p>17<\/p>\n<p>18<\/p>\n<p>19<\/p>\n<p>20<\/p>\n<p>21<\/p>\n<p>22<\/p>\n<p>23<\/p>\n<p>24<\/p>\n<p>25<\/p>\n<p>26<\/p>\n<p>27<\/p>\n<p>28<\/p>\n<p>29<\/p>\n<p>30<\/p>\n<p>31<\/p>\n<p>32<\/p>\n<p>33<\/p>\n<p>34<\/p>\n<p>35<\/p>\n<p>36<\/p>\n<p>37<\/p>\n<p>38<\/p>\n<p>39<\/p>\n<p>40<\/p>\n<p>41<\/p>\n<p>42<\/p>\n<p>43<\/p>\n<p>44<\/p>\n<p>45<\/p>\n<p>46<\/p>\n<\/div>\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\" style=\"font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;\">\n<p><span class=\"crayon-t\">function<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">update<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">{<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">initMS<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">initMS<\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-cn\">1<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-c\">\/\/increase our timer<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-c\">\/\/clear canvas<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">ctx<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e \">fillStyle<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8216;#ffffff&#8217;<\/span><span class=\"crayon-sy\">;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">ctx<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">fillRect<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">w<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-v\">h<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">ctx<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">beginPath<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-c\">\/\/ create new drop <\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">if<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">initMS<\/span><span class=\"crayon-o\">%<\/span><span class=\"crayon-cn\">4<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">==<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-c\">\/\/ once every 4 frames<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-c\">\/\/ create new drop\/snowflake at a random width and add to array<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">sndrop<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">push<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-v\">posx<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-v\">Math<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">random<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">*<\/span><span class=\"crayon-v\">w<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-v\">posy<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-cn\">10<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-v\">size<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-cn\">1<\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-v\">Math<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">floor<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">Math<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">abs<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">Math<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">sin<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">initMS<\/span><span class=\"crayon-o\">*<\/span><span class=\"crayon-cn\">0.1<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">*<\/span><span class=\"crayon-cn\">10<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">}<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">ctx<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e \">fillStyle<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8216;#f0f0f0&#8217;<\/span><span class=\"crayon-sy\">;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-c\">\/\/ set drop colour<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-c\">\/\/draw drop falling\/flowwing<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">sndrop<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-st\">forEach<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-t\">function<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">item<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-v\">index<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">{<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">ctx<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">beginPath<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-c\">\/\/ start a new drawing path<\/span><\/p>\n<p><span class=\"crayon-h\">\t\t<\/span><span class=\"crayon-v\">ctx<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">arc<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">item<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">posx<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-v\">item<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">posy<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-v\">item<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">size<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-v\">pitwo<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-c\">\/\/ draw a filled circle<\/span><\/p>\n<p><span class=\"crayon-h\">\t\t<\/span><span class=\"crayon-v\">item<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">posx<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">Math<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">sin<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">initMS<\/span><span class=\"crayon-o\">*<\/span><span class=\"crayon-cn\">0.01<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">*<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">item<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">size<\/span><span class=\"crayon-o\">*<\/span><span class=\"crayon-cn\">0.15<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">;<\/span><span class=\"crayon-h\">\u00a0\u00a0 <\/span><span class=\"crayon-c\">\/\/add hosrizontal\u00a0\u00a0motion<\/span><\/p>\n<p><span class=\"crayon-h\">\t\t<\/span><span class=\"crayon-v\">item<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">posy<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">item<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">size<\/span><span class=\"crayon-o\">*<\/span><span class=\"crayon-cn\">0.15<\/span><span class=\"crayon-sy\">;<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-c\">\/\/add vertical motion<\/span><\/p>\n<p><span class=\"crayon-h\">\t\t<\/span><span class=\"crayon-v\">ctx<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">fill<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-c\">\/\/ fill the drawn shape(works as endpath)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-c\">\/\/ if item is off screen<\/span><\/p>\n<p><span class=\"crayon-h\">\t\t<\/span><span class=\"crayon-st\">if<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">item<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">posy<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">><\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">item<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">size<\/span><span class=\"crayon-o\">*<\/span><span class=\"crayon-cn\">2<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-v\">h<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">{<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">sndrop<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">splice<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">index<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">1<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-c\">\/\/ removes element at index position<\/span><\/p>\n<p><span class=\"crayon-h\">\t\t<\/span><span class=\"crayon-sy\">}<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-c\">\/\/ make drop avoid mouse<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">sndrop<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-st\">forEach<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-t\">function<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">item<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-v\">index<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">{<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-c\">\/\/is close to mp<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-t\">var<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">xdist<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">item<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">posx<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-c\">\/\/ x distance from mouse<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-t\">var<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">ydist<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">item<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">posy<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">y<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-c\">\/\/ y distance from mouse<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-t\">var<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">squaredDist<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">xdist<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">*<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">xdist<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">ydist<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">*<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">ydist<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-c\">\/\/ squared distance<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-t\">var<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">incircl<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">squaredDist<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\"><<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">50000<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-c\">\/\/ is less than roughly 707 squared<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-t\">var<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">invertCircle<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-cn\">50000<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">squaredDist<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">\/<\/span><span class=\"crayon-cn\">50000<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-c\">\/\/0-1 range ofr items in 707px range<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-c\">\/\/if in range<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">if<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">incircl<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">{<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">item<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">posx<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+=<\/span><span class=\"crayon-v\">xdist<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">*<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">invertCircle<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">*<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">0.05<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-c\">\/\/ move away from mouse<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">item<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">posy<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+=<\/span><span class=\"crayon-v\">ydist<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">*<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">invertCircle<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">*<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">0.05<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">}<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;<\/span><\/p>\n<p><span class=\"crayon-sy\">}<\/span><\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table><\/div>\n<\/p><\/div>\n<p><!-- [Format Time: 0.0042 seconds] --><\/p>\n<p>\u00a0<\/p>\n<p><a rel=\"nofollow\" target=\"_blank\" href=\"https:\/\/webgl.gamedevelopment.blog\/snowdrop.html\">View it in action<\/a><\/p>\n<p><a rel=\"nofollow\" target=\"_blank\" href=\"https:\/\/webgl.gamedevelopment.blog\/bgcan_snowdropbg.js\">View Source Code<\/a> or check out some other effects <a rel=\"nofollow\" target=\"_blank\" href=\"https:\/\/webgl.gamedevelopment.blog\/bgcammenu.html\">here<\/a> with links to source code<\/p>\n<p>If you like javascript you could try <a rel=\"nofollow\" target=\"_blank\" href=\"https:\/\/www.gamedevelopment.blog\/matter-js-basics-developing-games\/\">JSMatter<\/a> which is a physics engine for javascript<\/p>\n<p>\n\t\t\t\t<span class=\"post-views-icon dashicons dashicons-chart-bar\"\/> <span class=\"post-views-label\">Views:<\/span> <span class=\"post-views-count\">10,426<\/span>\n\t\t\t<\/p>\n<p class=\"dpsp-share-text \" style=\"margin-bottom:10px\">\n\t\tSharing is caring!\t<\/p>\n<\/p><\/div>\n<p><br \/>\n<br \/><a href=\"https:\/\/www.gamedevelopment.blog\/using-javascript-and-html-canvas-to-make-animated-interactive-backgrounds\/\">Source link <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Sharing is caring! What is a canvas? A canvas is similar to a real life&#8230;<\/p>\n","protected":false},"author":1,"featured_media":433,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[920],"tags":[],"class_list":["post-432","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-life-stream"],"_links":{"self":[{"href":"https:\/\/x.sheep-mine.ts.net\/index.php\/wp-json\/wp\/v2\/posts\/432","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/x.sheep-mine.ts.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/x.sheep-mine.ts.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/x.sheep-mine.ts.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/x.sheep-mine.ts.net\/index.php\/wp-json\/wp\/v2\/comments?post=432"}],"version-history":[{"count":0,"href":"https:\/\/x.sheep-mine.ts.net\/index.php\/wp-json\/wp\/v2\/posts\/432\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/x.sheep-mine.ts.net\/index.php\/wp-json\/wp\/v2\/media\/433"}],"wp:attachment":[{"href":"https:\/\/x.sheep-mine.ts.net\/index.php\/wp-json\/wp\/v2\/media?parent=432"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/x.sheep-mine.ts.net\/index.php\/wp-json\/wp\/v2\/categories?post=432"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/x.sheep-mine.ts.net\/index.php\/wp-json\/wp\/v2\/tags?post=432"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}