前端原生拖拽(drag & drop)的一点小总结

新工作中,第一个手生的功能,遇到了很多诡异的问题,今天终于解惑了。最终原因还是对代码没有透彻的了解,jquery的运用也不熟练导致的。稍稍的记录一下。

原始功能

         对项目列表中的元素进行拖拽,拖拽到一定的位置,根据放置位置做一些相应的处理(具体不分析)。实际使用时根据自己需求作相应处理就可以了。

官方参考及常用API

HTML 拖放 API - Web API 接口参考 | MDN

项目中用到的事件方法

dragstart : 开始拖拽一个元素,被拖拽元素监听事件

dragover:当被拖拽元素在目标地元素时触发 所以目标元素监听 组织默认事件

drop:被拖拽元素释放时监听  目标元素监听

属性

draggable 允许元素被拖拽 因此被拖拽元素需要设置 draggable = true

数据传递和自定义图标

DataTransfer:对象用于保存拖动并放下(drag and drop)过程中的数据。它可以保存一项或多项数据。

方法:setData()  getData()  setDragImage() 

问题及总结

① jquery 对象转 Element :出现这个问题完全是对jquery 的不熟悉,因为基本没怎么用过。

② 为什么会有①中的问题呢 因为在自定义拖拽跟随图标时 调用 setDragImage() 语法如下:

setDragImage(img, xOffset, yOffset) img 是 img | element ,按照官方说法就是可以是Image 、canvas ,也可以是Element元素,而我使用时一直使用的jquery 在查找对象,一直报不是ELement的错误,而我并没有 ①中的概念.

③ 设置了对应了Element 但是效果一直不好,因为对代码整体没熟透 ,感觉写的没问题,即使只设置了想要跟随的元素拖拽,效果依然不理想。没办法我自己写了个demo 代码如下:

因为真的不知道是哪里的原因 就胡乱怀疑 试了原生方法试jquery方法 ,最终发现都没有问题,可以实现。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Drag demo </title>
  <style>
   .container{
     width: 100%;
     display: flex;
   }
   .source{
      width: 200px;
      height: 200px;
      border: 1px red solid;
      display: flex;
    }
    input{
      width: 25px;
      height: 25px;
      margin-top: 30px;
    }
    .source img{
      width: 45px;
      height: 45px;
    }
    .target{
      width: 300px;
      border: 1px green solid;
      margin-left: 50px;
    }
  </style>
  <script src="./jquery/jquery.min.js"></script>
</head>
<body>
  <div class="container">
    <div class="source" draggable="true">
      <input type="checkbox"/>
      <h3>
        <img src="./img/img1.png" alt="">
        <span>标题标题4</span>
      </h3>
    </div>
    <div class="target"></div>
  </div>
  <script>
    // var source = document.querySelector('.source')
    // var dragImgEle = document.querySelector('h3')
    // source.ondragstart = function(e){
    //   console.log('dragStart','ondragstart')
    //   console.log('dragStart',e.target)
    //   e.dataTransfer.setDragImage(dragImgEle, 10, 10);
    // }
    $('.source').on('dragstart',function(e){
      var dragImgEle2 = $(e.target).find('h3')
      var dragImgEle3 = document.querySelector(dragImgEle2.selector)
      e.originalEvent.dataTransfer.setDragImage(dragImgEle2[0], 10, 10);

    })
    var target  = document.querySelector('.target');
    target.ondrop = function(e){
      console.log("e",'ondrop')
    }

  </script>
</body>
</html>

自己试了demo 才发现 ,写的方法都没有问题,最终最终最终是代码中的布局导致了拖拽图像的效果。写的demo 效果如下图:左侧是原元素,右侧是拖动的图像。正常来说原生拖拽是自动生成了拖拽元素的,但我的项目中无论怎么样怎么设置拖拽元素都包含左边的checkbox input 。简直到了怀疑人生。问题原因:float+padding-left 组合。 原生拖拽图像默认是拖拽的元素,但好像不是取得元素,而是元素区域的图片画像,像如下的图片checkbox 虽然不是拖拽元素,但是如果它浮动在拖拽元素的上面 然后拖拽的图像就有了他!!!

 以上这个问题,就是另外纠结到怀疑人生的问题,奇奇怪怪,找到原因了也是简单无比。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值