淺析原生JavaScript中拖拽屬性draggable的使用
定義和用法
draggable 屬性規(guī)定元素是否可拖動(dòng)。
提示: 鏈接和圖像默認(rèn)是可拖動(dòng)的。
提示: draggable 屬性經(jīng)常用于拖放操作。
draggable 屬性是 HTML5 新增的。
語(yǔ)法
<element draggable="true|false|auto">
屬性值
值 | 描述 |
---|---|
true | 規(guī)定元素是可拖動(dòng)的。 |
false | 規(guī)定元素是不可拖動(dòng)的。 |
auto | 使用瀏覽器的默認(rèn)特性。 |
draggable屬性的使用
draggable既然是拖放,那么主要是兩個(gè)角色比較重要:
(1)被拖動(dòng)的元素A
(2)A被拖動(dòng)以后放置的元素B
舉例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> .one{ width: 100px; height: 100px; background-color: red; } .two{ width: 200px; height: 200px; background-color: springgreen; } </style> </head> <body> <div class="one" draggable="true">11</div> <div class="two">22</div> <script> </script> </body> </html>
效果
現(xiàn)在有兩個(gè)點(diǎn):
(1)拖動(dòng)的元素要賦予draggable屬性,屬性值為true。
(2)被拖進(jìn)的元素要在dragover和dragenter事件值中阻止默認(rèn)行為。
<div class="one" draggable="true">11</div> <div class="two" ondragover="handleOndragover(event)" ondragenter="handleOndragenter(event)">22</div> <script> function handleOndragover(e){ e.preventDefault(); } function handleOndragenter(e){ e.preventDefault(); } </script>
此時(shí)A元素可以拖入到B元素里面,但是只是視覺(jué)效果上的,一旦松開(kāi)鼠標(biāo),就恢復(fù)原狀了
draggable屬性的API
針對(duì)被拖拽元素A
(1)dragstart方法
該方法在按下鼠標(biāo)并且移動(dòng)鼠標(biāo)時(shí),會(huì)在A上觸發(fā)該方法。同時(shí)鼠標(biāo)的光標(biāo)會(huì)變成禁用的樣子,直到拖動(dòng)到允許放置A的元素上,禁用的效果就會(huì)消失。
而允許放置A的元素,就是剛剛說(shuō)的在dragover和dragenter中阻止默認(rèn)行為
舉例:當(dāng)拖動(dòng)A時(shí),改變A元素的背景顏色為藍(lán)色
<div class="one" draggable="true" ondragstart="handleOndragstart(event)">11</div> <div class="two" ondragover="handleOndragover(event)" ondragenter="handleOndragenter(event)">22</div> <script> function handleOndragstart(e){ e.target.style.backgroundColor='blue'; } function handleOndragover(e){ e.preventDefault(); } function handleOndragenter(e){ e.preventDefault(); } </script>
(2)drag方法
該方法發(fā)生在dragstart之后,只要是在拖動(dòng)過(guò)程之中,該方法就會(huì)持續(xù)觸發(fā)
<div class="one" draggable="true" ondragstart="handleOndragstart(event)" ondrag="handleOndrag(event)">11</div> <div class="two" ondragover="handleOndragover(event)" ondragenter="handleOndragenter(event)">22</div> <script> function handleOndragstart(e){ console.log('ondragstart'); } function handleOndrag(e){ console.log('ondrag'); } function handleOndragover(e){ e.preventDefault(); } function handleOndragenter(e){ e.preventDefault(); } </script>
(3)dragend方法
該方法是在拖動(dòng)結(jié)束的時(shí)候觸發(fā),也就是當(dāng)你拖拽后,松開(kāi)鼠標(biāo)的一瞬間觸發(fā)
<div class="one" draggable="true" ondragstart="handleOndragstart(event)" ondrag="handleOndrag(event)" ondragend="handleOndragend(event)">11</div> <div class="two" ondragover="handleOndragover(event)" ondragenter="handleOndragenter(event)">22</div> <script> function handleOndragstart(e){ console.log('ondragstart'); } function handleOndrag(e){ console.log('ondrag'); } function handleOndragend(e){ console.log('ondragend'); } function handleOndragover(e){ e.preventDefault(); } function handleOndragenter(e){ e.preventDefault(); } </script>
一般我們比較常用的方法就是dragstrat方法,通過(guò)在這個(gè)方法中將被推拽的元素進(jìn)行保存下來(lái),再進(jìn)行后續(xù)的操作。
拖入元素B的事件
針對(duì)于拖入元素的事件,它不需要元素具有draggable屬性,只要你想,任何元素使用這些方法都是可以的。但要記住上面所說(shuō)的那兩個(gè)方法,阻止事件默認(rèn)行為。
(1)dragenter方法
該方法是指拖拽元素A,在拖入到B之中,B所觸發(fā)的事件。當(dāng)然,任何具有draggable屬性為true的元素,拖入到B中,都會(huì)觸發(fā)該事件。
<div class="one" draggable="true" ondragstart="handleOndragstart(event)" ondrag="handleOndrag(event)" ondragend="handleOndragend(event)">11</div> <div class="two" ondragover="handleOndragover(event)" ondragenter="handleOndragenter(event)">22</div> <script> function handleOndragstart(e){ console.log('ondragstart'); } function handleOndrag(e){ console.log('ondrag'); } function handleOndragend(e){ console.log('ondragend'); } function handleOndragover(e){ e.preventDefault(); } function handleOndragenter(e){ console.log('ondragenter'); e.preventDefault(); } </script>
切記,這里事件的觸發(fā)不需要松開(kāi)鼠標(biāo)
舉例: 當(dāng)A拖入到B中,我們希望A是真正成為B的子元素:
<div class="one" draggable="true" ondragstart="handleOndragstart(event)" ondrag="handleOndrag(event)" ondragend="handleOndragend(event)">11</div> <div class="two" ondragover="handleOndragover(event)" ondragenter="handleOndragenter(event)">22</div> <script> function handleOndragstart(e) { console.log('ondragstart'); } function handleOndrag(e) { console.log('ondrag'); } function handleOndragend(e) { console.log('ondragend'); } function handleOndragover(e) { e.preventDefault(); } function handleOndragenter(e) { e.preventDefault(); e.target.appendChild(document.querySelector('.one')) } </script>
(2)dragover方法
該方法只要是,拖拽元素A在目標(biāo)元素B中移動(dòng),就會(huì)持續(xù)觸發(fā)。(就是如果A在B區(qū)域內(nèi)懸浮,就會(huì)觸發(fā))
function handleOndragover(e) { e.preventDefault(); console.log('ondragover'); }
(3)dragleave方法
該方法指的是拖拽元素A,在從目標(biāo)元素B中離開(kāi)的時(shí)候,會(huì)觸發(fā)該方法
這里記住,一定是先進(jìn)入到B,再離開(kāi)B的時(shí)候觸發(fā)該事件,也就是說(shuō)要先觸發(fā)dragenter方法,才能觸發(fā)dragleave方法
function handleOndragleave(e){ console.log('ondragleave'); }
(4)drop方法
該方法是指,拖拽元素A被放置了目標(biāo)元素B中的時(shí)候觸發(fā),那它和dragenter方法的區(qū)別在于,該方法需要鼠標(biāo)松開(kāi)才會(huì)觸發(fā)。而這個(gè)方法也是最常用的方法。
例: 當(dāng)A拖入到B中,我們希望A是真正成為B的子元素:
function handleOndrop(e){ console.log('ondrop'); e.target.appendChild(document.querySelector('.one')) }
總結(jié)
如果要實(shí)現(xiàn)拖放,需要具備以下條件
(1)拖動(dòng)的元素要賦予draggable屬性,屬性值為true。
(2)最重要的三個(gè)事件:dragstart、dragover、drop
- 被托動(dòng)元素A需要設(shè)置draggable屬性、dragstart事件
- 拖入元素B需要設(shè)置dragover、drop事件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> .one { width: 100px; height: 100px; background-color: red; } .two { width: 200px; height: 200px; background-color: springgreen; } </style> </head> <body> <div class="one" draggable="true" ondragstart="handleOndragstart(event)">11</div> <div class="two" ondragover="handleOndragover(event)" ondrop="handleOndrop(event)">22</div> <script> function handleOndragstart(e){ console.log(e); } function handleOndragover(e){ e.preventDefault(); } function handleOndrop(e){ e.target.appendChild(document.querySelector('.one')) } </script> </body> </html>
到此這篇關(guān)于淺析原生JavaScript中拖拽屬性draggable的使用的文章就介紹到這了,更多相關(guān)JavaScript拖拽屬性draggable內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 使用JavaScript輕松實(shí)現(xiàn)拖拽功能
- vue elementUi+sortable.js實(shí)現(xiàn)嵌套表格拖拽問(wèn)題
- JavaScript實(shí)現(xiàn)文件的拖拽上傳功能
- vue結(jié)合el-table實(shí)現(xiàn)表格行拖拽排序(基于sortablejs)
- element-plus結(jié)合sortablejs實(shí)現(xiàn)table行拖拽效果
- 手把手教你用Javascript實(shí)現(xiàn)觀察者模式
- js觀察者模式的介紹及使用
- js觀察者模式的彈幕案例
- JavaScript設(shè)計(jì)模式之觀察者模式與發(fā)布訂閱模式詳解
- javascript設(shè)計(jì)模式 – 觀察者模式原理與用法實(shí)例分析
- JavaScript 拖拽與觀察者模式的實(shí)現(xiàn)及應(yīng)用小結(jié)
相關(guān)文章
利用javascript中的call實(shí)現(xiàn)繼承
利用javascript中的call實(shí)現(xiàn)繼承...2007-01-01js Array對(duì)象的擴(kuò)展函數(shù)代碼
有時(shí)候我們需要對(duì)js的array對(duì)象擴(kuò)展一些功能,這里簡(jiǎn)單介紹下,方便需要的朋友2013-04-04解讀JavaScript代碼 var ie = !-[1,] 最短的IE判定代碼
這句代碼在IE9之前曾被稱(chēng)為世界上最短的IE判定代碼。代碼雖短但確包含了不少javascript基礎(chǔ)知識(shí)在里面。2011-05-05JS數(shù)組array元素的添加和刪除方法代碼實(shí)例
這篇文章主要介紹了JS數(shù)組array元素的添加和刪除方法代碼實(shí)例,本文直接給出操作代碼實(shí)例,需要的朋友可以參考下2015-06-06JavaScript中 創(chuàng)建動(dòng)態(tài) QML 對(duì)象的方法
這篇文章主要介紹了 JavaScript中 創(chuàng)建動(dòng)態(tài) QML 對(duì)象,下面文章主要分析了兩中方法,分別是從 QML 字符串創(chuàng)建對(duì)象和動(dòng)態(tài)創(chuàng)建組件以及刪除對(duì)象等方法,具有有一定的參考價(jià)值,需要的小伙伴可以參考一下2021-12-12webpack4 配置 ssr 環(huán)境遇到“document is not defined”
這篇文章主要介紹了webpack4 配置 ssr 環(huán)境遇到“document is not defined”,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10用javascript實(shí)現(xiàn)jquery的document.ready功能的實(shí)現(xiàn)代碼
實(shí)現(xiàn)jQuery的document.ready功能js代碼2009-11-11