拖放(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>