放是眾所周知的最新功能,由于其方便的功能模式,可以在網頁中手動提供輸入。拖放方法可以描述為用戶從源字段中的項目列表中選擇特定 data/ 選項,將其拖放到目標字段中的過程。它是使用文檔對象模型以及來自 HTML 網頁的多個鼠標事件實現的。此功能中使用的各種事件包括拖動、拖動啟動、拖動離開、拖動輸入、拖動、拖放、拖動結束和拖動退出。
最新的拖放 (dnd) 功能中包含多個事件;讓我們一一看如下:
序號 | 事件 | 描述 |
1 | Drag | 在鼠標與要拖動的元素一起移動時拖動實體(元素或文本)。 |
2 | Dragstart | 拖放的第一步是dragstart。當用戶開始將對象拖動到所需位置時,它會被執行。 |
3 | Dragenter | 當鼠標懸停在目標元素上時使用 Dragenter 事件。 |
4 | Dragleave | 當用戶從元素釋放鼠標時,使用此事件。 |
5 | Dragover | 當鼠標習慣于在元素上時,會發生此事件. |
6 | Drop | 此事件在拖放過程結束時用于放置元素操作。 |
7 | Dragend | 即使在從元素中釋放鼠標按鈕以完成拖動過程的過程中,這也是最重要的方法之一。 |
8 | Dragexit | 此事件狀態表明元素不再進入拖動過程的緊急目標選擇元素。 |
讓我們看看將發生拖放操作的一些數據屬性:
1. dataTransfer.dropEffect [ = value ]: 此屬性用于顯示當前正在進行的操作。可以將其設置為替換已選擇的操作。其中包含的值,如copy, link, none or move.
2. dataTransfer.effectAllowed [ = value ]: 無論允許執行什么操作,都將通過此屬性返回。也可以設置為更改已選擇的操作.
3. dataTransfer.files: 此數據屬性用于獲取要拖動的文件的文件列表。
4. dataTransfer.addElement(element):它用于將已經存在的元素插入到其他元素列表中,這些元素可用于呈現拖動反饋.
5. dataTransfer.setDragImage(element, x, y): 此屬性與上面略有相同,用于更新拖動反饋并幫助更改已經存在的反饋
6. dataTransfer.clearData ( [ format ] ):它可以幫助用戶從已定義的格式中刪除數據。如果用戶省略了參數,IT 將刪除所有數據。
7. dataTransfer.setData(format, data):它是用于添加指定數據的常用屬性之一。
8. data = dataTransfer.getData(format): 拖動和拖動操作中的此屬性用于提取指定的數據。如果沒有與它相同的數據,它將返回到空字符串。
以下是定義拖放語法的幾個步驟:
選擇拖放目標: 設置可拖放
<element draggable="true">
開始拖 :
function dragStart(ev){}
放 :
function dragDrop(ev){}
以下示例將顯示拖放操作在 HTML 中的確切執行方式:
代碼:
<html>
<head>
<title>Drag and Drop Demo</title>
<script>
function allowDrop(ev) {
ev.preventDefault();
}
function dragStart(ev) {
ev.dataTransfer.setData("text", ev.target.id);
}
function dragDrop(ev) {
ev.preventDefault();
var data = ev.dataTransfer.getData("text");
ev.target.appendChild(document.getElementById(data));
}
</script>
<style>
#box {
margin: auto;
width: 30%;
width: 21%;
height:150px;
border: 2px solid blue;
padding: 2px;
}
#square1, #square2, #square3 {
float: left;
margin: 5px;
padding: 10px;
}
#square1 {
width: 30px;
height: 30px;
background-color: #BEA7CC;
}
#square2 {
width: 60px;
height: 60px;
background-color: #B5D5F5;
}
#square3 {
width: 90px;
height: 90px;
background-color:#F5B5C5 ;
}
h2 {
font-size:20px;
font-weight:bold;
text-align:center;
}
</style>
</head>
<body>
<h2>HTML DRAG AND DROP DEMO</h2>
<div id = "box">
<div id="square1" draggable="true"ondragstart="dragStart(event)"></div>
<div id="square2" draggable="true"ondragstart="dragStart(event)"></div>
<div id="square3" ondrop="dragDrop(event)" ondragover="allowDrop(event)"></div>
</div>
</body>
</html>
效果: 拖放前:
拖放后s :
在這里,我們將看到另一個示例,其中我們將圖像從一個位置移動到另一個指定位置,如下面的代碼所示:
<!DOCTYPE HTML>
<html>
<head>
<script>
function allowDrop(ev) {
ev.preventDefault();
}
function dragStart(ev) {
ev.dataTransfer.setData("text", ev.target.id);
}
function dragDrop(ev) {
ev.preventDefault();
var data = ev.dataTransfer.getData("text");
ev.target.appendChild(document.getElementById(data));
}
</script>
<style>
.divfirst {
width: 250px;
height: 150px;
padding: 10px;
border: 1px solid black;
background-color: #F5F5F5;
}
p {
font-size:20px;
font-weight:bold;
}
</style>
</head>
<body>
<p>Image Drag and Drop Demo</p>
<div class="divfirst" ondrop="dragDrop(event)" ondragover="allowDrop(event)">
<img id="drag1"
src="Jerry.jpeg" draggable="true"
ondragstart="dragStart(event)" width="250" height="150"></div>
<br>
<div class= "divfirst"ondrop="dragDrop(event)"
ondragover="allowDrop(event)"></div>
</body>
</html>
Output: 拖放前 :
拖放后:
在此示例中,我們將了解如何將文件拖放到指定位置:
<body>
<div id="filedemo" style="min-height: 150px; border: 1px solid black;"
ondragenter="document.getElementById('output').textContent = ''; event.stopPropagation(); event.preventDefault();"
ondragover="event.stopPropagation(); event.preventDefault();"
ondrop="event.stopPropagation(); event.preventDefault();
dodrop(event);">
DROP FILES HERE...
</div>
<script>
function dodrop(event)
{
var dt = event.dataTransfer;
var files = dt.files;
for (var i = 0; i < files.length; i++) {
output(" File " + i + ":\n(" + (typeof files[i]) + ") : <" + files[i] + " > " +
files[i].name + " " );
}
}
function output(text)
{
document.getElementById("filedemo").textContent += text;
}
</script>
</body>
效果:
HTML 拖放是最重要的用戶界面實體之一,將用于復制、刪除或錄制等不同目的。它適用于不同的事件和屬性,如上所列。當您選取某個對象然后將其放在指定位置時,它會執行該操作。
本文中,我們將了解HTML拖放,并借助示例了解其實現.
拖放是一個非常交互式和用戶友好的概念,它可以通過抓住對象更輕松地將對象移動到其他位置。這允許用戶在元素上單擊并按住鼠標按鈕,將其拖動到其他位置,然后釋放鼠標按鈕以將元素放到該位置。在HTML 5中,拖放更容易編碼,其中的任何元素都是可拖動的。
拖放事件:有各種拖放事件,其中一些在下面列出:
拖放 Drag and Drop實現步驟:
例1:
<!DOCTYPE HTML>
<html>
<head>
<style>
#getData {
width: 250px;
height: 200px;
padding: 10px;
border: 1px solid #4f4d4d;
}
</style>
<script>
function allowDrop(even) {
even.preventDefault();
}
function drag(even) {
even.dataTransfer.setData("text", even.target.id);
}
function drop(even) {
even.preventDefault();
var fetchData = even.dataTransfer.getData("text");
even.target.appendChild(document.getElementById(fetchData));
}
</script>
</head>
<body>
<h3>Drag the GeekforGeeks image into the rectangle:</h3>
<div id="getData"
ondrop="drop(event)"
ondragover="allowDrop(event)">
</div>
<br>
<img id="dragData"
src="gfg.png"
draggable="true"
ondragstart="drag(event)"
width="250"
height="200">
</body>
</html>
Output:
Dragging the image into the box
拖放過程的數據傳遞: 當拖放的整個過程發生時,將使用數據傳輸屬性。它用于保存從源拖放到所需位置的數據。這些是與之關聯的屬性:
例2:
<!DOCTYPE HTML>
<html>
<head>
<title>Drag and Drop box</title>
<script>
function allowDrop(ev) {
ev.preventDefault();
}
function dragStart(ev) {
ev.dataTransfer.setData("text", ev.target.id);
}
function dragDrop(ev) {
ev.preventDefault();
var data = ev.dataTransfer.getData("text");
ev.target.appendChild(document.getElementById(data));
}
</script>
<style>
#box {
margin: auto;
width: 50%;
height: 200px;
border: 3px solid green;
padding: 10px;
}
#box1,
#box2,
#box3 {
float: left;
margin: 5px;
padding: 10px;
}
#box1 {
width: 50px;
height: 50px;
background-color: #F5B5C5;
}
#box2 {
width: 100px;
height: 100px;
background-color: #B5D5F5;
}
#box3 {
width: 150px;
height: 150px;
background-color: #BEA7CC;
}
p {
font-size: 20px;
font-weight: bold;
text-align: center;
}
.gfg {
font-size: 40px;
color: #009900;
font-weight: bold;
text-align: center;
}
</style>
</head>
<body>
<div class="gfg">GeeksforGeeks</div>
<p>Drag and drop of boxes</p>
<div id="box">
<div id="box1" draggable="true"
ondragstart="dragStart(event)">
</div>
<div id="box2" draggable="true"
ondragstart="dragStart(event)">
</div>
<div id="box3" ondrop="dragDrop(event)"
ondragover="allowDrop(event)">
</div>
</div>
</body>
</html>
說明:
效果:
我們都知道普通的HTML自帶的功能相對有限,很多復雜的交互式場景,如果手動去寫功能的話會非常的復雜,而且可擴展性差,就拿HTML表格來說,對于初學者或者對于復雜的拖拽式交互編程不熟悉的話會很浪費時間,因此今天就介紹一個第三方的插件——Table-draagger,來輕松實現類似的功能。Table-draagger是用于構建可重排序的拖放表的極簡主義純Javascript庫!
https://github.com/sindu12jun/table-dragger
Table-draagger因為其以下幾個特征而讓拖拽和排序的實現變得如此簡單:
可以在npm上獲得它:
npm install table-dragger --save
或者引用壓縮的js文件
<script src="../node_modules/table-dragger/dist/table-dragger.min.js"></script>
或者嘗試開發中的不穩定版本
npm install table-dragger@next --save
請看以下代碼:
import tableDragger from 'table-dragger' tableDragger(el, options?)
<table id="table"> <thead> <tr> <th class='handle'>header1</th> <th class='handle'>header2</th> </tr> </thead> <tbody> <tr> <td>conten1</td> <td>conten2</td> </tr> </tbody> </table>
var el = document.getElementById('table'); var dragger = tableDragger(el, { mode: 'row', dragHandler: '.handle', onlyBody: true, }); dragger.on('drop',function(from, to){ console(from); console(to); });
你可以在不設置任何參數的情況下使用默認的拖拽和排序方式,當然以下是你可以配置的選項:
1、將mode設置為column,用戶拖動和排序表的列
2、將mode設置為row,用戶拖動并排序表的行
3、設置mode為free,用戶根據點擊后鼠標移動的方向拖動行或列。注意,必須在自由模式下指定dragHandler。
dragHandler是表中的拖動句柄選擇器默認情況下,在列模式下,dragHandler是表的第一行;在行模式下,則是第一列。
在行模式下將onlyBody設置為true時,用戶只能在tbody中提升行。
下面是返回對象的API
tableDragger(document.querySelector('#event-table'), { mode: 'free', dragHandler: '.handle', onlyBody: true }) .on('drag', () => { console.log('drag'); }) .on('drop', (from, to, el, mode) => { console.log(`drop ${el.nodeName} from ${from} ${mode} to ${to} ${mode}`); }) .on('shadowMove', (from, to, el, mode) => { console.log(`move ${el.nodeName} from ${from} ${mode} to ${to} ${mode}`); }) .on('out', (el, mode) => { console.log(`move out or drop ${el.nodeName} in mode ${mode}`); });
Table-draagger為我們節省了很多手動封裝表格排序和拖拽功能的時間,當然目前很多第三方框架已經實現了類似的功能,這更適用于原生的html表格,你還可以通過一些手段記憶用戶拖拽,這只是其中一種思路,Enjoy it!~
*請認真填寫需求信息,我們會在24小時內與您取得聯系。