|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
イベント発生座標の取り方は、[ 初心者 ] - [ イベント ]で簡単に説明してあります。
■基本 IE、Netscape系共通 (event).clientX、(event).clientY、(event).screenX、(event).screenY
clientX、clientY は ブラウザの現在のドキュメント表示ウィンドウの中での screenX、screenY は ビジターのモニターでの 左からの位置(X)、上からの位置(Y) です。モニターの左上の角の隅が screenX =0、screen = 0 の位置。
これらのプロパティの値は数値型(number)の数字となります。
サンプルソース:
document.onclick = function(e){ var evt = window.event || e; alert(evt.clientX); alert(evt.clientY); } さて、特殊なサービスなどスクロールをオフ、強制リサイズにしてるウィンドウならコレで良いのですが、 現実的にそのイベントの発生場所に何かを表示させたりする場合は、 ウィンドウ内のポイントだけでなくドキュメントの上からの位置、左からの位置が必要になります。 この場合は scrollTop、scrollLeftを加味して現実的なドキュメント上の座標を割り出す必要があります。 実際にスクロールを強制オフにしていたり、ウィンドウを強制リサイズさせてる場合外は、 ビジターがどのウィンドウサイズで見てるかわからないので必ずこのスクロール幅を取るようにしておきます。 ■現実的な座標取得スクロール幅 + ウィンドウ内座標 がドキュメント上の座標になります。
サンプルソース:
この例ではクリックが発生した時のドキュメント上のカーソル座標がLeft、Topにはいります。
何かを表示させる場合position:absoluteのエレメントの style.top、style.leftをこの値にすれば良いわけです。document.onclick = function(e){ var evt = window.event || e; var D1 = document; var Left= evt.clientX +(D.body.scrollLeft||D.documentElement.scrollLeft)+'px'; var Top= evt.clientY +(D.body.scrollTop||D.documentElement.scrollTop)+'px'; }
さて、ココで注意しないといけないのが HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"
この場合は、新しいブラウザなら documentElementの方だけでも良さそうですが、 Safariが駄目なのでやはり両方から取れるようにしておく必要があります。 DOCTYPEが 無い場合 (テスト用コーディングなど)
この場合は document.body の方を使えば全てに通用します。 が、公開ページであればDOCTYPEをつけるべきですので、テスト時のみですね。 DOCTYPEがXHTMLの場合 <?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" > <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
やはりこの場合も両方から取れるようにしておく必要があります。 サンプル紹介や有名なJSライブラリツールなどでも、この両方から取る事を前提にしてないケースもあります。 DOCTYPEとブラウザとの関係で色々変ってくるので、常に両方を見て取るようにしておく方がトラブルが起きにくくなると思います。
サブメニューを表示したり、何らかをレイアウトにあわせてオーバーラップさせる時には カーソルの位置ではなく、そのイベントが発生したエレメントの位置(左上)を取りたい場合があります。 サブメニューもカーソルの位置でちまちま動くよりは、いつもゞ場所にすっきり出したいですしね。 こういう時にはイベント発生座標ではなく、イベント発生エレメントを特定して そのレイアウト上の位置を取り出す必要があります。(完全固定レイアウトなら不要) 例を簡単に書くと
document.onclick = function(e){ //※1
と、こんな感じになります。var el = window.event? event.srcElement : e.target; //※2 if(el.id == 'AAA'){ //※3 var elm = el, X=0, Y=0; //※4 while(elm){ //※5 X += elm.offsetLeft; Y += elm.offsetTop; elm = elm.offsetParent; //※ルートの親 } } 解説 ※1 ドキュメント全体のクリックを監視 ※2 イベント発生エレメントを取得 ※3 そのエレメントのIDが 'AAA' なら位置取得 ※4 エレメントelを別の捨て変数elmに代入。XとYの数値を0で定義。 ※5 while内は、そのエレメントから親エレメントまでのオフセットを取りX、Yに加算。 次に変数elmに親エレメントを代入。 これを親が居なくなるまで、つまりBODYエレメントにぶつかるまで繰り返すと、 ウィンドウでのオフセット位置が取れます。 状況に応じてイベントや、位置を取りたいエレメントのクラス名マッチに変えたりして 自分が欲しいエレメントの位置を取ります。 これでXとYにそのエレメントのドキュメント上の座標が入ります。 座標はエレメントの左上角を指しますので、あとはエレメントのoffsetWidth、offsetHeightなどを取れば 左に合わせる、下にあわせるなど自由自在です。 ちょっとスクリプトの流れの方法論が違いますが こちらにサンプルがあります。 こんな感じで、イベント座標を取ったりイベント発生場所のエレメントの座標を取って便利に使います。 位置が取れると言うのは動的レイアウトなどの仕掛けをする時にはとても大事です。 頑張って自分で0から書いてみてください。 |
専用ページから申し込むと So-netより高い3万円CB
案ずるより産むが易し
使ってみれば疑問も解決 XREA+ (plus) 206円/月 ( お試し7日間 ) CORE SERVER 428円/月 ( お試し15日間 ) ロリポップ 270円/月 ( お試し期間10日間 ) ヘテムル 1620円/月 ( お試し期間15日間 ) さくら 129円/月 ( お試し期間2週間 ) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
【 PR 】 楽天カード入会でもれなく2000pt(2000円相当)が無料プレゼント さらに
ENEOSでの給油はポイント2倍! ネットでも日常でもお得な生活 【 PR 】
|