H5的draggable元素拖放属性

<!DOCTYPE html>
<html>
<head lang="en">
  <meta charset="UTF-8">
  <title>拖放</title>
  <style>
    h2 {
      font-size: 20px;
      color: gray;
    }

    div#left, div#right {
      width: 120px;
      height: 300px;
      float: left;
      margin: 10px 100px 10px 0px;
      border: 1px solid #000;
      overflow-y: auto;
    }

    div label {
      font-size: 22px;
      font-weight: bold;
      width: 100%;
      display: inline-block;
      padding: 4px 0;
      text-align: center;
      margin: 0px 0 2px 0;
      color: #fff;
      background-color: gray;
    }
  </style>
</head>

<body>
  <div>
    <h2>H5拖放</h2>
    <!-- 左边元素框 -->
    <div id="left">
      <label draggable="true">A</label>
      <label draggable="true">B</label>
      <label draggable="true">C</label>
      <label draggable="true">D</label>
      <label draggable="true">E</label>
    </div>
    <!-- 右边元素框 -->
    <div id="right"></div>
  </div>


  <script>
    var moveItem = document.getElementsByTagName('label');
    for (let i = 0; i < moveItem.length; i++) {
      //动态设置label元素id
      moveItem[i].setAttribute('id', 'label' + i);
      moveItem[i].ondragstart = function (ev) {
        // dataTransfer:拖放的数据传递对象
        // dataTransfer.setData() 方法设置被拖数据的数据类型和值
        ev.dataTransfer.setData("Text", this.id);
      };
    }

    // 事件
    // dragstart   //当用户开始拖动一个元素或者一个选择文本的时候 dragstart 事件就会触发。
    // drag      //当元素或者选择的文本被拖动时触发 drag 事件 (每几百毫秒)
    // dragenter   //当拖动的元素或被选择的文本进入有效的放置目标时, dragenter 事件被触发。
    // dragleave   //当一个被拖动的元素或者被选择的文本离开一个有效的拖放目标时,将会触发dragleave 事件
    // dragover    //当元素或者选择的文本被拖拽到一个有效的放置目标上时,触发 dragover 事件(每几百毫秒触发一次)。
    // drop       //当一个元素或是选中的文字被拖拽释放到一个有效的释放目标位置时,drop 事件被抛出。
    // dragend    //拖放事件在拖放操作结束时触发(通过释放鼠标按钮或单击escape键)

    // 左=>右
    document.getElementById('right').ondragover = function (ev) {
      console.log('dragover event');
      ev.preventDefault();  //阻止向上冒泡
      ev.stopPropagation();
    };
    document.getElementById('right').ondrop = function (ev) {
      // 阻止默认事件
	    ev.preventDefault();
      ev.stopPropagation();  // 火狐浏览器不生效
      var id = ev.dataTransfer.getData('Text');
      // 当前拖动的dom元素
      var elem = document.getElementById(id);
      // 目标元素
      var toElem = ev.target.id;
      if (toElem == 'right') {
        // div#left元素内的子元素拖放到div#right元素内,拖放元素添加到div#right元素尾部
        this.appendChild(elem);
      } else {
        // div#left元素内的子元素位置互换,拖放元素插入到目标元素之前
        this.insertBefore(elem, document.getElementById(toElem));
      }
    }

    // 右=>左
    document.getElementById('left').ondragover = function (ev) {
      ev.preventDefault(); //阻止向上冒泡
    };
    document.getElementById('left').ondrop = function (ev) {
	    ev.preventDefault();
      ev.stopPropagation();
      var id = ev.dataTransfer.getData('Text');
      var elem = document.getElementById(id);
      var toElem = ev.target.id;
      if (toElem == 'left') {
        // div#right元素内的子元素拖放到div#left元素内,拖放元素添加到div#left元素尾部
        this.appendChild(elem);
      } else {
        // div#right元素内的子元素位置互换,拖放元素插入到目标元素之前
        this.insertBefore(elem, document.getElementById(toElem));
      }
    }

  </script>

</body>

</html>
  • 示例
    在这里插入图片描述
    在这里插入图片描述
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用JavaScript和HTML5的Drag and Drop API来实现这个功能。具体来说,您需要使用以下步骤: 1. 为可拖动元素添加dragstart事件监听器,并设置数据传输类型和数据。 2. 为容器元素添加dragover和drop事件监听器,并防止默认行为。 3. 在drop事件监听器中获取拖动的元素数据,并根据需要创建新的分组元素或将拖动元素添加到现有分组中。 4. 更新UI以反映新的分组结构。 以下是一个简单的示例代码,用于演示如何实现这个功能: HTML: ```html <div id="container"> <div class="group"></div> <div class="group"></div> <div class="group"></div> <div class="draggable" draggable="true">可拖动元素1</div> <div class="draggable" draggable="true">可拖动元素2</div> <div class="draggable" draggable="true">可拖动元素3</div> </div> ``` CSS: ```css #container { display: flex; flex-wrap: wrap; } .group { border: 1px solid black; padding: 10px; margin: 10px; min-width: 200px; } .draggable { background-color: lightblue; padding: 10px; margin: 10px; } ``` JavaScript: ```js const container = document.getElementById('container'); let activeGroup = null; // 添加dragstart事件监听器 container.addEventListener('dragstart', (event) => { if (event.target.classList.contains('draggable')) { event.dataTransfer.setData('text/plain', event.target.id); event.dataTransfer.effectAllowed = 'move'; } }); // 添加dragover事件监听器 container.addEventListener('dragover', (event) => { event.preventDefault(); const group = event.target.closest('.group'); if (group) { group.classList.add('highlight'); activeGroup = group; } }); // 添加drop事件监听器 container.addEventListener('drop', (event) => { event.preventDefault(); const groupId = activeGroup ? activeGroup.id : null; const draggableId = event.dataTransfer.getData('text/plain'); if (groupId && draggableId) { const group = document.getElementById(groupId); const draggable = document.getElementById(draggableId); if (group && draggable) { group.appendChild(draggable); } else { const newGroup = document.createElement('div'); newGroup.classList.add('group'); newGroup.id = `group-${container.children.length}`; container.appendChild(newGroup); newGroup.appendChild(draggable); } activeGroup.classList.remove('highlight'); activeGroup = null; } }); ``` 在这个示例中,我们使用了flexbox布局来创建一个容器,其中包含多个分组元素和可拖动元素。当用户将可拖动元素拖到分组元素上时,我们使用closest方法找到最接近的分组元素,并在其上添加一个类highlight来指示它正在被拖动。当用户放置可拖动元素时,我们检查分组元素是否存在,并将可拖动元素添加到现有分组中,或者创建一个新的分组并将可拖动元素添加到其中。最后,我们从分组元素中删除类highlight以及activeGroup变量的引用。 希望这可以帮助您开始实现您的功能!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值