使用JavaScript輕松實現(xiàn)拖拽功能
效果展示
實現(xiàn)
要實現(xiàn)該效果需要運用 HTML5 的 dragstart 拖放操作事件
通過去開啟dragstart監(jiān)聽拖放操作事件就能實現(xiàn)圖片的拖動
<div class="empty"> <div class="fill" draggable="true"></div> </div>
本例子中我們對fill盒子開啟了draggable事件,fill盒子是用來存照片的
但是這樣并不能形成一個反饋,只有單純的拖動效果,效果如下圖所示
如果想要實現(xiàn)在拖動了圖片后有一個反饋效果,我們就需要使用JavaScript去監(jiān)聽draggable的開始拖動和結束拖動事件
.hold { border: 5px solid #00ff00; }
const fill = document.querySelector(".fill"); // 拖拽開始事件 fill.addEventListener("dragstart", DragStart); function DragStart(e) { this.classList.add("hold"); } // 拖拽結束事件 fill.addEventListener("dragend", DragEnd); function DragEnd(e) { this.classList.remove("hold"); }
通過在拖動時給他添加邊框,結束時取消以實現(xiàn)一個反饋的效果
最后去監(jiān)聽empty盒子的即可根據不同事件觸發(fā)時,實現(xiàn)不同的效果
const empty = document.querySelectorAll(".empty"); empty.forEach((item) => { // 經過事件 item.addEventListener("dragover", DragOver); // 進入事件 item.addEventListener("dragenter", DragEnter); // 離開事件 item.addEventListener("dragleave", DragLeave); // 拖拽結束事件 item.addEventListener("drop", Drop); })
首先通過類名獲取所有的 .empty
元素
然后對每個獲取到的元素分別添加了一系列的事件監(jiān)聽:
item.addEventListener("dragover", DragOver);
:當元素上發(fā)生拖曳經過事件時,執(zhí)行DragOver
函數。item.addEventListener("dragenter", DragEnter);
:當元素上發(fā)生拖曳進入事件時,執(zhí)行DragEnter
函數。item.addEventListener("dragleave", DragLeave);
:當元素上發(fā)生拖曳離開事件時,執(zhí)行DragLeave
函數。item.addEventListener("drop", Drop);
:當元素上發(fā)生拖曳放下事件時,執(zhí)行Drop
函數。
具體思路就是在拖曳進入時給一個反饋,當拖曳放下時將元素放入
// 拖拽經過事件 function DragOver(e) { // 阻止默認事件 e.preventDefault(); console.log("拖拽經過"); } // 拖拽進入事件 function DragEnter(e) { console.log("拖拽進入"); this.classList.add("hovered"); } // 拖拽離開事件 function DragLeave(e) { console.log("拖拽離開"); this.classList.remove("hovered"); } // 拖拽結束事件 function Drop(e) { console.log("拖拽結束"); this.className = "empty"; this.append(fill); }
DragOver
函數:- 通過
e.preventDefault()
阻止了默認行為,以確保拖放操作按照預期進行
- 通過
DragEnter
函數:- 通過
this.classList.add("hovered")
為當前元素添加了一個名為“hovered”的類,用于進行反饋
- 通過
DragLeave
函數:- 通過
this.classList.remove("hovered")
移除了之前添加的“hovered”類。
- 通過
Drop
函數:- 通過
this.className = "empty"
將當前元素的類名重置為“empty”,接著通過this.append(fill)
將fill
元素添加到當前元素中
- 通過
最終就能實現(xiàn)效果了
完整代碼
<!-- html5特征:<!DOCTYPE html> --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>拖拽效果</title> <style> body { display: flex; justify-content: center; align-items: center; height: 100vh; } .empty { width: 150px; height: 150px; border: 3px solid #ffcccc; margin-left: 10px; background: #dafada; position: relative; } .fill { width: 140px; height: 140px; cursor: pointer; background-image: url(./image.png); background-size: cover; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } .hold { border: 5px solid #00ff00; } .hovered{ border: 3px solid #ff0000; } </style> </head> <body> <div class="empty"> <div class="fill" draggable="true"></div> </div> <div class="empty"></div> <div class="empty"></div> <div class="empty"></div> <div class="empty"></div> <script> const fill = document.querySelector(".fill"); // 拖拽開始事件 fill.addEventListener("dragstart", DragStart); function DragStart(e) { this.classList.add("hold"); } // 拖拽結束事件 fill.addEventListener("dragend", DragEnd); function DragEnd(e) { this.classList.remove("hold"); } const empty = document.querySelectorAll(".empty"); empty.forEach((item) => { // 經過事件 item.addEventListener("dragover", DragOver); // 進入事件 item.addEventListener("dragenter", DragEnter); // 離開事件 item.addEventListener("dragleave", DragLeave); // 拖拽結束事件 item.addEventListener("drop", Drop); }) // 拖拽經過事件 function DragOver(e) { // 阻止默認事件 e.preventDefault(); console.log("拖拽經過"); } // 拖拽進入事件 function DragEnter(e) { console.log("拖拽進入"); this.classList.add("hovered"); } // 拖拽離開事件 function DragLeave(e) { console.log("拖拽離開"); this.classList.remove("hovered"); } // 拖拽結束事件 function Drop(e) { console.log("拖拽結束"); this.className = "empty"; this.append(fill); } </script> </body> </html>
到此這篇關于使用JavaScript輕松實現(xiàn)拖拽功能的文章就介紹到這了,更多相關JavaScript拖拽功能內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- vue elementUi+sortable.js實現(xiàn)嵌套表格拖拽問題
- 淺析原生JavaScript中拖拽屬性draggable的使用
- JavaScript實現(xiàn)文件的拖拽上傳功能
- vue結合el-table實現(xiàn)表格行拖拽排序(基于sortablejs)
- element-plus結合sortablejs實現(xiàn)table行拖拽效果
- 手把手教你用Javascript實現(xiàn)觀察者模式
- js觀察者模式的介紹及使用
- js觀察者模式的彈幕案例
- JavaScript設計模式之觀察者模式與發(fā)布訂閱模式詳解
- javascript設計模式 – 觀察者模式原理與用法實例分析
- JavaScript 拖拽與觀察者模式的實現(xiàn)及應用小結
相關文章
淺談javascript的Array.prototype.slice.call
發(fā)現(xiàn)大多人都用了Array.prototype.slice.call(argments,0),一直不明白這句是干什么的。而昨天溫習了slice()方法,再參考Function.call(thisArg[, arg1[, arg2[, ...]]]),還是不得而知(我腦筋轉得慢:|)。2015-08-08前端實現(xiàn)讀取word文件并將其原樣式展示的幾種方案
在前端直接讀取并原樣展示Word文檔是一個相對復雜的任務,因為Word文檔的格式(如.doc或.docx)與Web技術棧使用的格式(HTML、CSS)不兼容,這篇文章主要給大家介紹了關于前端實現(xiàn)讀取word文件并將其原樣式展示的幾種方案,需要的朋友可以參考下2024-08-08解決layui使用layui-icon出現(xiàn)默認圖標的問題
今天小編就為大家分享一篇解決layui使用layui-icon出現(xiàn)默認圖標的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09javascript?ES6中set集合、map集合使用方法詳解與源碼實例
這篇文章主要介紹了javascript?ES6中set、map使用方法詳解與源碼實例,需要的朋友可以參考下2022-12-12