マウスイベントが飛んでくるのはいい。だが、canvasにおいて、座標系がまるで使い物にならない。DOM level 2、level 3のEventにおける定義では、screenX/Yと、clientX/Yが使える。screenのコンピューターの画面全体における座標なので、あまり必要ない。clientの方は、ブラウザのウインドウ全体における座標だ。
欲しいのは、そのマウスイベントが発生したElement上での相対座標だ。これを求める方法は、W3Cの規格だけでは実装できない。
あるElementの左上の座標を求めるプロパティはある。しかし、そのElementの親Elementからの相対座標なので、結局、bodyまでさかのぼらなければならない。激しく面倒だ。
前回のcanvasを使ったコード、どうしてもすべてのブラウザをサポートする、workaroundの無いコードがかけない。現在、Operaでうまく動かない。どうも、Operaでは、ScrollTopやScrollLeftが0を返す。ベータバージョンを使っているからだろうか。とにかくブラウザ間の互換性の無さにだけはあきれ返る。
とりあえず、マウスイベントのclientXとclientYを、relativeな座標に直す関数を書いてみた。
function computeRelativePosition(event) { var ret = { x : event.clientX, y : event.clientY + document.body.scrollTop } ; for ( var p = event.target ; p !== null ; p = p.offsetParent ) { ret.x -= p.offsetLeft ; ret.y -= p.offsetTop ; } return ret ; } ;
No comments:
Post a Comment
You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.