vue项目js操作dom实现列表拖拽排序功能

66 阅读1分钟

拖拽排序.gif
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>简易拖拽</title>
  <style>
    * {
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }

    ul {
      margin: 200px auto;
      width: 400px;
      list-style-type: none;
      display: flex;
    }

    li {
      margin: 5px;
      text-align: center;
      width: 400px;
      height: 50px;
      line-height: 50px;
      border-radius: 6px;
      background: skyblue;
    }

    .list .moving {
      background: transparent;
      color: transparent;
      border: 1px dashed #ccc;
    }
  </style>
</head>

<body>
  <ul class="list">
    <li draggable="true">1</li>
    <li draggable="true">2</li>
    <li draggable="true">3</li>
    <li draggable="true">4</li>
    <li draggable="true">5</li>
  </ul>
  <div style="display: flex;justify-content: center;">
    <h1>您的数据排序是:</h1>
    <h1 id="view"></h1>
  </div>

  <script>
    const forli = () => {
      var arr = document.getElementsByTagName('li'), temp = [];
      console.log('arr', arr);
      for (var i = 0; i < arr.length; i++) {
        temp.push(arr[i].innerHTML)
        div = document.getElementById("view");
        div.innerHTML = JSON.stringify(temp);
        //div.innerHTML = temp;
      }
    }

    forli();//先执行一遍
    let list = document.querySelector('.list')
    let currentLi
    list.addEventListener('dragstart', (e) => {
      e.dataTransfer.effectAllowed = 'move'
      currentLi = e.target
      setTimeout(() => {
        currentLi.classList.add('moving')
      })
    })

    list.addEventListener('dragenter', (e) => {
      e.preventDefault()
      if (e.target === currentLi || e.target === list) {
        return
      }
      let liArray = Array.from(list.childNodes)
      let currentIndex = liArray.indexOf(currentLi)
      let targetindex = liArray.indexOf(e.target)

      if (currentIndex < targetindex) {

        list.insertBefore(currentLi, e.target.nextElementSibling)
      } else {

        list.insertBefore(currentLi, e.target)
      }
    })
    list.addEventListener('dragover', (e) => {
      e.preventDefault()
      forli()
    })
    list.addEventListener('dragend', (e) => {
      currentLi.classList.remove('moving')
    })
  </script>
</body>

</html>