为什么 clientX 在最后一次拖动事件中重置为 0,如何解决?
Why is clientX reset to 0 on last drag-event and how to solve it?
我试图沿着一条线拖动元素。他们应该互相推动,而不是越过或越过。
为了避免拖动时有阴影元素漂浮,我拖动了一个子 div,它会影响外部元素的位置。工作正常,除非您释放鼠标触发最后一个拖动事件 clientX
等于 0
(参见 CodePen)!
var b = document.querySelector('.box');
var bi = document.querySelector('.box-inner');
var b2 = document.querySelector('.box2');
bi.addEventListener('dragstart', function() {
console.log("dragstart")
}, false);
bi.addEventListener('drag', function(event) {
const bLeft = event.clientX;
const b2Left = b2.offsetLeft;
b.style.left = bLeft + "px";
if (b2Left - 50 <= bLeft) {
b2.style.left = (bLeft + 50) + "px";
}
console.log("drag", event.clientX, event.target.offsetParent.offsetLeft, b2.offsetLeft);
}, false);
bi.addEventListener('dragend', function() {
console.log("dragend")
}, false);
.box {
width: 50px;
height: 50px;
background-color: hotpink;
position: absolute;
top: 0;
left: 0;
}
.box-inner {
width: 100%;
height: 100%;
}
.box2 {
width: 50px;
height: 50px;
background-color: rebeccapurple;
position: absolute;
left: 200px;
top: 0;
}
<div class="box">
<div class="box-inner" draggable="true"></div>
</div>
<div class="box2"></div>
为什么会这样,我该怎么做才能避免重置它?
默认情况下,data/elements不能放在其他元素中。要允许拖放,您必须阻止在拖动时对元素的默认处理。
document.addEventListener("dragover", function(event) {
// prevent default to allow drop
event.preventDefault();
}, false);
我只是忽略了最后一个事件。不知道为什么会发光
// in `drag` event handler
if (event.screenX === 0) {
return;
}
注意你应该在这里使用 screenX
。当用户放大页面时,clientX
将是一个正值而不是零。
我试图沿着一条线拖动元素。他们应该互相推动,而不是越过或越过。
为了避免拖动时有阴影元素漂浮,我拖动了一个子 div,它会影响外部元素的位置。工作正常,除非您释放鼠标触发最后一个拖动事件 clientX
等于 0
(参见 CodePen)!
var b = document.querySelector('.box');
var bi = document.querySelector('.box-inner');
var b2 = document.querySelector('.box2');
bi.addEventListener('dragstart', function() {
console.log("dragstart")
}, false);
bi.addEventListener('drag', function(event) {
const bLeft = event.clientX;
const b2Left = b2.offsetLeft;
b.style.left = bLeft + "px";
if (b2Left - 50 <= bLeft) {
b2.style.left = (bLeft + 50) + "px";
}
console.log("drag", event.clientX, event.target.offsetParent.offsetLeft, b2.offsetLeft);
}, false);
bi.addEventListener('dragend', function() {
console.log("dragend")
}, false);
.box {
width: 50px;
height: 50px;
background-color: hotpink;
position: absolute;
top: 0;
left: 0;
}
.box-inner {
width: 100%;
height: 100%;
}
.box2 {
width: 50px;
height: 50px;
background-color: rebeccapurple;
position: absolute;
left: 200px;
top: 0;
}
<div class="box">
<div class="box-inner" draggable="true"></div>
</div>
<div class="box2"></div>
为什么会这样,我该怎么做才能避免重置它?
默认情况下,data/elements不能放在其他元素中。要允许拖放,您必须阻止在拖动时对元素的默认处理。
document.addEventListener("dragover", function(event) {
// prevent default to allow drop
event.preventDefault();
}, false);
我只是忽略了最后一个事件。不知道为什么会发光
// in `drag` event handler
if (event.screenX === 0) {
return;
}
注意你应该在这里使用 screenX
。当用户放大页面时,clientX
将是一个正值而不是零。