マウスの要素内座標が取れるようになったので、簡単な例を一つ。
function getElementAbsPos(elem) { var x = 0; var y = 0; while(elem){ x += elem.offsetLeft; y += elem.offsetTop; elem = elem.offsetParent; } return {x:x, y:y}; } function getMousePosOnElement(elem, ev) { if(!ev){ ev = event;}//for IE if(elem.getBoundingClientRect){ var bcr = elem.getBoundingClientRect(); var x = ev.clientX - bcr.left; var y = ev.clientY - bcr.top; return {x:x, y:y}; } else if(typeof(ev.pageX) == "number" && typeof(ev.pageY) == "number"){ var pos = getElementAbsPos(elem); return {x:ev.pageX-pos.x, y:ev.pageY-pos.y}; } else{ return {x:0, y:0}; } } var BORDER_WIDTH = 10; var cv = document.createElement("canvas"); cv.setAttribute("width", "320"); cv.setAttribute("height", "240"); cv.style.cssText = "border: "+BORDER_WIDTH+"px solid;"; document.body.appendChild(cv); var lastPoint = null; cv.onmousedown = function(ev) { lastPoint = getMousePosOnElement(cv, ev); lastPoint.x -= BORDER_WIDTH; lastPoint.y -= BORDER_WIDTH; } cv.onmousemove = function(ev) { if(lastPoint){ var currPoint = getMousePosOnElement(cv, ev); currPoint.x -= BORDER_WIDTH; currPoint.y -= BORDER_WIDTH; var ctx = cv.getContext("2d"); ctx.beginPath(); ctx.moveTo(lastPoint.x, lastPoint.y); ctx.lineTo(currPoint.x, currPoint.y); ctx.stroke(); lastPoint = currPoint; } } cv.onmouseup = function(ev) { lastPoint = null; } cv.onmouseout = function(ev) { lastPoint = null; }
例によってインタラクティブコンソールへ貼り付けて実行可能。
getMousePosOnElementより上は昨日書いたとおり。
borderを太くするとその分座標がずれてしまうので、そのあたりは適切に補正してやる必要がありました。