无法通过更改元素的位置使 JQuery UI 可排序正常工作

Can't make JQuery UI Sortable work properly by Changing places with the Element

$(".sortable").sortable({
      connectWith: ".sortable"
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">

<div class='container-fluid'>
<div class='row sortable'>
    <a class='btn btn-primary col-6'>A</a>
    <a class='btn btn-primary col-6'>B</a>
    <a class='btn btn-primary col-6'>C</a>
</div>
</div>

我正在尝试让按钮相互替换位置,所以如果我将 button C 拉到 button A 我希望它能相互交换位置,但实际情况是button C 进入 button A 的位置并按下所有按钮,但我只想让它们互相替换,而不是重新排序。

平时的样子:

A B
C

当我将 C 拉到 A 的位置时我想要发生什么:

C B
A

实际发生了什么:

C A
B

如何替换而不是推送?

正如我提到的,最好使用 Draggable 和 Droppable 来执行交换功能。 Sortable 旨在允许您将列表中的顺序或项目更改为列表中的任何其他位置。

这是一个例子:

$(function() {
  $(".row .droparea").droppable({
    accept: ".btn",
    classes: {
      "ui-droppable-hover": "active"
    },
    drop: function(e, ui) {
      var si = ui.draggable.data("start");
      $(".btn", this)
        .detach()
        .appendTo($(".droparea").eq(si));
      ui.draggable.css({
        top: "",
        left: ""
      }).appendTo($(this));
    }
  });

  $(".row .btn").each(function(i, el) {
    $("<i>", {
      class: "fas fa-arrows-alt fa-fw drag-handle",
      style: "display: inline-block; width: 17px; height: 100%; margin-left: -17px;",
      title: "Click to Drag"
    }).appendTo($(el)).position({
      my: "right center",
      at: "right-3 center",
      of: $(el)
    });
    $(el).draggable({
      containment: ".row",
      handle: ".drag-handle",
      opacity: 0.45,
      zIndex: 1000,
      start: function(e, ui) {
        ui.helper.data("start", $(this).parent().index());
      }
    }).disableSelection();
  });
});
.row .btn {
  width: 100%;
}

.row .btn .drag-handle {
  color: #0094ff;
}

.row .active .btn {
  border: 1px dashed #212529;
}
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.9/css/all.css" integrity="sha384-5SOiIsAziJl6AWe0HWRKTXlfcSHKmYV4RBF18PPJ173Kzn7jzMyFuTtk8JA7QQG1" crossorigin="anonymous">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>

<div class='container-fluid'>
  <div class='row'>
    <div class="droparea col-6">
      <a class='btn btn-primary'>A</a>
    </div>
    <div class="droparea col-6">
      <a class='btn btn-primary'>B</a>
    </div>
    <div class="droparea col-6">
      <a class='btn btn-primary'>C</a>
    </div>
  </div>
</div>

使用 .droparea 包装器,我们可以为要拖动的 .btn 创建位置。当我们放下 .btn 时,它会交换两者。

例如,如果我们将 C 拖到 A 位置,则 A 会分离,而 re-attached 会拖到 C 所在的位置。然后附加 C 代替 A

为用户提供更多反馈,让他们知道何时可以放下按钮这一点很重要。我添加了其中的一些,还使用了 Font Awesome 来创建手柄图标。如果您打算维护按钮 click 功能,则手柄图标有点重要。 click 不应该在 mousedown 上冒泡,但这只是让用户更清楚也更清楚。