Blog: 做了个简单的h5列表拖动demo(2)

<template>
  <div class="wrap">
    <div class="list-wrap">
      <div id="list" class="list">
        <div :id="item" class="list-item" draggable="true" v-for="item of list" :key="item">
          {{ item }}
        </div>
      </div>
    </div>
    <div class="drag-place">
      <div id="drop" class="input"></div>
    </div>
  </div>

</template>

<script>
  export default {
    data() {
      return {
        list: new Array(100).fill(0).map((item, index) => index + 1)
      }
    },
    mounted() {
      let dragResult = false,
        el = null,
        parent = document.getElementById('list');
        
      // 拖动元素的事件设置
      let list = document.getElementsByClassName('list')[0];
      let arr_li = document.getElementsByClassName('list-item');

      for (let i = 0; i < arr_li.length; i++) {

        arr_li[i].ondragstart = function(ev) {
          this.className = 'list-item opacity';
          el = document.getElementById(ev.target.id)
        }

        // 拖动过程中触发
        arr_li[i].ondrag = function() {}

        // 拖动结束触发
        arr_li[i].ondragend = function(ev) {
          const target = ev.target;
          // 通过一个全局变量判断是否拖放成功
          if (!dragResult) {
            // 拖放失败把opacity状态去除
            target.className = 'list-item';
          } else {
            list.removeChild(target);
            dragResult = false;
          }
        }

        // 放置元素的事件设置
        arr_li[i].ondragover = function(ev) {
          ev.preventDefault();
          const target = ev.target;
          if (el.id === ev.target.id) {
            return
          }
          if (ev.pageY - target.offsetTop > target.offsetHeight / 2) {
          	// 不能先移除,这样会导致offsetTop的高度计算出现偏差
            parent.removeChild(el)
            parent.insertBefore(el, target.nextSibling);
          } else {
            parent.removeChild(el)
            parent.insertBefore(el, target);
          }

        }

        arr_li[i].ondrop = (ev) => {
          ev.preventDefault();
          ev.stopPropagation();
          el = null;
        }
      }
    }
  }
</script>

<style>
  * {
    margin: 0;
    padding: 0;
  }

  .opacity {
    opacity: 0.2;
  }

  .wrap {
    display: flex;
  }


  .list-wrap {
    width: 300px;
    height: 600px;
    flex: 1
  }

  .list {
    width: 100%;
  }

  .list-item {
    width: 100%;
    height: 50px;
    line-height: 20px;
    border: 1px solid red;
    margin-top: 20px;
  }

  .drag-place {
    flex: 1;
  }

  .input {
    width: 50%;
    min-height: 30px;
    float: right;
    border: 1px solid red;
  }

  .block {
    width: 20px;
    line-height: 20px;
    border: 1px solid lightblue;
  }
</style>

效果图如下
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值