Nach der 2011 gebauten Canvas Draw-Demo sowie der 2012er Ball Pool (Play Circles) Demo, hier die März 2013-Umsetzung einer Idee, ersteres um mehr Dynamik und Interaktivität zu erweitern.
Demo: Magic Circles
In "Magic Circles" geht es darum, der Bewegung der Maus, zufallsgenerierte Kreise verfolgen zu lassen. Diese akstrakte, bunten Kreise werden basieren auf HTML5's Canvas-Technik, welche mittels JavaScript gesteuert wird.
HTML5 Canvas
Canvas ist ein HTML-Element, welches mit HTML5 eingeführt wurde und für WebKit entwickelt wurde. Derzeit unterstützen alle modernen Browser diese Technik. Neben Kreisen können sämtliche Formen und Kursen sowie Farbverläufe und Grafiken erzeugt werden. Demo läuft am besten im Chrome-Browser.
Quellcode
script.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 |
$(document).ready(function() { refreshWebsite(); linkify(); }); $(window).resize(function(){ $('canvas').remove(); refreshWebsite(); }); function refreshWebsite() { var ctx, r, maxR, line, speed, opacity, circles = [], counter = 1, drawInterval, time, colorblackwhite=false, headerHeight = $('header').height(), color = ['0,154,174', '0,188,86', '182,30,0', '255,220,36']; /* creating Canvas */ var canvas_width = window.innerWidth; var canvas_height = window.innerHeight - $('header').height() - $('footer').height(); $('footer') .before('<canvas height="'+canvas_height+'" id="canvasbg" width="'+canvas_width+'"></canvas>') .before('<canvas height="'+canvas_height+'" id="canvas" width="'+canvas_width+'"></canvas>'); /* header menu click event */ $('#infosArea').hover(function() { $('#infos').stop().slideToggle(200); }, function() { $('#infos').stop().slideToggle(200); }); $('#canvas').mousemove(function(e) { draw(e); }); $('#control a').click(function() { if(colorblackwhite == true) { $('body').css('background', '#fff'); colorblackwhite = false; } else { $('body').css('background', '#000'); colorblackwhite = true; } return false; }); ctx = $('#canvas')[0].getContext("2d"); ctxBg = $('#canvasbg')[0].getContext("2d"); changeInterval(); time = new Date().getTime() / 1000; init(); function init() { setInterval(draw, 1000/60); }; /* main draw function for each frame*/ function draw(e) { if(typeof(e) != 'undefined') { var timeNow = new Date().getTime() / 1000; if(timeNow - time > 1/100) { time = timeNow; var circle = new Circle(); generateNewValues(circle); circle.x = e.pageX; circle.y = e.pageY - headerHeight; circle.maxR = getRandom(10,30); circles.push(circle); } } else { clear(ctx); if(counter % drawInterval == 0) { var circle = new Circle(); generateNewValues(circle); circles.push(circle); if(counter >= 180) { // 60 frames = 1 sekunde changeInterval(); counter = 0; } } counter++; $.each(circles, function(key, obj) { if(typeof(obj) != 'undefined') { obj.r *= obj.speed; if(obj.r > obj.maxR) { obj.r = obj.maxR; obj.opacity *= obj.opacityLower; } if(obj.opacity < 0.1) { obj.opacity = 0.05; drawCircle(obj, ctxBg, true); while (circles.indexOf(obj) !== -1) { circles.splice(circles.indexOf(obj), 1); } } else { drawCircle(obj, ctx); } } }); } } function changeInterval() { drawInterval = getRandom(5,25); } function clear(context) { context.clearRect(0, 0, canvas_width, canvas_width); } /* * x = X-Coordinate * y = Y-Coordinate * r = radius*2, width * o = lineWidth of outer border, percent % of new radius * outerColor = color of outer border * fillStatus = (boolean) fill * fillColor = color of inner background */ function drawCircle(obj, context, isCanvasBg) { if(typeof(isCanvasBg) === 'undefined') isCanvasBg=false; //if(isCanvasBg) //context.restore(); context.beginPath(); context.shadowBlur = 10; context.shadowColor = 'rgba(' + obj.outerColor + ',1)'; context.arc(obj.x, obj.y, obj.r, 0, Math.PI*2, true); if(obj.fillStatus) { var innerOpacity = obj.opacity * 0.1; if(colorblackwhite && !isCanvasBg) innerOpacity *= 4; context.fillStyle = 'rgba(' + obj.fillColor + ',' + innerOpacity + ')'; context.closePath(); context.fill(); } context.lineWidth = obj.r * obj.line; context.strokeStyle = 'rgba(' + obj.outerColor + ', ' + obj.opacity * 1.0 + ')'; context.stroke(); //if(isCanvasBg) //context.save(); } function getRandom(min, max) { if(min > max) { tmp = max; max = min; min = tmp; } if(min == max) { return min; } var r; do { r = Math.random(); } while(r == 1.0); return min + parseInt(r * (max-min+1)); } function generateNewValues(obj) { obj.x = getRandom(0,canvas_width); /* random += bis max 20 oder -= bis max 20 in 1-steps */ obj.y = getRandom(0,canvas_height); /* random += bis max 20 oder -= bis max 20 in 1-steps */ obj.r = getRandom(1,40); /* random betweem 2 and 40, in 1-steps */ obj.line = getRandom(3,20)/1000; /* random between 0.006 and 0.031, in 0.003-steps*/ obj.speed = getRandom(102,112)/100; /* random between 1.02 and 1.12 */ obj.maxR = getRandom(40,80); /* random between 30 and 150 */ obj.opacity = getRandom(90,100)/100; /* random between 0.7 and 1 */ obj.opacityLower = getRandom(960,990)/1000; /* between 0.91 and 0.96 */ obj.fillColor = (getRandom(0,6) > 1) ? getRandom(0,155)+','+getRandom(0,255)+','+getRandom(0,255) : color[getRandom(0, color.length-1)]; /* mostly random color without red or random key for predefined color */ obj.fillStatus = (getRandom(0,6) == 1) ? false : true; /* random true or false, mostly true */ obj.outerColor = (getRandom(0,6) > 1) ? getRandom(0,55)+','+getRandom(0,155)+','+getRandom(0,155) : color[getRandom(0, color.length-1)]; /* mostly random color without red or random key for predefined color */ } function Circle() { this.x; this.y; this.r; this.line; this.speed; this.maxR; this.opacity; this.opacityLower; this.fillColor; this.fillStatus; this.outerColor; } } function linkify() { var supports3DTransforms = document.body.style['webkitPerspective'] !== undefined || document.body.style['MozPerspective'] !== undefined; function linkify( selector ) { if( supports3DTransforms ) { var nodes = document.querySelectorAll( selector ); for( var i = 0, len = nodes.length; i < len; i++ ) { var node = nodes[i]; if( !node.className || !node.className.match( /roll/g ) ) { node.className += ' roll'; node.innerHTML = '<span data-title="'+ node.text +'">' + node.innerHTML + '</span>'; } } } } linkify('#control a'); } |