通过js实现拖拽排序

一、实现效果

请添加图片描述

二、实现效果

实现原理: 主要依靠原生的 dragstartdragend 事件

当然:也可以基于插件 vue.draggable 实现

<!DOCTYPE html>
<html lang="en">

<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <meta name="viewport"
    content="initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no, width=device-width" />
  <title>test</title>
  <style type="text/css">
    .flip-list-move {
      transition: transform 0.3s ease-in;
    }

    .box {
      display: block;
      display: flex;
      width: 500px;
      flex-wrap: wrap;
    }

    .items {
      width: 100px;
      height: 50px;
      margin: 10px;
      line-height: 50px;
      text-align: center;
      border: 2px solid red;
      border-radius: 4px;
      cursor: move;
      background: #eee;
    }

    .items.active {
      background: rgba(0, 0, 0, 0.4);
    }
  </style>
</head>

<body>
  <div id="content">
    <transition-group name="flip-list" class="box">
      <div v-for="item in items" :key="item" draggable="true" class="items"
        :class="{active: oldVal == item && isActive==item}" @dragstart="dragstart(item)" @dragenter="dragenter(item)"
        @dragend="dragend(item)">
        {{item}}
      </div>
    </transition-group>
  </div>
  <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.9/vue.min.js"></script>
  <script>
    var vue = new Vue({
      el: '#content',
      data: {
        items: [1, 2, 3, 4, 5, 6, 7, 8, 9],
        isActive: 0,
        oldVal: 0,
        newOld: 0,
      },
      methods: {
        dragstart(val) {
          // 保存旧的节点和当前正在操作的节点
          this.oldVal = val;
          this.isActive = val;
          console.log('-------dragstart val', val);
          console.log('-------dragstart this.oldVal', this.oldVal);
          console.log('-------dragstart this.isActive', this.isActive);
        },
        dragend(val) {
          if (this.oldVal != this.newOld) {
            let oldIndex = this.items.indexOf(this.oldVal);
            let newIndex = this.items.indexOf(this.newOld);
            let newItems = [...this.items];
            // 删除老的节点
            newItems.splice(oldIndex, 1);
            // 增加新的节点
            newItems.splice(newIndex, 0, this.oldVal);
            // items结构发生变化触发transition-group的动画
            this.items = [...newItems];
            // 重置正在操作的节点
            this.isActive = -1;
          }
        },
        // 记录移动过程中信息
        dragenter(val) {
          // 即保存要将当前移动的节点放到那个位置
          this.newOld = val;
          console.log('-----------dragenter val', val);
          console.log('-----------dragenter this.newOld', this.newOld);
        },
      },
    });
  </script>
</body>

</html>

文章仅为本人学习过程的一个记录,仅供参考,如有问题,欢迎指出!

  • 3
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
实现表格的拖拽排序,可以使用以下步骤: 1. 给表格中需要排序的行添加拖拽事件监听器。 2. 在拖拽开始时,记录被拖拽的行的索引。 3. 在拖拽过程中,使用一些视觉效果(比如改变背景颜色)来提示用户当前处于哪一行。 4. 在拖拽结束时,将被拖拽的行移动到目标位置,并更新表格数据。 下面是一个简单的实现示例: HTML: ```html <table id="sortable-table"> <thead> <tr> <th>名称</th> <th>数量</th> <th>价格</th> </tr> </thead> <tbody> <tr><td>苹果</td><td>10</td><td>5</td></tr> <tr><td>香蕉</td><td>15</td><td>3</td></tr> <tr><td>橙子</td><td>8</td><td>4</td></tr> <tr><td>梨子</td><td>12</td><td>6</td></tr> </tbody> </table> ``` JavaScript: ```javascript // 获取表格元素 const table = document.getElementById('sortable-table'); // 获取所有可拖拽的行 const rows = table.tBodies[0].rows; // 记录被拖拽的行的索引 let draggingIndex = -1; // 给所有可拖拽的行添加事件监听器 for (let i = 0; i < rows.length; i++) { const row = rows[i]; // 记录当前行的索引 row.draggingIndex = i; // 添加拖拽事件监听器 row.addEventListener('dragstart', e => { // 记录被拖拽的行的索引 draggingIndex = e.target.draggingIndex; // 设置拖拽效果 e.dataTransfer.effectAllowed = 'move'; // 设置拖拽数据 e.dataTransfer.setData('text/html', row.innerHTML); }); // 添加拖拽过程中的事件监听器 row.addEventListener('dragover', e => { // 阻止默认行为,使得drop事件能够触发 e.preventDefault(); // 设置拖拽效果 e.dataTransfer.dropEffect = 'move'; // 获取当前鼠标所在的位置 const y = e.clientY - table.offsetTop; // 遍历所有行,找到当前鼠标所在的位置应该插入的位置 for (let j = 0; j < rows.length; j++) { const row = rows[j]; if (y > row.offsetTop && y < row.offsetTop + row.offsetHeight) { // 如果拖拽的行和目标行不是同一行,则交换位置 if (draggingIndex !== j) { table.tBodies[0].insertBefore(rows[draggingIndex], j > draggingIndex ? rows[j] : rows[j + 1]); break; } } } }); // 添加拖拽结束的事件监听器 row.addEventListener('dragend', e => { // 重置被拖拽的行的索引 draggingIndex = -1; }); } ``` 在这个示例中,我们使用了HTML5的拖拽API来实现表格的拖拽排序。在拖拽过程中,我们通过改变被拖拽的行和目标行的位置来实现排序。需要注意的是,这个示例只是一个简单的实现,如果需要支持更复杂的排序方式,比如拖拽多个行或者跨页排序,还需要进行更多的功能扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值