2012-02-08 8 views
0

純粋なJavaScriptでドラッグ可能なHTMLページのdivを外部ライブラリを使用せずに作成する方法を学びたいので、私はいくつかの技術を試しましたが、適切なドラッグ可能なオブジェクトにしませんでした。私は私のコードで何か重要なものを逃していると確信しているので、私はdraggableオブジェクトの背後にある基本的なアイデアを知りたいです。私はあなたがpの初期位置を保存し、追加することを忘れてはならないいくつかのstartxとstartYと位置を設定し、事業部の位置は絶対作り、ドラッグ可能なオブジェクトの背後にある技術は何ですか?

p.style.left = (e.clientX-startX) + 'px'; 

p.style.top = (e.clientY-startY) + 'px'; 

// where p is the element i am trying to make draggable 

答えて

1

としてCSSでdiv要素の左と上を設定することにより、それを達成しようとしていましたあなたが相対的な計算をしていることを確認するたびにそれを行います。現在、ドラッグを開始するときにが常に(0, 0)の位置にあると仮定します。

第2に、selectstartイベントをキャンセルすると、ドラッグ時に醜い選択が作成されなくなります。

コードをhttp://jsfiddle.net/rLegF/1/に少し変更しました。

var p = document.getElementById("p"), 
    startX, startY, 
    origX, origY, 
    down = false; 

document.documentElement.onselectstart = function() { 
    return false; // prevent selections 
}; 

p.onmousedown = function(e) { 
    startX = e.clientX; 
    startY = e.clientY; 

    origX = p.offsetLeft; 
    origY = p.offsetTop; 

    down = true; 
}; 

document.documentElement.onmouseup = function() { 
    // releasing the mouse anywhere to stop dragging 
    down = false; 
}; 

document.documentElement.onmousemove = function(e) { 
    // don't do anything if not dragging 
    if(!down) return; 

    p.style.left = (e.clientX - startX) + origX + 'px'; 
    p.style.top = (e.clientY - startY) + origY + 'px'; 
}; 

編集:あなたは基本的に常に- startX + origXをやっているので、またstartXorigXを組み合わせることができ:http://jsfiddle.net/rLegF/2/

次に、要素の左上隅を基準にしてマウスの位置を計算し、新しいマウスの位置から古いマウスの位置を差し引いた位置に位置を設定します。おそらくそれはちょっと直感的です。

もう少し整理しました。

+0

これはばかげた質問ですが、別のstartXとorigXを使用した場合の違いは何ですか?このOffsetLeft/Topが本当に返すものは – monk

+0

@monk: 'startX'はマウスのx座標ですドラッグを開始するとき。 'origX'は、ドラッグを開始するときの要素のx座標です。両方を使用すると、マウスの移動時に新しい位置を計算できます。 'offsetLeft'は、要素が左のボーダーに対して配置されているピクセルの量を示す数値を返します。 – pimvdb

関連する問題