詳解Html5關於拖拽(Drag 和 drop)的使用和事件

拖放(Drag 和 drop)是 HTML5 標準的組成部分。在 HTML5 中,拖放是標準的一部分,任何元素都能夠拖放。

1. 相關事件

drag

拖動元素或選擇文本時觸發此事件。

dragend

當拖動操作結束時(釋放鼠標按鈕或按下退出鍵),會觸發此事件。

dragenter

當拖動的元素或選擇文本輸入有效的放置目標時,會觸發此事件。

dragexit

當元素不再是拖動操作的選擇目標時觸發此事件。

dragleave

當拖動的元素或文本選擇離開有效的放置目標時,會觸發此事件。

dragover

當將元素或文本選擇拖動到有效放置目標(每幾百毫秒)上時,會觸發此事件。

dragstart

當用戶開始拖動元素或選擇文本時觸發此事件。

drop

當在有效放置目標上放置元素或選擇文本時觸發此事件。

2. 案例解析

<!DOCTYPE HTML>
<html>
<head>
  <style type="text/css">
    #div1 {
      width: 450px;
      height: auto;
      padding: 30px;
      border: 1px solid #aaaaaa;
    }

    #div1 img {
     
      height: 100px;
    }
  </style>
  <script type="text/javascript">
    function allowDrop(ev) {
      ev.preventDefault();
    }

    function drag(ev) {
      ev.dataTransfer.setData("Text", ev.target.id);
    }

    function drop(ev) {
      ev.preventDefault();
      var data = ev.dataTransfer.getData("Text");
      ev.target.appendChild(document.getElementById(data));
    }
  </script>
</head>
<body>

<p>請把圖片拖放到矩形中:</p>

<div id="div1" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<br />
<img id="drag1" src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1591354852841&di=14fb86558db016cc05e2c6b80aea4249&imgtype=0&src=http%3A%2F%2Fimg.improve-yourmemory.com%2Fpic%2F78739853e99028b1705d953bf722b341-4.jpg"
     draggable="true" ondragstart="drag(event)" width="100px" />
<img id="drag2" src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1591354852841&di=14fb86558db016cc05e2c6b80aea4249&imgtype=0&src=http%3A%2F%2Fimg.improve-yourmemory.com%2Fpic%2F78739853e99028b1705d953bf722b341-4.jpg"
     draggable="true" ondragstart="drag(event)" width="100px" />
<img id="dra3" src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1591354852841&di=14fb86558db016cc05e2c6b80aea4249&imgtype=0&src=http%3A%2F%2Fimg.improve-yourmemory.com%2Fpic%2F78739853e99028b1705d953bf722b341-4.jpg"
     draggable="true" ondragstart="drag(event)" width="100px" />
<img id="drag4" src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1591354852841&di=14fb86558db016cc05e2c6b80aea4249&imgtype=0&src=http%3A%2F%2Fimg.improve-yourmemory.com%2Fpic%2F78739853e99028b1705d953bf722b341-4.jpg"
     draggable="true" ondragstart="drag(event)" width="100px" />

</body>
</html>

拖動後的效果

首先設置元素爲可拖放

首先,爲了使元素可拖動,把 draggable 屬性設置爲 true :

<img draggable="true" />

拖動之後把被拖的對象保存進這個方法

ondragstart 屬性調用了一個函數,drag(event),它規定了被拖動的數據。

dataTransfer.setData() 方法設置被拖數據的數據類型和值:

function drag(ev){
  ev.dataTransfer.setData("Text",ev.target.id);
}

當拖到指定位置執行相關函數

被放的元素   ondragover  監聽時,阻止默認使其可以放元素

監聽放置 ondrop 去執行你要做的事情,比如上一個例子,就是把剛纔保存的id的dom,然後放入div中

  • 調用 preventDefault() 來避免瀏覽器對數據的默認處理(drop 事件的默認行爲是以鏈接形式打開)
  • 通過 dataTransfer.getData("Text") 方法獲得被拖的數據。該方法將返回在 setData() 方法中設置爲相同類型的任何數據。
  • 被拖數據是被拖元素的 id ("drag1")
  • 把被拖元素追加到放置元素(目標元素)中

下邊這個案例更好說明,拖放事件

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title></title>
  <style>
    #draggable {
      width: 200px;
      height: 20px;
      text-align: center;
      background: white;
    }

    .dropzone {
      width: 200px;
      height: 20px;
      background: blueviolet;
      margin-bottom: 10px;
      padding: 10px;
    }
  </style>
</head>
<body>
<div class="dropzone">
  <div id="draggable" draggable="true" ondragstart="event.dataTransfer.setData('text/plain',null)">
    This div is draggable
  </div>
</div>
<div class="dropzone"></div>
<div class="dropzone"></div>
<div class="dropzone"></div>
<script type="text/javascript">
  var dragged;

  /* events fired on the draggable target */
  document.addEventListener("drag", function(event) {

  }, false);

  document.addEventListener("dragstart", function(event) {
    // store a ref. on the dragged elem
    dragged = event.target;
    // make it half transparent
    event.target.style.opacity = .5;
  }, false);

  document.addEventListener("dragend", function(event) {
    // reset the transparency
    event.target.style.opacity = "";
  }, false);

  /* events fired on the drop targets */
  document.addEventListener("dragover", function(event) {
    // prevent default to allow drop
    event.preventDefault();
  }, false);

  document.addEventListener("dragenter", function(event) {
    // highlight potential drop target when the draggable element enters it
    if (event.target.className == "dropzone") {
      event.target.style.background = "purple";
    }

  }, false);

  document.addEventListener("dragleave", function(event) {
    // reset background of potential drop target when the draggable element leaves it
    if (event.target.className == "dropzone") {
      event.target.style.background = "";
    }

  }, false);

  document.addEventListener("drop", function(event) {
    // prevent default action (open as link for some elements)
    event.preventDefault();
    // move dragged elem to the selected drop target
    if (event.target.className == "dropzone") {
      event.target.style.background = "";
      dragged.parentNode.removeChild( dragged );
      event.target.appendChild( dragged );
    }
  }, false);
</script>
</body>
</html>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章