H5拖放(Drag and drop)几个方案

使用Drag随意拖拽图片到页面的任意处:
方案一:

<html>
<head>
  <title>Drag</title>
  <style type="text/css">
  </style>
</head>
<body>
  <div id="r" style="position:absolute; left:100px; top:100px; background-color:red; height:80px; width:80px;"></div>
  <div id="g" style="position:absolute; left:250px; top:100px; background-color:green; height:80px; width:80px;"></div>
  <div id="b" style="position:absolute; left:400px; top:100px; background-color:blue; height:80px; width:80px;"></div>
</body>
<script type="text/javascript">
  var Drag = {
    //当前被drag的对象
    obj: null,
    //当前所有可脱拽对象中最大的zIndex;
    maxZIndex: 100,
    //初始化 
    init: function (id) {
      var o = document.getElementById(id);
      //当onmousedown开始拖拽
      o.onmousedown = Drag.start;
      o.style.zIndex = Drag.maxZIndex;
      //alert(Drag.maxZIndex);
      Drag.maxZIndex += 1;
    },  
    start: function (e) {
      var o = Drag.obj = this;
      //lastMouseX,lastMouseY记录上次鼠标的位置
      o.lastMouseX = Drag.getEvent(e).x;
      o.lastMouseY = Drag.getEvent(e).y;
      //提高当前被推拽对象的zIndex使之处于最顶层
      o.style.zIndex = Drag.maxZIndex;
      Drag.maxZIndex += 1;
      //status = o.maxZIndex;
      //当onmousemove开始移动
      document.onmousemove = Drag.move;
      //当onmouseup终止拖拽
      document.onmouseup = Drag.end;
    },
    move: function (e) {
      //alert(this.maxZIndex);
      var o = Drag.obj;
      //dx, dy表示鼠标移动的距离
      var dx = Drag.getEvent(e).x - o.lastMouseX;
      var dy = Drag.getEvent(e).y - o.lastMouseY;
      //因为element.style.left通常返回的结果是'200px'的形式,所以要用parseInt转化
      var left = parseInt(o.style.left) + dx;
      var top = parseInt(o.style.top) + dy;
      o.style.left = left;
      o.style.top = top;
      o.lastMouseX = Drag.getEvent(e).x;
      o.lastMouseY = Drag.getEvent(e).y;
    },
    end: function (e) {
      document.onmousemove = null;
      document.onMouseup = null;
      Drag.obj = null;
    },
    //辅助函数,处理IE和FF不同的event模型
    getEvent: function (e) {
      if (typeof e == 'undefined') {
        e = window.event;
      }
      //alert(e.x?e.x : e.layerX);
      if (typeof e.x == 'undefined') {
        e.x = e.layerX; //复制了n遍,到了csdn就变成ee.x了
      }
      if (typeof e.y == 'undefined') {
        e.y = e.layerY; //复制了n遍,到了csdn就变成ee.x了
      }
      return e;
    }
  };
</script>
<script type="text/javascript">
  //测试代码开始,使三个div具有drag and drop的能力。
  Drag.init('r');
  Drag.init('g');
  Drag.init('b');
</script>
</html>

方案一效果图:
在这里插入图片描述
方案2:照片墙

<!DOCTYPE html>
<html>
<head lang="en">
  <meta charset="UTF-8">
  <title>drag案例的演示</title>
  <style>
    img {
      background: #e54d26;
      width: 300px;
      height: 200px;
      margin: 0;
      padding: 0;
    }
    #cun {
      margin: 0;
      padding: 0;
      width: 602px;
      height: 403px;
      border: 2px solid #D2D2D2;
      box-shadow: 1px 4px 8px #646464;
    }
  </style>
</head>
<section>
  <p>你可以把喜欢的图片拖放到下面的框中!</p>
  <p>也可以随意的把拖进来的图片换位置,按自己的喜欢排版</p>
</section>
<div id="cun" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<br />
<img src="banana.jpg" id="tuo1" draggable="true" ondragstart="drag(event)" />
<img src="dog.jpg" id="tuo2" draggable="true" ondragstart="drag(event)" />
<img src="dog2.jpg" id="tuo3" draggable="true" ondragstart="drag(event)" />
<img src="cat.jpg" id="tuo4" draggable="true" ondragstart="drag(event)" />
<script>
  function allowDrop(ev) {
    //不执行默认处理(拒绝被拖放)
    ev.preventDefault();
  }
  function drag(ev) {
    //使用setData(数据类型,携带的数据)
    //方法将要拖放的数据存入datatransfer对象
    //    var dragid = document.getElementById(id).value;
    ev.dataTransfer.setData("Text", ev.target.id);
  }
  function drop(ev) {
    //不执行默认处理(拒绝被拖放)
    ev.preventDefault();
    //使用getData()获取到数据,然后赋值给data
    var data = ev.dataTransfer.getData("Text");
    //判断target的id是否和下面图片中的id相等的 相等说明是要把两张图片换一下
    var flag = 0;
    for (var i = 0; i < document.getElementsByTagName("img").length; i++) {
      if (document.getElementsByTagName("img")[i].id == ev.target.id) {
        flag = 1;
      }
    }
    if (flag == 1) {
      var temp = document.getElementById(data).src;
      document.getElementById(data).src = document.getElementById(ev.target.id).src;
      document.getElementById(ev.target.id).src = temp;
    } else {
      //使用appendChild方法把拖动的节点放到元素节点中成为他的子节点
      ev.target.appendChild(document.getElementById(data));
    }
  }
</script>
</body>
</html>

方案二效果:
在这里插入图片描述
方案三:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1,
    maximum-scale=1, user-scalable=no">
  <link rel="icon" href="https://xlzy520.cn/icons/lo.ico">
  <title>drag</title>
  <style>
    html,
    body {
      margin: 0;
      padding: 0;
      background: #000;
    }
    #dance {
      cursor: pointer;
      height: 30px;
      width: 30px;
      background-color: aqua
    }
  </style>
</head>
<body ondrop="drop(event)" ondragover="allowDrop(event)" ontouchmove="drop(event) ">
  <div class="main">
    <img style="position: absolute;left: 0;top: 0;" src="" draggable="true" id="dance" ondragstart="drag(event)"
      ontouchstart="drag(event)">
  </div>
  <script>
    (function () {
      document.getElementsByTagName('body')[0].style.height = window.innerHeight + 'px'
      document.getElementsByTagName('body')[0].style.width = window.innerWidth + 'px'
    })()
    let dance = document.getElementById('dance')
    let dragOffset = {
      X1: null,
      Y1: null
    }
    function drag(e) {
      if (e.type === 'dragstart') { //根据e.type判断是PC端还是移动端
        e = event ? event : e
      } else {
        if (event.touches) {
          e = event.touches[0] ? event.touches[0] : event;
        }
      }
      dragOffset.X1 = e.clientX - parseInt(dance.style.left)
      dragOffset.Y1 = e.clientY - parseInt(dance.style.top)
      // 鼠标点击的位置在整个页面上的坐标是(e.clientX,e.clientY)
      // 鼠标点击的位置在图片的位置坐标为(X1,Y1)
    }
    function drop(e) {
      if (e.type === 'drop') {
        e = event ? event : e
        e.preventDefault()
      } else {
        if (event.touches) {
          e = event.touches[0] ? event.touches[0] : event;
        }
      }
      dance.style.left = e.clientX - dragOffset.X1 + 'px'
      dance.style.top = e.clientY - dragOffset.Y1 + 'px'
      // 根据鼠标点击的位置在整个页面上的坐标和在图片上的坐标来确定整个图片的坐标
    }
    function allowDrop(e) {
      e = event ? event : e
      // 移动过程中触发
    }
    document.ondragover = function () {
      //取消事件的默认行为
      return false;
    }
    document.ondrop = function () {
      //取消事件的默认行为
      return false
    }
  </script>
</body>
</html>

方案三效果图:
在这里插入图片描述
案例四:

<!DOCTYPE html>
<html lang="en">
<head>
  <title></title>
  <style type="text/css">
    div>div {
      display: inline-block;
      padding: 10px;
      background-color: #aaa;
      margin: 3px;
    }
  </style>
</head>
<body>
  <div style="width:600px;border:1px solid black;">
    <h2>可将喜欢的项目拖到收藏夹</h2>
    <div draggable="true" ondragstart="dsHandler(event)">勿忘心安</div>
    <div draggable="true" ondragstart="dsHandler(event)">照顾自己</div>
    <div draggable="true" ondragstart="dsHandler(event)">Number 9</div>
    <div draggable="true" ondragstart="dsHandler(event)">崇拜</div>
  </div>
  <div id="dest" style="width:400px;height:400px;border:1px solid black;float:left;">
    <h2 οndragleave="return false;">收藏夹</h2>
  </div>
  <div id="gb" draggable="false" style="width:100px;height:100px;border:1px solid red;float:left;">我是垃圾桶</div>
  <script>
    var dest = document.getElementById("dest");
    var dsHandler = function (evt) {
      evt.dataTransfer.setData("text/plain", "<item>" + evt.target.innerHTML);
      console.log(evt.dataTransfer.setData("text/plain", "<item>" + evt.target.innerHTML));
    }
    dest.ondrop = function (evt) {
      var text = evt.dataTransfer.getData("text/plain");
      if (text.indexOf("<item>") == 0) {
        var newEle = document.createElement("div");
        newEle.id = new Date().getUTCMilliseconds();
        newEle.innerHTML = text.substring(6);
        newEle.draggable = "true";
        newEle.ondragstart = function (evt) {
          evt.dataTransfer.setData("text/plain", "<remove>" + newEle.id);
          console.log(evt.dataTransfer.setData("text/plain", "<remove>" + newEle.id));
        }
        dest.appendChild(newEle);
      }
    }
    document.getElementById("gb").ondrop = function (evt) {
      var id = evt.dataTransfer.getData("text/plain");
      if (id.indexOf("<remove>") == 0) {
        var target = document.getElementById(id.substring(8));
        dest.removeChild(target);
      }
    }
    document.ondragover = function (evt) {
      return false;
    }
    document.ondrop = function (evt) {
      return false;
    }
  </script>
</body>
</html>

效果图:
在这里插入图片描述
案例五:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    .main {
      display: flex;
      justify-content: space-around;
    }
    .left {
      width: 300px;
      height: 500px;
      margin-right: 10px;
      border: 1px solid red;
      text-align: center;
      box-sizing: border-box;
      padding: 1px;
    }
    .right {
      width: 300px;
      height: 500px;
      border: 1px solid lightseagreen;
      text-align: center;
      box-sizing: border-box;
      padding: 1px;
    }
    .txt {
      border: 1px solid gray;
      margin: 1px;
      padding: 5px;
      cursor: move;
    }
  </style>
</head>
<body>
  <main class="main">
    <div class="left" id="left">
      <div class="txt-show">左边区域</div>
      <div id='txt1' draggable="true" class="dragable txt txt1">可移动的文字一</div>
      <div id='txt2' draggable="true" class="dragable txt txt2">可移动的文字二</div>
      <div id='txt3' draggable="true" class="dragable txt txt3">可移动的文字三</div>
      <div id='txt4' draggable="true" class="dragable txt txt4">可移动的文字四</div>
      <div id='txt5' draggable="true" class="dragable txt txt5">可移动的文字五</div>
    </div>
    <div class="right" id='right'>
      <div class="txt-show">右边区域</div>
    </div>
  </main>
  <script>
    let txtObj = document.getElementsByClassName('txt')
    for (let i = 0; i < txtObj.length; i++) {
      txtObj[i].ondragstart = handle_start
      txtObj[i].ondrag = handle_drag
      txtObj[i].ondragend = handle_end
    }
    function handle_start(e) {
      e.dataTransfer.setData('Text', e.target.id)
      console.log('handle_start-拖动开始')
    }
    function handle_drag(e) {
      console.log('handle_drag-拖动中')
    }
    function handle_end(e) {
      console.log('handle_end-拖动结束')
    }
    let target = document.getElementById('right')
    target.ondragenter = handle_enter
    target.ondragover = handle_over
    target.ondragleave = handle_leave
    target.ondrop = handle_drop
    let leftTarget = document.getElementById('left')
    leftTarget.ondragenter = handle_enter
    leftTarget.ondragover = handle_over
    leftTarget.ondragleave = handle_leave
    leftTarget.ondrop = handle_drop
    function handle_enter(e) {
      e.preventDefault()
      console.log('handle_enter-进入目的地')
    }
    function handle_over(e) {
      e.preventDefault()
      let returnObj = e.dataTransfer.getData('Text')
      console.log(returnObj + '-handle_over-在目的地范围内')
    }
    function handle_leave(e) {
      e.preventDefault()
      let returnObj = e.dataTransfer.getData('Text')
      console.log(returnObj)
      console.log('handle_leave-没有放下就离开目的地')
    }
    function handle_drop(e) {
      e.stopPropagation(); // 不再派发事件。解决Firefox浏览器,打开新窗口的问题。
      e.preventDefault()
      let returnObj = e.dataTransfer.getData('Text')
      if (returnObj) {
        e.target.appendChild(document.getElementById(returnObj))
      }
      console.log(returnObj + '-handle_drop-在目的地区释放')
    }
  </script>
</body>
</html>

效果图五
在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Friday--星期五

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

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

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

打赏作者

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

抵扣说明:

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

余额充值