javascript - 将 div 拖放到屏幕上的任何位置,但 div 不应该相互重叠?
问题描述
我想将 div 拖放到屏幕上的任何位置,但 div 不应该相互靠近,如果有人将 div 放在其他地方,它应该放在下一个可能的空间?
window.onload = function() {
for(var i = 0; i < 3; i++){
var newDiv = document.createElement('DIV');
newDiv.setAttribute('class', 'dragDiv' + i);
document.getElementById('container').appendChild(newDiv);
draggable(newDiv);
}
}
function draggable(el) {
el.addEventListener('mousedown', function(e) {
var offsetX = e.clientX - parseInt(window.getComputedStyle(this).left);
var offsetY = e.clientY - parseInt(window.getComputedStyle(this).top);
function mouseMoveHandler(e) {
el.style.top = (e.clientY - offsetY) + 'px';
el.style.left = (e.clientX - offsetX) + 'px';
}
function reset() {
window.removeEventListener('mousemove', mouseMoveHandler);
window.removeEventListener('mouseup', reset);
}
window.addEventListener('mousemove', mouseMoveHandler);
window.addEventListener('mouseup', reset);
});
}
解决方案
我做了答案,现在工作正常。**注意:问题是,我正在循环拖放,所以在这种情况下,我无法检查这个 div 放置位置是否在其他位置,因为这是重叠的,然后我通过HTML5 拖放功能,在拖放功能中,我检查是否有任何 div 为空,不要让任何东西掉入其中。(因此,如果里面没有任何东西,它会粘在外面并且不会重叠)。
function allowDrop(ev) {
ev.preventDefault();
}
function drag(ev) {
ev.dataTransfer.setData("application/json", JSON.stringify([ev.target.id,(ev.offsetX || ev.clientX - ev.target.offset.left),(ev.offsetY || ev.clientY - ev.target.offset.top)]));
}
function drop(ev) {
ev.preventDefault();
if (!ev.target.children.length == "") {
var data = JSON.parse(ev.dataTransfer.getData("application/json"));
var targetDiv = ev.target.appendChild(document.getElementById(data[0]))
targetDiv.style.left = ev.clientX - data[1] + 'px';
targetDiv.style.top = ev.clientY - data[2] + 'px';
return false;
}
}
#div1, #div2 {width:100%;height:100vh;padding:10px;border:1px solid #aaaaaa;position: relative;}
#drag1,
#drag2 {width:50px;height:50px;padding:10px;border:1px solid #000;background-color: #f00; position: absolute;display: inline-block;}
#drag2:nth-child(2){left: 100px;}
<div id="div1" ondrop="drop(event)" ondragover="allowDrop(event)">
<div id="drag1" draggable="true" ondragstart="drag(event)"></div>
<div id="drag2" draggable="true" ondragstart="drag(event)"></div>
</div>
推荐阅读
- javascript - 为什么当我添加 else 块时 else if 块被忽略?
- c++ - 当用户在 QMainWindow 中选择文本时创建上下文菜单
- javascript - 为什么使用事件侦听器检测更改时图标类没有更改?
- javascript - 显示请稍候或加载程序使用 javascript-REST API 调用
- django - 如何在保存中测试 CheckboxSelectMultiple
- c - 未定义对 OpenSSL_version 的引用,链接 openssl 时出错?
- javascript - 创建一个接受两个参数(播放列表对象和艺术家姓名)的函数 removeFromPlaylist
- javascript - 动态添加单选按钮标签 - JavaScript
- c++ - DMA 的同步要求
- python - 烧瓶中的 Python Web 应用程序在本地运行良好,在 Heroku 上抛出 NameError