No.06 マウスイベントの概念と動作例
04 MouseMove の利用 - 絶対座標と相対座標
 
 MouseMove は、マウスの現在位置を返すことが出来ます。 情報はマウスが1ポイントでも移動した時点でファンクションが呼び出されますので、事実上のリアルタイムと考えて差し支えありません。 リアルタイムで動作するということは、若干ブラウザとCPUの性能に左右されることになりますが、現在普及しているPentiumII 300Mhz クラスのパソコンであれば、動作には支障はないようです。
 さて、マウスから取り出される情報ですが、これはIEとNSによって全く異なってきます。
 これまでのスクリプト分岐は、「 IE5、NS6 」と「NS4」でしたが、このマウスの座標取得に関してはブラウザの癖が強いので、「 IE5 」と「 NS6、NS4」の分岐となります。 また、座標情報の取得も、ブラウザによってかなり異なってきますので、ここで順を追って説明していくことにしましょう。


絶対座標と相対座標
 マウスの座標取得では、その数値がどのような意味を成しているか、それを決めなくてはなりません。 絶対座標と相対座標の関係もそのひとつで、通常の使用に関してはまだそれほど問題視されない部分ですが、レイヤーを用いた作業の場合、この違いは決定的になります


絶対座標と相対座標

 絶対座標の場合、マウスの数値は必ず左上の画面位置を「ゼロ」とし、そこからの位置をマウスの現在位置として算出します。 一方相対位置は、現在のアクティブになっているウインドウからの位置を返してきます。 右図の場合、Webサイト上の100*150の位置にレイヤーが存在しているので、そのレイヤーのトップ位置を「ゼロ」とした値が、マウスの値となります。

 絶対位置、相対位置ともに、使用する箇所によって用途を使い分けていくものですが、ことウインドウ上でのレイヤー操作となると、相対座標では決定的な欠点が発生します。 それは、現在位置がWebサイト上のマウスの位置なのか、レイヤー上の位置なのかを判定することができない事で、マウスの位置を規定することが不可能になってしまうわけです。
 今回の講座では、マウスの位置は絶対座標で用いることにします。これは、この講座の最終目標が、レイヤーを用いたインタラクティブサイト構築にあるから二歩かなりません。


IEにおける絶対座標の算出
 IEでは、一般的には「event.x」「event.y」というメソッドを用います。 このメソッドは非常に便利で、

  var mouseX = event.x
  var mouseY = event.y
 と、一般変数に代入するだけで使用することが出来ますが、反面、このメソッドは「絶対座標」「相対座標」のどちらか一方しか算出できないという欠点があります。 しかも、絶対座標を用いるか、相対座標を用いるかは製作時の設定によって如何様にも変わってしまうので、結果として動作が不安定になりがちになります。 というわけで、ここでは絶対座標を返すオブジェクトである
  window.event.clientX
  window.event.clientY
 を用いることにしています。 クライアント側の絶対座標を算出してくれるので、このオブジェクトを用いれば、ユーザーの設定によって左右される心配はなくなります。
 ただし、このは、常に開かれているWebページの一番上の座標を「ゼロ」とするため、スクロールバーなどで、ページの位置をずらしている場合等は、値が結果としてずれてくることになります。
 このため、IEではこういった差異を解消するためのオブジェクトとして、
  document.body.scrollLeft
  document.body.scrollTop
 が与えられています。 このオブジェクトは、スクロールバーの縦、横をどれだけずらしたかをピクセルデータで返すことが可能で、つまり、
  mouseX = window.event.clientX + document.body.scrollLeft;
  mouseY = window.event.clientY + document.body.scrollTop ;
 とすることで、画面上の必要な絶対座標を得ることが出来るということになります。


NSにおける絶対座標の算出
 一方、NSでは、IEのような面倒な値の算出は必要なく、単純にページのX座標とY座標を代入することで数値を取り出すことが出来ます。
  mouseX = myEvents.pageX;
  mouseY = myEvents.pageY;
 「 myEvents 」は、前ページで解説している通り、「 function mousemove(myEvents) 」で受け渡しされる、マウスデバイスの入力信号のパスになります。
 NSの場合は、スクロールバーを移動させるとそれに伴って値が自動で追加されるので、特に算出結果を足し合わせる必要などはありません。


マルチブラウザでの対応
 さて、マルチブラウザでの対応の場合は、条件分岐を用いてファンクション化すると扱いやすくなります。

  function NowMouseLocation(myEvents){
    if (isIE4){
      mouseX = window.event.clientX + 
                      document.body.scrollLeft; 
      mouseY = window.event.clientY + 
                      document.body.scrollTop ;
    }else if(isNS6 || isNS4) {
      mouseX = myEvents.pageX;
      mouseY = myEvents.pageY;
    }
  }
	
 こうすることで、IE5、NS4、NS6 において、「 mouseX , mouseY 」に、絶対座標を代入することが可能になります。


補足:相対座標の求め方
 今回のスクリプトでは用いませんが、相対座標を算出するには、下記の方法を用いると良いでしょう。

  function NowMouseLocation(myEvents){
    if (isIE4){
      mouseX = window.event.offsetX
      mouseY = window.event.offsetY
    }else if(isNS6 || isNS4) {
      mouseX = myEvents.layerX;
      mouseY = myEvents.layerY;
    }
  }
	

 相対座標の算出時は、表記形式の違いこそあれ、ブラウザ間での算出方法そのものには違いはありません。
 IEの場合はoffsetX、offsetYが、NSの場合はlayerX、layerYが、相対座標算出に使うメソッドになります。

 絶対座標と相対座標を組み合わせることによって、例えば、ページの縦横サイズを変更した際にフレキシブルに配置を変更するといった行動をページ上で行うことも可能になります。

ページの最上段へ移動します