Skip to content

拖拽排序 ​

html
<div class="list">
  <div draggable="true" class="list-item">1</div>
  <div draggable="true" class="list-item">2</div>
  <div draggable="true" class="list-item">3</div>
  <div draggable="true" class="list-item">4</div>
  <div draggable="true" class="list-item">5</div>
</div>
css
.list-item {
    width: 400px;
    height: 50px;
    text-align: center;
    line-height: 50px;
    background-color: lightblue;
    margin: 8px auto;
    cursor: move;
    user-select: none;
    border-radius: 5px;
}

.list-item.moving {
    background: transparent;
    color: transparent;
    border: 1px dashed #ccc;
}
javascript
const list = document.querySelector('.list');

let sourceNode; // 当前正在拖动的是哪个元素
list.ondragstart = e => {
  setTimeout(() => {
    e.target.classList.add('moving');
  }, 0);
  sourceNode = e.target;
  e.dataTransfer.effectAllowed = 'move';
}

list.ondragover = e => {
  e.preventDefault();
}

list.ondragenter = e => {
  e.preventDefault();
  if (e.target === list || e.target === sourceNode) {
    return;
  }
  const children = Array.from(list.children);
  const sourceIndex = children.indexOf(sourceNode);
  const targetIndex = children.indexOf(e.target);
  // 往下拖
  if (sourceIndex < targetIndex) {
    list.insertBefore(sourceNode, e.target.nextElementSibling);
  } else {
    // 向上拖
    list.insertBefore(sourceNode, e.target);
  }
}

list.ondragend = e => {
  e.target.classList.remove('moving');
}