拖放堆叠多个图像 div

Drag and drop stacking multiple images on a div

我知道有很多关于这个主题的问题和答案,但我找不到与我的确切问题相关的答案。

由于 COVID19,我不能与我的学生共享和使用实体卡,因此我尝试实施 HTML5 应用程序作为替代方案。

我有一个包含多个 div 的网格(每个都有一个类似于每张卡片的图像),学生必须一次拿一个并将其拖放到另一个 div 中,所以掉落的卡片必须相互重叠。这些图像将具有透明背景,因此如果它们 select 适当的卡片,它们将获得所有堆叠卡片的正确图像。

我已经设法将 dividual 卡片从其原始 div 拖放到目标并返回到其原始 div,但是当我放下不止一张卡片时同样div,后面掉落的卡牌消失

我不知道是不是保险丝或者发生了什么,但是虽然在这个代码片段中图像是相同的,但我使用的图像没有显示融合(记住它们有透明背景,如果我可以很容易地看到正在将两张卡片粘在一起)。

我不是开发人员,所以我会喜欢纯 JS 解决方案,因为这样我认为我可以更好地控制和理解我在做什么。

我该如何解决这个问题?

下一步将涉及 socket.io 的使用,这样所有人都可以一起玩(这样任何人都可以在 his/her PO 中看到其他学生移动了哪些卡片),而不是每个人都自己玩。但是在我解决这个问题之前我会留下这个问题。

谢谢。

function allowDrop(ev) {
  ev.preventDefault();
}

function drag(ev) {
  ev.dataTransfer.setData("text", ev.target.id);
}

function drop(ev) {
  ev.preventDefault();
  var data = ev.dataTransfer.getData("text");
  ev.target.appendChild(document.getElementById(data));
  //~ ev.target.style.backgroundImage = document.getElementById(data);
}
#drag1, #drag2, #drag3, #drag4{
width: 100%;
height: 100%;
}       

#div1{
  float: left;
  width: 25px;
  height: 25px;
  border: 1px solid black;
}

#div2 {
  float: left;
  width: 50px;
  height: 50px;
  border: 1px solid black;
}

.grid-container {
  display: grid;
  grid-template-columns: auto auto auto auto auto auto auto auto;
  grid-template-rows: auto auto auto auto auto ;
}

*[draggable=true] {
  -moz-user-select:none;
  -khtml-user-drag: element;
  cursor: move;
}

.row {
  display: flex;
}
      
<div class="grid-container">
    
<div id="div1" ondrop="drop(event)" ondragover="allowDrop(event)" >
  <img src="https://www.w3schools.com/images/w3schools_green.jpg" draggable="true" ondragstart="drag(event)" id="drag1" >
</div>

<div id="div1" ondrop="drop(event)" ondragover="allowDrop(event)">
  <img src="https://www.w3schools.com/images/w3schools_green.jpg" draggable="true" ondragstart="drag(event)" id="drag2" >
</div>

<div id="div1" ondrop="drop(event)" ondragover="allowDrop(event)">
  <img src="https://www.w3schools.com/images/w3schools_green.jpg" draggable="true" ondragstart="drag(event)" id="drag3" >
</div>

<div id="div1" ondrop="drop(event)" ondragover="allowDrop(event)">
  <img src="https://www.w3schools.com/images/w3schools_green.jpg" draggable="true" ondragstart="drag(event)" id="drag4" >
</div>
<div>
  <div id ="div2" class="grid-item" ondrop="drop(event)" ondragover="allowDrop(event)"> </div>  
</div>

@sol 指出了我正确的方向,最后我设法解决了这个问题,只是稍微改变了 drop 事件,如下所示:

function drop(ev) {
  ev.preventDefault();
  var data = ev.dataTransfer.getData("text");
  var parent = ev.target.parentNode;
  parent.appendChild(document.getElementById(data));
}

我确保目标始终相同,因此尽管 div 包含多个图像,但放置目标始终是它们的 parent 节点,因此 div,容器。 但是,这需要 div 作为开头的 child,我使用和图像作为卡片的模板。否则,放置事件将查找 div 的 parent 而不是 div 本身(child parent)。希望我已经解释清楚了。