ball_bl.gif

オブジェクトのドラッグ実験

    左のボールをマウスでドラッグしてください。
ボールをマウスでズルズルと引きずる(ドラッグ)することができるのです。マウスボタンを離せば、その位置にボールを置くことができます。JavaScriptでもこんなことができるのです。

ここでは、オブジェクトをドラッグする方法を実験します。オブジェクトとして爆弾ゲームで使った爆弾(ボール)をドラッグできるようにしましょう。
なお、ブラウザはWindows用のIE4.0以降、NN4.0以降を目指しています。・・・が、IE6、NN7しか確認できていません。NNでは少々おかしな動きをすることもありますが、勘弁してください。。。


以前に、画像をウィンドウの自由な位置にスクリプトで移動させる実験を行いました。(爆弾投下ゲーム、爆弾発射ゲーム、ヨーヨーの実験など参照)
また、マウスポインタの位置情報の取得も実験しました。(マウスポインタ座標表示など)
この二つを組み合わせれば、オブジェクトをドラッグできるのではないか・・・ということで以下のような実験をしました。

1.オブジェクトをマウスポインタに追従させる

ドラッグの準備として、オブジェクトをマウスポインタに追従させます。
IEの場合、以下のようにオブジェクトの位置プロパティ(style.left および style.top)にマウスポインタの位置情報(event.x および event.y)を代入すると、オブジェクトはマウスポインタの動きに追従させることができます。なお、作成した関数はマウス移動時に発生するイベント(onmousemove)で駆動されるようにしておきます。以下のコードを参照してください。
function drag() {
  document.getElementById("Ball").style.left = event.x;
  document.getElementById("Ball").style.top = event.y;
}
document.onmousemove = drag;
マウス追従の実験 ←IE5.0以降のブラウザで上記の実験ができます。

2.ドラッグの実験

マウスによるボールのドラッグを実現するために、画像をドラッグ中にのみ画像をマウスに追従するように工夫します。
DragFlgと呼ぶ変数を設けて、フラグが立っているときだけマウスに画像を追従させるようにしましょう。マウスがクリックされたとき(onmousedown)にフラグを立て、マウスボタンが離されたとき(onmouseup)にフラグを下ろすようにします。なお、ドラッグ中の関数の最後にreturn false;の「おまじない」を入れてください。
var DragFlg = 0;
function dragStart() {
  DragFlg = 1;
}
function dragEnd() {
  DragFlg = 0;
}
function drag() {
  if (DragFlg == 0) return;
  document.getElementById("Ball").style.left = event.x;
  document.getElementById("Ball").style.top = event.y;
  return false;
}
document.onmousedown = dragStart;
document.onmouseup = dragEnd;
document.onmousemove = drag;
ドラッグの実験 ←IE5.0以降のブラウザで上記の実験ができます。

3.オブジェクトとマウスポインタのオフセットを考慮する

上記の場合、画像の原点(左上位置)をマウスポインタが掴んでいるように動作します。このページの例では、画像の原点がボールの外にあるので、マウスがボールの外を掴んでいるように見えます。また、画像以外の位置をクリックしてもドラッグできてしまいます。
そこで、画像をクリックした時にフラッグを立て、マウス位置と画像の原点とのオフセットを算出し、マウスに追従させるときにボールの位置を補正するようにしましょう。このとき、event.xとevent.yは、必ずonmousedownイベントで駆動されるようにしてください。後で他のブラウザ(NN)に対応させるときに楽になります。
また、フラッグを立てるdragOn()関数は画像を呼び出すimgタグ内にonMousedown="dragOn()"と記述して駆動されるようにしましょう。
オブジェクト位置の取得は、leftあるいはtopプロパティでは取得できません。以下のようにpixelLeft、あるいはpixelTopで取得できます。この関数はウィンドウをクリックしたとき発生するイベント(onmousedown)で駆動されるように設定します。
var DragFlg = 0;
var DragX;
var DragY;
function dragOn() {
  DragFlg = 1;
}
function dragStart() {
  DragX = event.x - document.getElementById("Ball").style.pixelLeft;
  DragY = event.y - document.getElementById("Ball").style.pixelTop;
}
function dragEnd() {
  DragFlg = 0;
}
function drag() {
  if (DragFlg == 0) return;
  document.getElementById("Ball").style.left = event.x - DragX;
  document.getElementById("Ball").style.top = event.y - DragY;
  return false;
}
document.onmousedown = dragStart;
document.onmouseup = dragEnd;
document.onmousemove = drag;
オフセット補正の実験 ←IE5.0以降のブラウザで上記の実験ができます。

オブジェクトのドラッグ実験(その2) ←さらにボールに重力の加速度を作用させて見ました。これは面白いですよ。