前端vue中的拖拽知識詳解
概述
本文主要介紹前端中拖拽相關的知識以及如何在 vue3 工程里實現(xiàn)拖拽指令。
前端中的拖拽
前端中的拖拽功能是一種交互設計,允許用戶通過鼠標或觸摸操作移動頁面上的元素到不同的位置。這一功能的實現(xiàn)涉及 HTML
、CSS
和 JavaScript
的綜合運用。
HTML元素拖拽
- 拖拽元素
HTML 元素有一個draggable
屬性,接受一個布爾值,默認值為false
(不可拖拽)。
<div draggable="true">我是可拖動的</div>
- 事件處理
拖拽功能的實現(xiàn)依賴于幾個關鍵的拖放事件:
dragstart
: 當用戶開始拖動元素時觸發(fā),可以在這里設置數(shù)據(jù)傳輸(如拖動的數(shù)據(jù)類型和值)。drag
: 元素正在被拖動時連續(xù)觸發(fā)。dragend
: 用戶釋放鼠標,結束拖動時觸發(fā)。dragenter
和dragover
: 當拖動的元素進入或停留在目標區(qū)域時觸發(fā)。通常需要阻止這兩個事件的默認行為,以允許元素被放置。drop
: 在拖動元素被釋放到有效目標時觸發(fā),是接收拖動數(shù)據(jù)并執(zhí)行相應操作的地方。
示例效果
效果如下:
核心代碼
代碼如下:
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)組件的拖拽,可以封裝一個拖拽指令,再需要進行拖拽的組件上加上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); }, };
總結
到此這篇關于前端vue中的拖拽知識的文章就介紹到這了,更多相關前端vue拖拽內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Vue3造輪子之Typescript配置highlight過程
這篇文章主要介紹了Vue3造輪子之Typescript配置highlight過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07vue響應式更新機制及不使用框架實現(xiàn)簡單的數(shù)據(jù)雙向綁定問題
vue是一款具有響應式更新機制的框架,既可以實現(xiàn)單向數(shù)據(jù)流也可以實現(xiàn)數(shù)據(jù)的雙向綁定。這篇文章主要介紹了vue響應式更新機制及不使用框架實現(xiàn)簡單的數(shù)據(jù)雙向綁定問題,需要的朋友可以參考下2019-06-06vue+axios 前端實現(xiàn)的常用攔截的代碼示例
這篇文章主要介紹了vue+axios 前端實現(xiàn)的常用攔截的代碼示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-08-08