JavaScript原生拖放詳解
拖放事件
拖放事件可以讓開(kāi)發(fā)者控制拖放操作的方方面面,關(guān)鍵的部分是確定每個(gè)事件是在哪里觸發(fā)的,有的事件在被拖放元素上觸發(fā),有的事件則在放置目標(biāo)上觸發(fā)。
當(dāng)某個(gè)元素被拖動(dòng)時(shí),會(huì)按順序觸發(fā)以下事件:
事件 | 說(shuō)明 |
---|---|
dragstart | 按住鼠標(biāo)不放開(kāi)始移動(dòng)鼠標(biāo)時(shí)觸發(fā) |
drag | 元素正在被拖動(dòng)時(shí)觸發(fā) |
dragend | 停止拖動(dòng)時(shí)觸發(fā) |
在把元素拖動(dòng)到一個(gè)有效的放置目標(biāo)上時(shí),會(huì)依次觸發(fā)以下事件:
事件 | 說(shuō)明 |
---|---|
dragenter | 被拖動(dòng)的元素進(jìn)入目標(biāo)容器時(shí)觸發(fā) |
dragover | 被拖拽元素在目標(biāo)容器內(nèi)拖動(dòng)時(shí)觸發(fā) |
dragleave | 被拖動(dòng)元素離開(kāi)目標(biāo)容器時(shí)觸發(fā) |
drop | 被拖動(dòng)元素放到了目標(biāo)容器上觸發(fā) |
如果我們想讓一個(gè)元素可以被拖放,還要為該元素添加dragabble
屬性
dataTransfer對(duì)象
dataTransfer
對(duì)象實(shí)現(xiàn)了拖動(dòng)操作中的數(shù)據(jù)傳輸,用于從被拖動(dòng)元素向放置目標(biāo)傳遞字符串?dāng)?shù)據(jù)。
因?yàn)檫@個(gè)對(duì)象是event
的屬性,所以在拖放事件的事件處理程序外部無(wú)法訪問(wèn)dataTransfer
。
該對(duì)象內(nèi)部有以下屬性和方法:
事件 | 說(shuō)明 |
---|---|
dropEffect | 可以告訴瀏覽器允許哪種放置行為,獲取當(dāng)前選定的拖放操作類型或者設(shè)置的為一個(gè)新的類型。值必須為none, copy, link、move。 |
effectAllowed | 表示對(duì)被拖動(dòng)元素是否允許dropEffect,提供所有可用的操作類型。必須是none, copy, copyLink, copyMove, link, linkMove, move, all、uninitialized之一。 |
files | 包含數(shù)據(jù)傳輸中可用的所有本地文件的列表。如果拖動(dòng)操作不涉及拖動(dòng)文件,則此屬性為空列表。 |
items | 提供一個(gè)包含所有拖動(dòng)數(shù)據(jù)列表的DataTransferItemList對(duì)象。 |
types | 一個(gè)提供dragstart事件中設(shè)置的格式的strings數(shù)組。 |
clearData() | 刪除與給定類型關(guān)聯(lián)的數(shù)據(jù)。類型參數(shù)是可選的。如果類型為空或未指定,則刪除與所有類型關(guān)聯(lián)的數(shù)據(jù)。如果指定類型的數(shù)據(jù)不存在,或者data transfer中不包含任何數(shù)據(jù),則該方法不會(huì)產(chǎn)生任何效果。 |
getData() | 檢索給定類型的數(shù)據(jù),如果該類型的數(shù)據(jù)不存在或data transfer不包含數(shù)據(jù),則返回空字符串。 |
setData() | 設(shè)置給定類型的數(shù)據(jù)。如果該類型的數(shù)據(jù)不存在,則將其添加到末尾,以便類型列表中的最后一項(xiàng)將是新的格式。如果該類型的數(shù)據(jù)已經(jīng)存在,則在相同位置替換現(xiàn)有數(shù)據(jù)。 |
setDragImage() | 用于設(shè)置自定義的拖動(dòng)圖像。 |
可拖動(dòng)能力
HTML5
在所有HTML
元素上規(guī)定了一個(gè)draggable
屬性,表示元素是否可以拖動(dòng)。
圖片和鏈接的draggable
屬性自動(dòng)被設(shè)置為true
,而其他所有元素此屬性的默認(rèn)值為false
。
如果想讓其他元素可拖動(dòng),或者不允許圖片和鏈接被拖動(dòng),都可以設(shè)置這個(gè)屬性。
示例代碼:
<!-- 禁止拖動(dòng)圖片 --> <img src="smile.gif" draggable="false" alt="Smiley face"> <!-- 讓元素可以拖動(dòng) --> <div draggable="true">...</div>
一個(gè)拖動(dòng)demo
設(shè)置一個(gè)可以拖拽的元素:
<div id="draggable" draggable="true">Drag me!</div>
#draggable { width: 100px; height: 100px; background-color: #3498db; color: #fff; text-align: center; line-height: 100px; cursor: move; position: absolute; }
const draggableElement = document.getElementById('draggable'); let offsetX, offsetY; draggableElement.addEventListener('dragstart', function (event) { // 拖動(dòng)開(kāi)始時(shí)計(jì)算鼠標(biāo)位置與元素左上角的偏移,并記錄 offsetX = event.clientX - draggableElement.getBoundingClientRect().left; offsetY = event.clientY - draggableElement.getBoundingClientRect().top; }); draggableElement.addEventListener('drag', function (event) { // 計(jì)算元素應(yīng)該移動(dòng)到的位置 const x = event.clientX - offsetX; const y = event.clientY - offsetY; // 更新元素位置 draggableElement.style.left = x + 'px'; draggableElement.style.top = y + 'px'; }); draggableElement.addEventListener('dragend', function (event) { const x = event.clientX - offsetX; const y = event.clientY - offsetY; // 拖動(dòng)結(jié)束之后更新元素的位置 draggableElement.style.left = x + 'px'; draggableElement.style.top = y + 'px'; });
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
微信小程序?qū)崿F(xiàn)圖片上傳、刪除和預(yù)覽功能的方法
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)圖片上傳、刪除和預(yù)覽功能的方法,涉及微信小程序界面布局、事件響應(yīng)及圖片操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-12-12JS 學(xué)習(xí)總結(jié)之正則表達(dá)式的懶惰性和貪婪性
這篇文章主要介紹了JS 學(xué)習(xí)總結(jié)之正則表達(dá)式的懶惰性和貪婪性的相關(guān)資料,需要的朋友可以參考下2017-07-07Javascript-Mozilla和IE中的一個(gè)函數(shù)直接量的問(wèn)題
Javascript-Mozilla和IE中的一個(gè)函數(shù)直接量的問(wèn)題...2007-01-01javascript獲取隱藏元素(display:none)的高度和寬度的方法
這篇文章主要介紹了javascript獲取隱藏元素(display:none)的高度和寬度的方法,實(shí)現(xiàn)方法比較復(fù)雜,需要的朋友可以參考下2014-06-06學(xué)習(xí)JavaScript設(shè)計(jì)模式之中介者模式
這篇文章主要為大家介紹了JavaScript設(shè)計(jì)模式中的中介者模式,對(duì)JavaScript設(shè)計(jì)模式感興趣的小伙伴們可以參考一下2016-01-01關(guān)于layer.js使用心得-向彈出框傳值問(wèn)題
這篇文章主要介紹了關(guān)于layer.js使用心得-向彈出框傳值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11微信小程序bindtap與catchtap的區(qū)別詳解
本文主要介紹了微信小程序bindtap與catchtap的區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09