JS的拖拽屬性draggable詳解
摘要
作為h5新增的屬性draggable,它能夠給與一切的html元素拖動(dòng)的效果。而在這個(gè)屬性之下,也有著關(guān)于拖動(dòng)效果的各個(gè)方法。
而這一篇文章,主要就是說一下關(guān)于draggable屬性的使用以及工作場景。
1.了解draggable屬性的使用
對我來講,我希望在學(xué)習(xí)一個(gè)知識(shí)的時(shí)候,最開始就有顯而易見的效果,所以我先寫一個(gè)能夠讓人感受到draggable屬性作用的例子:
對于拖拽,常見的場景一定有兩個(gè)角色:
(1)拖動(dòng)的元素A
(2)A被拖進(jìn)的元素
現(xiàn)在我們在body中創(chuàng)建兩個(gè)元素:
<body> <div id="Adiv" class="A"> A---拖拽的元素 </div> <div id="Bdiv" class="B"> B---A被拖進(jìn)的元素 </div> </body>
現(xiàn)在我們牢記兩個(gè)點(diǎn):
(1)拖動(dòng)的元素要賦予draggable屬性,屬性值為true
(2)被拖進(jìn)的元素要在dragover和dragenter事件值中阻止默認(rèn)行為。先不需要知道這兩個(gè)事件是做什么的。我們就先這樣寫!
<body> <div draggable="true" id="Adiv" class="A"> A---拖拽的元素 </div> <div id="Bdiv" class="B"> B---A被拖進(jìn)的元素 </div> </body> <script> Bdiv.ondragover = function(e){ e.preventDefault(); } Bdiv.ondragenter = function(e){ e.preventDefault(); } </script>
此時(shí)A元素就是可以拖入到B元素里面
(這個(gè)時(shí)候注意了,僅僅是效果上的拖入,不可能讓A真正的成為B的子元素,松開鼠標(biāo)后還是會(huì)恢復(fù)原樣的)
2.拖動(dòng)元素A的事件
Ok,現(xiàn)在知道了兩個(gè)重要的角色A和B,現(xiàn)在我們先針對于A,在它拖動(dòng)的過程中,我們可以控制的事件有哪些:
(1)dragstart方法:
該方法在按下鼠標(biāo)并且移動(dòng)鼠標(biāo)時(shí),會(huì)在A上觸發(fā)該方法。同時(shí)鼠標(biāo)的光標(biāo)會(huì)變成禁用的樣子,直到拖動(dòng)到允許放置A的元素上,禁用的效果就會(huì)消失
而允許放置A的元素,就是剛剛說的在dragover和dragenter中阻止默認(rèn)行為
現(xiàn)在我們用一個(gè)例子來演示這個(gè)方法,我希望在拖動(dòng)A的時(shí)候,能讓A本身變成黃色背景:
Adiv.ondragstart = function(){ this.style.backgroundColor = 'yellow' }
(2)drag方法
該方法發(fā)生在dragstart之后,只要時(shí)在拖動(dòng)過程之中,該方法就會(huì)持續(xù)觸發(fā)
Adiv.ondrag = function(){ console.log('drag事件'); }
(3)dragend方法
該方法是在拖動(dòng)結(jié)束的時(shí)候觸發(fā),也就是當(dāng)你拖拽后,松開鼠標(biāo)的一瞬間觸發(fā)。
上面的三個(gè)方法,就是針對于被拖拽的元素的。也就是賦予draggable屬性為true的元素。
一般我們比較常用的方法就是dragstrat方法,通過在這個(gè)方法中將被推拽的元素進(jìn)行保存下來,再進(jìn)行后續(xù)的操作。
3.拖入元素B的事件
針對于拖入元素的事件,它不需要元素具有draggable屬性,只要你想,任何元素使用這些方法都是可以的。但要記住上面所說的那兩個(gè)方法,阻止事件默認(rèn)行為。
(1)dragenter方法
該方法是指拖拽元素A,在拖入到B之中,B所觸發(fā)的事件。當(dāng)然,任何具有draggable屬性為true的元素,拖入到B中,都會(huì)觸發(fā)改事件。
切記,這里事件的觸發(fā)不需要松開鼠標(biāo)
現(xiàn)在我們用一個(gè)例子來說明,當(dāng)A拖入到B中,我們希望A是真正成為B的子元素:
Bdiv.ondragenter = function(e){ e.preventDefault(); this.appendChild(Adiv); }
(2)dragover方法
該方法只要是,拖拽元素A在目標(biāo)元素B中移動(dòng),就會(huì)持續(xù)觸發(fā)。
Bdiv.ondragover = function(e){ console.log('dragover事件'); e.preventDefault(); }
(3)dragleave方法
該方法指的是拖拽元素A,在從目標(biāo)元素B中離開的時(shí)候,會(huì)觸發(fā)該方法
這里記住,一定是先進(jìn)入到B,再離開B的時(shí)候觸發(fā)該事件,也就是說要先觸發(fā)dragenter方法,才能觸發(fā)dragleave方法
(4)drop方法
該方法是指,拖拽元素A被放置了目標(biāo)元素B中的時(shí)候觸發(fā),那它和dragenter方法的區(qū)別在于,該方法需要鼠標(biāo)松開才會(huì)觸發(fā)。而這個(gè)方法也是最常用的方法。
到此這篇關(guān)于JS的拖拽屬性draggable的文章就介紹到這了,更多相關(guān)js拖拽屬性draggable內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JS中的==運(yùn)算: [''''] == false —>true
這篇文章主要介紹了JS中的==運(yùn)算: [''] == false —>true的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07JS實(shí)現(xiàn)可改變列寬的table實(shí)例
本文為大家詳細(xì)介紹下通過JS實(shí)現(xiàn)可改變列寬的table,具體的思路及代碼如下,感興趣的朋友可以參考下哈,希望對大家有所幫助2013-07-07JavaScript進(jìn)階(二)詞法作用域與作用域鏈實(shí)例分析
這篇文章主要介紹了JavaScript詞法作用域與作用域鏈,結(jié)合實(shí)例形式分析了JavaScript詞法作用域與作用域鏈相關(guān)概念、原理與操作注意事項(xiàng),需要的朋友可以參考下2020-05-05小程序上傳文件至云存儲(chǔ)的實(shí)現(xiàn)
在小程序云開發(fā)中,要實(shí)現(xiàn)上傳文件至云存儲(chǔ),有兩種方案:云函數(shù)和HTTP?API,本文主要講講如何使用HTTP?API實(shí)現(xiàn)小程序外上傳文件至云存儲(chǔ),感興趣的可以了解一下2022-01-01javascript 通用簡單的table選項(xiàng)卡實(shí)現(xiàn)
鑒于UI妹妹每次交付過來的選項(xiàng)卡都夾帶了多多少少的js,而且每遇到選項(xiàng)卡就加一點(diǎn)js,造成垃圾低劣代碼逐漸堆積過多了,一直想做一個(gè)通用簡潔的選項(xiàng)卡庫。2010-05-05