として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
をやっているので、またstartX
とorigX
を組み合わせることができ:http://jsfiddle.net/rLegF/2/。
次に、要素の左上隅を基準にしてマウスの位置を計算し、新しいマウスの位置から古いマウスの位置を差し引いた位置に位置を設定します。おそらくそれはちょっと直感的です。
もう少し整理しました。
これはばかげた質問ですが、別のstartXとorigXを使用した場合の違いは何ですか?このOffsetLeft/Topが本当に返すものは – monk
@monk: 'startX'はマウスのx座標ですドラッグを開始するとき。 'origX'は、ドラッグを開始するときの要素のx座標です。両方を使用すると、マウスの移動時に新しい位置を計算できます。 'offsetLeft'は、要素が左のボーダーに対して配置されているピクセルの量を示す数値を返します。 – pimvdb