html5 拖拽及用 js 實(shí)現(xiàn)拖拽功能的示例代碼
發(fā)布時(shí)間:2020-10-23 14:55:09 作者:Gullrye
我要評(píng)論

這篇文章主要介紹了html5 拖拽及用 js 實(shí)現(xiàn)拖拽,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
1. HTML5 拖拽
1.1 相關(guān)知識(shí)
拖拽元素:可以為元素添加 draggable="true"
來讓元素能夠被拖拽。
拖拽元素的事件監(jiān)聽:(應(yīng)用于拖拽元素)
ondragstart
當(dāng)拖拽開始時(shí)調(diào)用ondragleave
當(dāng)鼠標(biāo)離開拖拽元素時(shí)調(diào)用ondragend
當(dāng)拖拽結(jié)束時(shí)調(diào)用ondrag
整個(gè)拖拽過程都會(huì)調(diào)用
目標(biāo)元素:把元素A拖拽到元素B里,那么元素B就是目標(biāo)元素。頁(yè)面中任何一個(gè)元素都可以成為目標(biāo)元素。
目標(biāo)元素的事件監(jiān)聽:(應(yīng)用于目標(biāo)元素)
ondragenter
當(dāng)拖拽元素進(jìn)入時(shí)調(diào)用ondragover
當(dāng)拖拽元素停留在目標(biāo)元素上時(shí),就會(huì)連續(xù)一直觸發(fā)(不管拖拽元素此時(shí)是移動(dòng)還是不動(dòng)的狀態(tài))ondrop
當(dāng)在目標(biāo)元素上松開鼠標(biāo)時(shí)調(diào)用ondragleave
當(dāng)鼠標(biāo)離開目標(biāo)元素時(shí)調(diào)用
如果想讓拖拽元素在目標(biāo)元素里做點(diǎn)事情,就必須要在 ondragover()
里加event.preventDefault()
這一行代碼。
1.2 拖拽基礎(chǔ)
<!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> .box { width: 200px; height: 200px; background: green; } .box2 { position: relative; left: 300px; top: 50px; width: 300px; height: 300px; background: red; } </style> </head> <body> <div class="box" draggable="true"></div> <div class="box2"></div> <script> // HTML5 拖拽 // 應(yīng)用于拖拽元素 var box = document.querySelector('.box') box.ondragstart = function () { console.log('拖拽開始') } box.ondragleave = function () { console.log('鼠標(biāo)離開元素') } box.ondragend = function () { console.log('拖拽結(jié)束') } // box.ondrag = function () { // console.log('在拖拽'); // } // 應(yīng)用于目標(biāo)元素(想把 box 拖拽進(jìn)去的地方) var box2 = document.querySelector('.box2') box2.ondragenter = function () { console.log('進(jìn)來了') } box2.ondragleave = function () { console.log('離開了') } // 當(dāng)拖拽元素在 目標(biāo)元素上時(shí),連續(xù)觸發(fā) box2.ondragover = function (e) { // 如果想讓拖拽元素在目標(biāo)元素里做點(diǎn)事情,就必須要在 ondragover() 里加event.preventDefault()這一行代碼。 e.preventDefault() console.log('over') } box2.ondrop = function () { console.log('松開鼠標(biāo)了') } </script> </body> </html>
1.3 將 A 在 B、C 之間拖拽
<!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> .box-b { width: 250px; height: 250px; background: green; } .cell-a { float: left; width: 50px; height: 50px; margin: 5px; text-align: center; line-height: 50px; border-radius: 50%; background: red; } .box-c { width: 200px; height: 200px; margin-top: 10px; background: skyblue; } </style> </head> <body> <p>boxB</p> <div class="box-b"> <div class="cell-a" draggable="true">1</div> <div class="cell-a" draggable="true">2</div> <div class="cell-a" draggable="true">3</div> <div class="cell-a" draggable="true">4</div> <div class="cell-a" draggable="true">5</div> </div> <p>boxC</p> <div class="box-c"></div> <script> var cellA = document.querySelectorAll('.cell-a') var boxB = document.querySelector('.box-b') var boxC = document.querySelector('.box-c') var temp = null cellA.forEach((cell, index) => { // 從 boxB 拖拽到 boxC cell.ondragstart = function () { // 保持當(dāng)前拖拽的元素 temp = this } cell.ondragend = function () { temp = null } boxC.ondragover = function (e) { e.preventDefault() } boxC.ondragenter = function () { this.appendChild(temp) } // 從 boxC 拖拽到 boxB boxB.ondragover = function (e) { e.preventDefault() } boxB.ondragenter = function () { this.appendChild(temp) } }) </script> </body> </html>
效果展示
2. 用 js 實(shí)現(xiàn)拖拽
2.1 js 簡(jiǎn)單拖拽
按下鼠標(biāo)進(jìn)行簡(jiǎn)單的拖拽。
<!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> #box { position: absolute; width: 200px; height: 200px; background: green; } </style> <script> window.onload = function () { var box = document.getElementById('box') var disX = 0 var disY = 0 box.onmousedown = function (e) { var e = e || window.event disX = e.clientX - this.offsetLeft disY = e.clientY - this.offsetTop box.onmousemove = function (e) { var e = e || window.event box.style.left = e.clientX - disX + 'px' box.style.top = e.clientY - disY + 'px' } box.onmouseup = function (e) { console.log('end') this.onmousemove = null } return false } } </script> </head> <body> <div id="box"></div> </body> </html>
效果展示
2.2 帶效果的拖拽
<!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> .box { position: absolute; width: 200px; height: 200px; background: skyblue; } .box1 { position: absolute; border: 1px dashed black; opacity: 0.5; } .way-box { position: absolute; bottom: 30px; right: 30px; /* 無法選中 */ -moz-user-select: none; /* 火狐 */ -webkit-user-select: none; /* 谷歌 */ -ms-user-select: none; /* IE */ user-select: none; } </style> <script> window.onload = function () { ;(function () { var box = document.querySelector('.box') var disX, disY, temp var body = document.querySelector('body') var way1 = document.querySelector('#way1') var way2 = document.querySelector('#way2') box.onmousedown = function (e) { var e = e || window.event // 兼容性寫法 disX = e.clientX - this.offsetLeft disY = e.clientY - this.offsetTop temp = document.createElement('div') body.appendChild(temp) temp.classList.add('box') temp.classList.add('box1') // 移動(dòng)后位置會(huì)變,temp 的位置應(yīng)該與 box 位置重合 temp.style.left = e.clientX - disX + 'px' // 記得加單位! temp.style.top = e.clientY - disY + 'px' temp.onmousemove = function (e) { var e = e || window.event temp.style.left = e.clientX - disX + 'px' // 記得加單位! temp.style.top = e.clientY - disY + 'px' } temp.onmouseup = function (e) { console.log('end') this.onmousemove = null // 1 則默認(rèn)不發(fā)生實(shí)際移動(dòng) if (way2.checked) { box.style.left = e.clientX - disX + 'px' box.style.top = e.clientY - disY + 'px' } temp.style.display = 'none' this.onmouseup = null } } })() } </script> </head> <body> <div class="box"></div> <div class="way-box"> <p>請(qǐng)選擇拖拽的方式</p> <input type="radio" id="way1" name="way" checked /> <label for="way1">1</label> <input type="radio" id="way2" name="way" /> <label for="way2">2</label> </div> </body> </html>
效果展示
有時(shí)會(huì)卡頓,未解決…
到此這篇關(guān)于html5 拖拽及用 js 實(shí)現(xiàn)拖拽的文章就介紹到這了,更多相關(guān)html5 拖拽內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!
相關(guān)文章
這篇文章主要介紹了html5拖拽應(yīng)用記錄,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
2020-05-27 
基于Html5實(shí)現(xiàn)的react拖拽排序組件示例
這篇文章主要介紹了基于Html5實(shí)現(xiàn)的react拖拽排序組件示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
2018-08-13 
本文通過實(shí)例代碼給大家介紹了HTML5拖拽功能實(shí)現(xiàn)的拼圖游戲,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
2018-07-31