拖放不会移动元素,如果您希望元素在放置时移动,则必须在放置事件中设置元素的新位置。我已经做了一个在 Firefox 和 Chrome 中工作的例子,这里是要点:
function drag_start(event) {
var style = window.getComputedStyle(event.target, null);
event.dataTransfer.setData("text/plain",
(parseInt(style.getPropertyValue("left"),10) - event.clientX) + ',' + (parseInt(style.getPropertyValue("top"),10) - event.clientY));
}
该dragstart
事件计算鼠标指针距元素左侧和顶部的偏移量,并将其传递到dataTransfer
. 我不担心传递 ID,因为页面上只有一个可拖动元素 - 没有链接或图像 - 如果您的页面上有任何这些内容,那么您将不得不在这里做更多的工作。
function drop(event) {
var offset = event.dataTransfer.getData("text/plain").split(',');
var dm = document.getElementById('dragme');
dm.style.left = (event.clientX + parseInt(offset[0],10)) + 'px';
dm.style.top = (event.clientY + parseInt(offset[1],10)) + 'px';
event.preventDefault();
return false;
}
该drop
事件解包偏移量并使用它们相对于鼠标指针定位元素。
该dragover
事件只需要preventDefault
在任何拖过。同样,如果页面上还有其他可拖动的内容,您可能需要在这里做一些更复杂的事情:
function drag_over(event) {
event.preventDefault();
return false;
}
因此,将其document.body
与drop
事件一起绑定以捕获所有内容:
var dm = document.getElementById('dragme');
dm.addEventListener('dragstart',drag_start,false);
document.body.addEventListener('dragover',drag_over,false);
document.body.addEventListener('drop',drop,false);
如果你想让它在 IE 中工作,你需要将 转换aside
为一个a
元素,当然,所有的事件绑定代码都会不同。据我所知,拖放 API 在 Opera 或任何移动浏览器中都不起作用。另外,我知道你说过你不想使用 jQuery,但是跨浏览器事件绑定和操作元素位置是 jQuery 使事情变得容易得多的事情。