前端vue中的拖拽知識詳解
概述
本文主要介紹前端中拖拽相關(guān)的知識以及如何在 vue3 工程里實現(xiàn)拖拽指令。
前端中的拖拽
前端中的拖拽功能是一種交互設(shè)計,允許用戶通過鼠標(biāo)或觸摸操作移動頁面上的元素到不同的位置。這一功能的實現(xiàn)涉及 HTML、CSS 和 JavaScript 的綜合運(yùn)用。
HTML元素拖拽
- 拖拽元素
HTML 元素有一個draggable屬性,接受一個布爾值,默認(rèn)值為false(不可拖拽)。
<div draggable="true">我是可拖動的</div>
- 事件處理
拖拽功能的實現(xiàn)依賴于幾個關(guān)鍵的拖放事件:
dragstart: 當(dāng)用戶開始拖動元素時觸發(fā),可以在這里設(shè)置數(shù)據(jù)傳輸(如拖動的數(shù)據(jù)類型和值)。drag: 元素正在被拖動時連續(xù)觸發(fā)。dragend: 用戶釋放鼠標(biāo),結(jié)束拖動時觸發(fā)。dragenter和dragover: 當(dāng)拖動的元素進(jìn)入或停留在目標(biāo)區(qū)域時觸發(fā)。通常需要阻止這兩個事件的默認(rèn)行為,以允許元素被放置。drop: 在拖動元素被釋放到有效目標(biāo)時觸發(fā),是接收拖動數(shù)據(jù)并執(zhí)行相應(yīng)操作的地方。
示例效果
效果如下:

核心代碼
代碼如下:
dragClass.addEventListener("dragstart", (e) => {
const node = e.target.cloneNode(true);
e.dataTransfer.setData("cloneNode", node.outerHTML);
});
dragClass.addEventListener("dragend", (e) => {
e.dataTransfer.clearData();
});
dropDom.addEventListener("dragover", (e) => {
if (e.target.className == "draggable") {
e.preventDefault();
}
});
dropDom.addEventListener("drop", (e) => {
e.preventDefault();
const node = e.dataTransfer.getData("cloneNode");
e.target.innerHTML = node;
const originCellNode = e.dataTransfer.getData("text/html");
if (originCellNode) {
originCellNode.removeChild(originCellNode);
}
e.dataTransfer.clearData("cloneNode");
});
dragTableCell.addEventListener("dragstart", (e) => {
const node = e.target.cloneNode(true);
e.dataTransfer.setData("cloneNode", node.outerHTML);
e.dataTransfer.setData("text/html", e.target.parentNode.outerHTML);
});
參考地址
參考地址:https://github.com/Jinuss/blog/blob/main/docs/Demo/03.drag.html
vue3 拖拽指令封裝
在 vue3 中實現(xiàn)組件的拖拽,可以封裝一個拖拽指令,再需要進(jìn)行拖拽的組件上加上v-drag即可。
拖拽指令實現(xiàn)實現(xiàn)如下:
export const drag = {
mounted(el) {
el.style.position = "absolute";
el.style.cursor = "move";
let startX, startY, initialX, initialY;
const dragStart = (e) => {
startX = e.clientX;
startY = e.clientY;
initialX = el.offsetLeft;
initialY = el.offsetTop;
document.addEventListener("mousemove", dragMove);
document.addEventListener("mouseup", dragEnd);
};
const dragMove = (e) => {
const dx = e.clientX - startX;
const dy = e.clientY - startY;
const newX = initialX + dx;
const newY = initialY + dy;
const maxX = window.innerWidth - el.offsetWidth;
const maxY = window.innerHeight - el.offsetHeight;
/**邊界檢查 */
el.style.left = `${Math.min(Math.max(newX, 0), maxX)}px`;
el.style.top = `${Math.min(Math.max(newY, 0), maxY)}px`;
};
const dragEnd = () => {
document.removeEventListener("mousemove", dragMove);
document.removeEventListener("mouseup", dragEnd);
};
el.addEventListener("mousedown", dragStart);
},
};總結(jié)
到此這篇關(guān)于前端vue中的拖拽知識的文章就介紹到這了,更多相關(guān)前端vue拖拽內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue3 的ref和reactive的用法和區(qū)別示例解析
ref和reactive是Vue3中用來實現(xiàn)數(shù)據(jù)響應(yīng)式的API,一般情況下,ref定義基本數(shù)據(jù)類型,reactive定義引用數(shù)據(jù)類型,本文給大家介紹Vue3 的ref和reactive的用法和區(qū)別,感興趣的朋友一起看看吧2023-10-10
Vue+ECharts+高德地圖API實現(xiàn)天氣預(yù)報數(shù)據(jù)可視化的教程
所謂數(shù)據(jù)可視化,我們可以理解為從宏觀角度來看一眼就能看出來整個數(shù)據(jù)的占比,走向,對于數(shù)據(jù)可視化,很多互聯(lián)網(wǎng)公司是很看重這一塊的,包括大廠,本就將給大家介紹如何通過Vue+ECharts+高德地圖API實現(xiàn)天氣預(yù)報數(shù)據(jù)可視化2023-06-06

