使用本机 HTML5 拖放,如何让一个棋子占据多个 table 单元格?

Using Native HTML5 Drag-And-Drop, how can I make a playing piece occupy multiple table cells?

我在 table 网格上使用拖放。我试图让一个棋子占据网格的 4 个方格,而不是一个单元格。目前,该代码使您能够成功地将 div 从一个单元格拖动到另一个单元格。现在我想将可拖动对象的大小加倍 div 以便它占据 4 个单元格。

在此示例中,单元格大小固定为 50x50 像素。 div 是 100x100。目前,div 扩展它占据的任何单元格,以及与该单元格关联的行和列。我不希望扩展单元格,而是希望 div 覆盖 4 个单元格的 space。

本质上,我不希望 div 包含在单个单元格的边界内,而是占据 4 个单元格。拖动后,当它被放下时,播放的棋子需要捕捉到单元格边框。

我该怎么做?下面是我的代码,还有一个 fiddle.

<style>
    table td {
      height: 50px;
      width: 50px;
    }
    .piece {
      height: 100px;
      width: 100px;
      display: flex;
      justify-content: center;
      align-items: center;
      background-color: #09C;
      font-weight: bold;
      padding-top: 5px;
    }
</style>

<table id="targetTable" border="1">
    <tbody>
      <tr>
        <td>
          <div class="piece" id="a" draggable="true">Move Me</div>
        </td>
        <td></td>
        <td></td>
        <td></td>
      </tr>
      <tr>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
      </tr>
      <tr>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
      </tr>
      <tr>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
      </tr>
    </tbody>
</table>

<script>
  $(function() {
    initDragAndDrop();
  });

  function initDragAndDrop() {
    $('.piece').on('dragstart', function(event) {
        var dt = event.originalEvent.dataTransfer;
        dt.setData('Text', $(this).attr('id'));
    });
    $('table td').on('dragenter dragover drop', function(event) {
        event.preventDefault();
        if (event.type === 'drop') {
             var data = event.originalEvent.dataTransfer.getData('Text', $(this).attr('id'));
             de = $('#' + data).detach();
             de.appendTo($(this));
        }
    });
  }
</script>

这里是fiddle:https://jsfiddle.net/Stormjack/osvu6mea/25/

当前代码使用本机 HTML5,但如果需要,我可能会更改它以使用 jQuery 库。感谢您的帮助!

使用 colspan 属性:

$(this).attr('colspan',4);

因此您的代码将变为:

 if (event.type === 'drop') {
        var data = event.originalEvent.dataTransfer.getData('Text', $(this).attr('id'));
        de = $('#' + data).detach();
        de.appendTo($(this));
        $(this).attr('colspan',4);

      }

这将使您的单元格相当于 4 列。

在此阶段,您需要调整单元格。因为你的 table 是 4 列。通过将 colspan=4 分配给一个单元格,并且行中有额外的单元格将使其包含 7 列。您可以找到并删除那些多余的单元格。

有了绝对定位,你还需要一个相对定位。

示例:https://jsfiddle.net/Twisty/Ldsaegq2/2/

CSS

body {
  font-family: helvetica, arial, sans-serif;
}

table td {
  height: 50px;
  width: 50px;
  position: relative;
}

.piece {
  height: 95px;
  width: 100px;
  background-color: #09C;
  font-weight: bold;
  padding-top: 5px;
  position: absolute;
  top: 1px;
  left: 1px;
}

掉落物品然后 "sticks" 位置。

An element with position: absolute; is positioned relative to the nearest positioned ancestor (instead of positioned relative to the viewport, like fixed).