原生 js 实现一个简单的拖拽效果

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      .drag_demo {
        display: flex;
        flex-direction: column;
        gap: 6px;
      }
      .drag_item {
        width: 200px;
        height: 50px;
        background-color: rgb(255, 146, 62);
        display: flex;
        justify-content: center;
        align-items: center;
        overflow: hidden;
        cursor: move;
      }
      .drag_start_item {
        opacity: 0.3;
      }
    </style>
  </head>
  <body>
    <div class="drag_demo">
      <div draggable="true" class="drag_item">1</div>
      <div draggable="true" class="drag_item">2</div>
      <div draggable="true" class="drag_item">3</div>
      <div draggable="true" class="drag_item">4</div>
    </div>
    <script>
      // 父元素
      const containerElement = document.querySelector('.drag_demo');
      // 当前正在拖拽的元素
      let dragElement;
      // 拖拽开始时
      containerElement.ondragstart = (event) => {
        setTimeout(() => {
          dragElement = event.target;
          event.target.classList.add('drag_start_item');
        });
      };
      // 拖拽进入时
      containerElement.ondragenter = (event) => {
        // 拖拽进入的目标元素
        const targetElement = event.target;
        // 如果进入的元素是自身,或者父级元素,直接返回
        if (targetElement === dragElement || targetElement === containerElement) return false;
        // containerElement.children 是一个类数组,需要转换为数组
        const containerElementChildrenList = Array.from(containerElement.children);
        // 当前拖拽的元素的索引
        const dragIndex = containerElementChildrenList.indexOf(dragElement);
        // 目标元素的索引
        const targetIndex = containerElementChildrenList.indexOf(targetElement);
        if (dragIndex < targetIndex) {
          // Element.after() 方法会在其父节点的子节点列表中插入一些 Node 或 DOMString 对象。插入位置为该节点之后。DOMString 对象会被以 Text 的形式插入
          // after() 方法不会创建新的元素,它只是将现有元素移动到指定元素之后
          targetElement.after(dragElement);
          console.log('向下');
        }
        if (dragIndex > targetIndex) {
          targetElement.before(dragElement);
          console.log('向上');
        }
      };
      containerElement.ondragend = (event) => {
        event.target.classList.remove('drag_start_item');
        dragElement = null;
      };
    </script>
  </body>
</html>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值