No.12 マウスをクリックダウンした時の動作
03 レイヤー確定ルーチン
 
 さて、現在マウスが置かれている場所が、何らかのレイヤーの検知範囲内にあるかどうかは、前ページのスクリプトによってチェックできました。 しかし、マウスがレイヤーの検知範囲内にあるからといって、必ずしもレイヤー確定となるわけではありません。


レイヤー確定にならない場合の例

 それは、上図のように、レイヤー検知範囲の上に、別のレイヤーが存在している場合等が考えられるからです。
 このレイヤー判定アルゴリズムについて、少し詳しく解説しましょう。

 マウスの座標は、画面の左上からの位置を検出する「絶対座標」と、レイヤーからの位置を検出する「相対座標」の2種類が存在します。



 上記の例にあるように、マウスの絶対座標は、マウスの相対座標とレイヤーの座標を足し合わせた値に等しいということが分かります。
 ということはつまり、レイヤーの検知範囲内にマウスがあるかどうかをチェックするには、この計算結果が「0」になるかどうかを判定すればよいわけです。

 さて、マウスの相対座標ですが、「レイヤーの相対座標」であることから、常に、最も上にあるレイヤーから相対座標を算出するという性質があります。



 つまり、検知したレイヤーの上にさらに別のレイヤーが存在していた場合、マウスの相対座標は上にあるレイヤーの位置を「0」とする相対座標として計算されることになります。
 結果として、レイヤーの相対座標は上図にあるとおり、黒のレイヤーからの相対位置からは異なる結果となり、検知したレイヤーの上に別のレイヤーが存在し、且つ、マウスはその上のレイヤー上にあることを判定できる事が分かります。

判定式用数値の作成  「Line 528〜537」



 さて、では具体的にスクリプトを解説しましょう。

「Line 528〜537」


  var Hosei = 0;
  if (isIE5 || isIE6){
    if (isWin) Hosei = 4; //Win IE
    if (isMac) Hosei = 1; //Mac IE
    var CheckX = mouseX - window.event.offsetX - nowX - Hosei;
    var CheckY = mouseY - window.event.offsetY - nowY - Hosei;
  } else if(isNS4 || isNS6){
    var CheckX = mouseX - myEvents.layerX - nowX ;
    var CheckY = mouseY - myEvents.layerY - nowY ;
  }

 先ほどの計算式の結果は、スクリプト上で「 checkX 」「 checkY 」として与えられます。この値が「0」であれば、マウスはれイヤーの上にありますし、それ以外の数値であれば、レイヤーの上に別のレイヤーが存在していることになります。
 さて、先ほどの説明で、「マウスの相対位置+レイヤーの座標=マウスの絶対座標」としましたが、この数値はIEに関しては若干の補正が必要になります。 それは、IEの場合、絶対座標との合計値に若干のずれがある点です。 (恐らくは絶対座標のスタート位置の問題だと思うのですが) ですから、この誤差を補正するために、IEに限り、補正情報を負荷する必要があります。

「Line 528〜533」


  var Hosei = 0;
  if (isIE5 || isIE6){
    if (isWin) Hosei = 4; //Win IE
    if (isMac) Hosei = 1; //Mac IE
    var CheckX = mouseX - window.event.offsetX - nowX - Hosei;
    var CheckY = mouseY - window.event.offsetY - nowY - Hosei;

 数値誤差は、WindowsとMacで異なるため、ブラウザ毎の差異データを、「 Hosei 」変数へ格納しています。

安全マージンを取る  「Line 540」



「line 540」



  if ( CheckX ≤= Math.abs(LayerMargin) && CheckX >= LayerMargin && 
            CheckY <= Math.abs(LayerMargin) && CheckY >= LayerMargin){ 

 検知範囲を厳密に定めるのであれば、
   if (CheckX + CheckY == 0 ) {
 とすれば良いのですが、万一、こちらでチェックしていないブラウザで、IEのような表示差異が発生した場合、厳密な数値だと動作しなくなってしまうため、± layerMargin 分の余裕を見てチェックを行っています。
 チェックに用いる「LayerMargin」値は、製作者が任意の数値をマイナス値で割り当てることが出来ますが、この数値で 「 ± 」を算出しなくてはならないので、
  Math.abs(LayerMargin)
 を用いて、絶対値を算出して計算式に当てはめています。



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