表格拖拽功能

在这里插入图片描述
可以随意拖拽表格顺序

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1.0">
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <style>
    ul {
      list-style: none;
      padding-bottom: 20px;
    }

    .item {
      cursor: pointer;
      line-height: 24px;
      background-color: #9c9c9c;
      border: 1px solid #d9d9d9;
      border-radius: 4px;
      color: #fff;
      padding: 10px;
    }
  </style>
</head>

<body>
  <div id="app">
    <ul @dragstart="onDragStart" @dragover="onDragOver" @dragend="onDragEnd" ref="parentNode">
      <li v-for="(item,index) in data" :key="index" class="item" draggable="true">{{item}}</li>
    </ul>
  </div>
</body>
<script>
  var app = new Vue({
    el: '#app',
    data: {
      data: [1, 2, 3, 4, 5, 6],
      draging: null, //被拖拽的对象
      target: null, //目标对象
    },
    mounted() {
      //为了防止火狐浏览器拖拽的时候以新标签打开,此代码真实有效
      document.body.ondrop = function (event) {
        event.preventDefault();
        event.stopPropagation();
      }
    },
    methods: {
      onDragStart(event) {
        this.draging = event.target;
      },
      onDragOver(event) {
        this.target = event.target;
        let targetTop = event.target.getBoundingClientRect().top;
        let dragingTop = this.draging.getBoundingClientRect().top;
        if (this.target.nodeName === "LI" && this.target !== this.draging) {
          if (this.target) {
            if (this.target.animated) {
              return;
            }
          }

          if (this._index(this.draging) < this._index(this.target)) {
            this.target.parentNode.insertBefore(this.draging, this.target.nextSibling);
          } else {
            this.target.parentNode.insertBefore(this.draging, this.target);
          }
          this._anim(targetTop, this.target);
          this._anim(dragingTop, this.draging);
        }
      },
      _anim(startPos, dom) {
        let offset = startPos - dom.getBoundingClientRect().top;
        dom.style.transition = "none";
        dom.style.transform = `translateY(${offset}px)`;

        //触发重绘
        dom.offsetWidth;
        dom.style.transition = "transform .3s";
        dom.style.transform = ``;
        clearTimeout(dom.animated);

        dom.animated = setTimeout(() => {
          dom.style.transition = "";
          dom.style.transform = ``;
          dom.animated = false;
        }, 300)
      },
      onDragEnd(event) {
        console.log('drag end')
        let currentNodes = Array.from(this.$refs.parentNode.childNodes);

        let data = currentNodes.map((i, index) => {
          let item = this.data.find(c => c == i.innerText);
          return item
        });
        console.log(data)
      },
      _index(el) {
        let domData = Array.from(this.$refs.parentNode.childNodes);
        return domData.findIndex(i => i.innerText == el.innerText);
      }
    }
  })
</script>

</html>
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值