var oO = { //SVG namespace ns: 'http://www.w3.org/2000/svg', //Elements on page cont: null, docbody: null, svg: null, canvas: null, cover: null, //Adjustment of mouse position depending on window size, margins etc. offsetX: 0, offsetY: 0, getOffset: function (foo) { var curleft = 0; var curtop = 0; for (var obj = foo; obj !== null; obj = obj.offsetParent) { curleft += obj.offsetLeft; curtop += obj.offsetTop; } oO.offsetX = curleft; oO.offsetY = curtop; }, //Current mouse position relative to the #canvas currentpos: { x: 0, y: 0 }, //Boolean to determine whether to convert mouse movement to drawing or not drawing: false, //Stores the Interval we use while drawing drawping: null, killDrawing: function () { oO.drawing = false; clearInterval(oO.drawping); oO.drawping = null; }, //Fired about a hundred times a second, draws random color/size circles drawSprinkles: function () { //Create requires namespace, but setting attributes does not. var circ1 = document.createElementNS(oO.ns, 'circle'); circ1.setAttribute('cx', oO.currentpos.x); circ1.setAttribute('cy', oO.currentpos.y); circ1.setAttribute('r', Math.ceil(10 * Math.random())); circ1.setAttribute('stroke', "#000000"); circ1.setAttribute('stroke-opacity', "0"); circ1.setAttribute('stroke-width', "1"); var rgbval = "rgb(" + Math.floor(255 * Math.random()) + "," + Math.floor(255 * Math.random()) + "," + Math.floor(255 * Math.random()) + ")"; circ1.setAttribute('fill', rgbval); oO.svg.appendChild(circ1); } }; $(function () { oO.cont = document.getElementById('djw-cont'); oO.docbody = $(oO.cont).closest('body')[0]; //Fixed div for debugging oO.debug = document.getElementById('djw-debug'); //Track whether the mouse button is depressed or not. oO.mouseDown = 0; oO.docbody.onmousedown = function () { oO.mouseDown = 1; $(oO.debug).css('background-color', 'palegoldenrod') }; oO.docbody.onmouseup = function () { oO.mouseDown = 0; $(oO.debug).css('background-color', 'white'); oO.killDrawing(); }; //If we mouseover the body it means we have left the canvas, so trigger mousebutton release. oO.docbody.onmouseover = function (event) { if (!event) event = window.event; if (oO.mouseDown == 1) { oO.mouseDown = 0; } oO.killDrawing(); }; //Append SVG element to #canvas div. oO.svg = document.createElementNS(oO.ns, 'svg'); oO.svg.setAttribute('width', "100%"); oO.svg.setAttribute('height', "100%"); oO.canvas = document.getElementById('djw-canvas'); oO.canvas.appendChild(oO.svg); oO.cover = document.getElementById('djw-cover'); //When mouse enters #canvas, get offset in preparation for drawing. oO.cover.onmouseover = function (event) { if (!event) event = window.event; oO.getOffset(this); }; //When the mouse is depressed, enable drawing oO.cover.onmousedown = function (event) { if (!event) event = window.event; event.cancelBubble = true; if (event.stopPropagation) event.stopPropagation(); event.preventDefault(); oO.mouseDown = 1; oO.drawing = true; if (!oO.drawping) { oO.drawping = setInterval(oO.drawSprinkles, 20); } }; //When mouse leaves canvas, quit drawing oO.cover.onmouseout = function (event) { if (!event) var event = window.event; var reltg = (event.relatedTarget) ? event.relatedTarget : event.toElement; while (reltg.tagName != 'BODY'){ if (reltg.getAttribute('id') == this.getAttribute('id')){ return false; } reltg = reltg.parentNode; } oO.mouseDown = 0; //alert('mouse is out!') oO.killDrawing(); }; //When mouse is released on canvas, quit drawing oO.cover.onmouseup = function (event) { if (!event) event = window.event; oO.mouseDown = 0; //alert('mouse is up!') oO.killDrawing(); }; //If drawing is enabled, update the mouse position oO.cover.onmousemove = function (event) { if (!event) var event = window.event; /* var tg = (window.event) ? event.srcElement : event.target; if (tg.nodeName != 'DIV') return; var reltg = (event.relatedTarget) ? event.relatedTarget : event.toElement; while (reltg != tg && reltg.nodeName != 'BODY') reltg= reltg.parentNode if (reltg== tg) return; // Mouseout took place when mouse actually left layer // Handle event */ oO.currentpos.x = event.pageX - oO.offsetX; oO.currentpos.y = event.pageY - oO.offsetY; oO.debug.innerHTML = 'x: ' + event.pageX + ' - ' + oO.offsetX + ' = <b>' + oO.currentpos.x + '</b>, y:' + event.pageY + ' - ' + oO.offsetY + ' = <b>' + oO.currentpos.y + '</b>'; }; });
<div id="djw-cont"> <div id="djw-controls"></div> <div id="djw-canvas"></div> <div id="djw-cover"></div> </div> <div id="djw-debug"></div>
#djw-debug { position: fixed; width: 500px; height: 50px; bottom: 0px auto; left: 0px; } #djw-cont { position: relative; width: 500px; height: 400px; margin: 10px auto; outline: 1px dashed #ccc; } #djw-controls { position: absolute; width: 50px; height: 400px; top: 0px; left: 0px; background-color: #eee; } #djw-canvas { position: absolute; width: 450px; height: 400px; top: 0px; left: 50px; background-color: whitesmoke; } #djw-cover { position: absolute; width: 450px; height: 400px; top: 0px; left: 50px; background-color: transparent; background-image: url('http://www.davidjohnwelsh.com/img/clearbg.png'); cursor: crosshair; }