拖拽列表简单实现

本文介绍了如何使用HTML、CSS和JavaScript实现一个可拖动元素的容器,允许用户在页面上移动元素并自动调整布局。通过监听dragstart,dragover,dragenter和dragend事件,实现了元素的拖放功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

样式部分:

<style>
      .item {
        width: 500px;
        text-align: center;
        margin-bottom: 5px;
        height: 40px;
        line-height: 40px;
        border-radius: 5px;
        color: #fff;
        margin: 5 auto;
        background-color: red;
      }
      .item.moving {
        background: transparent;
        color: transparent;
        border: 1px dashed #ccc;
      }
      
    </style>
<div class="container">
      <div id="apple" draggable="true" class="item">苹果</div>
      <div id="banana" draggable="true" class="item">香蕉</div>
      <div id="ss" draggable="true" class="item">黄梨</div>
      <div id="sdf" draggable="true" class="item">西瓜</div>
      <div id="5sdf" draggable="true" class="item">葡萄</div>
      <div id="dfdf" draggable="true" class="item">留恋</div>
    </div>

<script>
    const con = document.querySelector('.container');
    let selfNode;
    con.ondragstart = e => {
      e.dataTransfer.effectAllowed = 'move';
      e.dataTransfer.setData('Text', e.target.id);

      console.log(e);
      setTimeout(() => {
        e.target.classList.add('moving');
      }, 0);
      selfNode = e.target;
    };
    con.ondragover = e => {
      e.preventDefault();
    };
    con.ondragenter = e => {
      e.preventDefault();
      console.log('enter', e);
      if (e.target === con || e.target === selfNode) {
        return;
      }
      const children = Array.from(con.children);
      const selfIndex = children.indexOf(selfNode);
      const targetIndex = children.indexOf(e.target);
      console.log(selfNode, e.target);
      if (selfIndex < targetIndex) {
        con.insertBefore(selfNode, e.target.nextElementSibling);
      } else {
        con.insertBefore(selfNode, e.target);
      }
    };
    con.ondragend = e => {
      selfNode.classList.remove('moving');
    };
  </script>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

成序猿@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值