使用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盒子的即可根據(jù)不同事件觸發(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函數(shù)。item.addEventListener("dragenter", DragEnter);:當元素上發(fā)生拖曳進入事件時,執(zhí)行DragEnter函數(shù)。item.addEventListener("dragleave", DragLeave);:當元素上發(fā)生拖曳離開事件時,執(zhí)行DragLeave函數(shù)。item.addEventListener("drop", Drop);:當元素上發(fā)生拖曳放下事件時,執(zhí)行Drop函數(shù)。
具體思路就是在拖曳進入時給一個反饋,當拖曳放下時將元素放入
// 拖拽經過事件
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函數(shù):- 通過
e.preventDefault()阻止了默認行為,以確保拖放操作按照預期進行
- 通過
DragEnter函數(shù):- 通過
this.classList.add("hovered")為當前元素添加了一個名為“hovered”的類,用于進行反饋
- 通過
DragLeave函數(shù):- 通過
this.classList.remove("hovered")移除了之前添加的“hovered”類。
- 通過
Drop函數(shù):- 通過
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-09
javascript?ES6中set集合、map集合使用方法詳解與源碼實例
這篇文章主要介紹了javascript?ES6中set、map使用方法詳解與源碼實例,需要的朋友可以參考下2022-12-12

