HP作成講座、脱初心者編
マウスで文字や画像を動かす。その2




上のだるまをマウスでドラッグすると、好きなところに動かせます。
ま、やってみてください。
マウスのドラッグを実現するには、3つの動作が必要です。
1つは、マウスのボタンを押したとき、2つ目はマウスを動かしたとき、3つ目はマウスのボタンを離したときです。
と言うわけで、それぞれの動きを”ひとまとまりにしたプログラム(関数)”にしています。
これが、そのJAVAスクリプトのソースです。
<script language="JavaScript">
<!--
var x,y,ofx,ofy,t=1;

function tukami(){
ofx = event.offsetX;
ofy = event.offsetY;
t=0;
return false;
}

function mov(){
if (t==1){return true;}
x = event.clientX - ofx-2+document.body.scrollLeft;
y = event.clientY - ofy-2+document.body.scrollTop;
document.all.daruma.style.pixelLeft = x;
document.all.daruma.style.pixelTop = y;
return false;
}

function stop() {
t=1;
}


document.onmousemove = mov;
document.onmouseup = stop;
//-->
</script>
<!--このJAVAスクリプトは<head>〜</head>内でも<body>〜</body>内においてもかまいません。-->

<span id="daruma" style="position:absolute" onMouseDown="tukami()">
<img src="pic/daruma_nahanaha.gif" width="48" height="64" border="0">
</span>
まず、大まかな流れから・・・
画像は<span></span>で、囲まれています。
そして、ここにはonMouseDown="tukami()"と書かれています。
これは、HTMLのタグに記述するDHTMLのイベントハンドラです。
<span>〜</span>で囲まれたものにマウスカーソルを重ねて、マウスのボタン マウスのボタンを押し下げたとき、tukami()が、実行されます。
ここでは、画像を動かすためのチョットした準備をしています。

そして、JAVAスクリプトの最後の方にdocument.onmousemove = mov;と書かれています。
マウスが動いたとき、mov()実行されます。
参照、マウスボタンイベント
ここで、実際にマウスカーソルの動きにあわせて、画像の位置を変えています。
ただし、tが1の時は、ここは働きません。
それが、if (t==1){return true;}です。
returnとすると、ここでこの関数がつまりmov()が、終わってしまいます。つまり、何もせずに終わります。その場合は画像は動きません。
最初、ページが読み込まれたときvar x,y,ofx,ofy,t=1;で、tは1としています。
でも、画像にマウスカーソルを当てて、マウスのボタンを押すと、tukami()が働いて、tは0になります。そうすると、画像は動きます。

そして、document.onmouseup = stop;では、マウスのボタンを離したときに、stop()が働いて、tが1になります。するとmov()が何もしなくなるので画像は、その位置で止まるのです。
では、tukami()から見ていきましょう。
function tukami(){
ofx = event.offsetX;
ofy = event.offsetY;
t=0;
return false;
}
event.offsetXevent.offsetYというのがあります。
これは、マウスカーソルが画像などの上に重なっているとき、その画像の左上隅の座標を(left=”0”、top=”0”)として。カーソルがどの位置にあるかを示します。
左のように、青い色で丸い絵が描かれている画像があるとします。
でも、書かれた絵がどんな形であろうとも、画像ファイルそのものは必ず長方形の形をしています。 それを黒枠で示してみました。
つまり、黒枠が画像本来の形です。
そして、その画像にマウスカーソルが乗っています。
event.offsetXevent.offsetYは、その画像の上でのマウスカーソルの位置を数値で示すのです。つまり画像の左上からどの位置にあるかを表します。
それぞれをofx、ofyという変数に入れておきます。これは次の関数mov()で使います。
そして、tを0にします。これは、次のmov()が、働くようにするためです。
そして次は、そのmov()です。
これはマウスカーソルが動いたときに、実行される関数です。
function mov(){
if (t==1){return true;}
x = event.clientX - ofx-2+document.body.scrollLeft;
y = event.clientY - ofy-2+document.body.scrollTop;
document.all.daruma.style.pixelLeft = x;
document.all.daruma.style.pixelTop = y;
return false;
}
if (t==1){return true;}は、tが1の時は、この行から後に書かれていることをせずに、このmov()を終わらせます。
関数はreturnで、終わることになっているのです。
ですから、「もしtが1ならば、この関数は・・つまりmov()は終わり。」という意味です。
そして、その後に実際に画像を動かすプログラムが書かれています。

x = event.clientX - ofx-2+document.body.scrollLeftには、さっき説明したofxが使われています。
これはマウスのボタンを押し下げたときの画像上でのマウスカーソルの位置です。
それから、event.clientXは、HPを表示している画面の左端から、マウスカーソルがどの位置にあるか?ということを示しています。(参照)
この行の基本は、xに画像の左端の座標を入れたいのです。下の図を見てください。
黄色い部分が画像で、●はマウスカーソルの位置です。
左端の黒い縦線はHPの左端です。
この図を、よ〜く見ると、画像の左端の座標の計算方法が理解しやすいと思います。
event.clientXから、ofxを引くと、ちょうど画像の左端の座標になります。
それで、x = event.clientX - ofxとなるわけです。
でも、インターネットエクスプローラー6でやってみると、2ピクセルずれてしまうのです。(T△T)
どうしてかはわかりませんが、その分を補正するために−2としています。
もし、HPがスクロールしなければ、それで充分なんですが、スクロールした場合のことを考えてその分だけ足しています。
それが、document.body.scrollLeftです。これはスクロールした量をピクセルで示してくれます。
というわけで、マウスカーソルの位置から画像のx座標が計算できます。
そして、同じように画像のY座標を計算しているのが、
y = event.clientY - ofy-2+document.body.scrollTopです。

あとは、マウスカーソルの位置から計算したxとyに画像を表示すればいいわけです。
それが、document.all.daruma.style.pixelLeft = x
document.all.daruma.style.pixelTop = yです。(参照)
darumaというidをつけたタグ、つまり画像を囲んでいる<span></span>ですね。
それの位置をx、yに移動させています。
さて、その次のstop()ですが、これは押していたマウスのボタンを離したときに実行されます。
そして、tを1にします。
tが1になると、mov()が、何もしません。ですからそこで画像は止まります。
PC−Parkトップ
心の話サイコロTown!




広告 万馬券 無料レンタルサーバー ブログ blog