基于Vue.js 實(shí)現(xiàn)簡(jiǎn)易拖拽指令
基于 Vue.js 實(shí)現(xiàn)簡(jiǎn)易拖拽指令
在 Web 開(kāi)發(fā)中,拖拽功能是一項(xiàng)常見(jiàn)而又實(shí)用的功能。無(wú)論是制作網(wǎng)頁(yè)游戲、實(shí)現(xiàn)可拖拽的組件,還是簡(jiǎn)單的頁(yè)面布局調(diào)整,都可能用到拖拽功能。在 Vue.js 中,我們可以通過(guò)自定義指令的方式來(lái)實(shí)現(xiàn)拖拽功能,使得代碼更加模塊化和可復(fù)用。本文將介紹如何基于 Vue.js 實(shí)現(xiàn)一個(gè)簡(jiǎn)易的拖拽指令。
1. 簡(jiǎn)介
拖拽功能的實(shí)現(xiàn)原理主要是通過(guò)鼠標(biāo)事件(mousedown、mousemove、mouseup)來(lái)控制被拖拽元素的位置。我們需要監(jiān)聽(tīng)鼠標(biāo)按下事件,計(jì)算鼠標(biāo)按下位置與被拖拽元素的偏移量,然后在鼠標(biāo)移動(dòng)事件中根據(jù)鼠標(biāo)位置不斷更新被拖拽元素的位置,最后在鼠標(biāo)抬起事件中清除事件監(jiān)聽(tīng)器。
2. 實(shí)現(xiàn)
我們首先定義一個(gè) Vue 指令,命名為 drag
。指令的作用是使元素可拖拽。
function updateElVisible(el, binding) { el.style.cursor = 'move'; el.onmousedown = function (e) { const disx = e.pageX - el.offsetLeft; const disy = e.pageY - el.offsetTop; const maxX = document.body.clientWidth - parseInt(window.getComputedStyle(el).width); const maxY = document.body.clientHeight - parseInt(window.getComputedStyle(el).height); document.onmousemove = function (e) { let x = e.pageX - disx; let y = e.pageY - disy; x = Math.min(Math.max(x, 0), maxX); y = Math.min(Math.max(y, 0), maxY); console.log(x,'xx') el.style.left = x + 'px'; el.style.top = y + 'px'; }; document.onmouseup = function () { document.onmousemove = document.onmouseup = null; }; }; } const hasDrag = { mounted(el, binding) { updateElVisible(el, binding); }, beforeUpdate(el, binding) { updateElVisible(el, binding); } }; export default { install(Vue) { Vue.directive('drag', hasDrag); } };
3. 使用方法
在 Vue 組件中使用 v-drag
指令即可使元素可拖拽。
main.js import DragDirective from './utils/drag' ..... app.use(DragDirective)
<template> <div v-drag style="width: 100px; height: 100px; background-color: #f0f0f0; position: absolute; left: 0; top: 0;"> 拖拽我 </div> </template>
4. 總結(jié)
通過(guò)自定義指令實(shí)現(xiàn)拖拽功能,可以有效地將拖拽邏輯與組件邏輯分離,使得代碼更加清晰和易于維護(hù)。但是需要注意的是,拖拽功能的實(shí)現(xiàn)涉及到一些 DOM 操作,需要謹(jǐn)慎處理,以免引發(fā)意外的副作用。
希望本文對(duì)你理解如何在 Vue.js 中實(shí)現(xiàn)拖拽功能有所幫助!
到此這篇關(guān)于基于Vue.js 實(shí)現(xiàn)簡(jiǎn)易拖拽指令的文章就介紹到這了,更多相關(guān)Vue.js 拖拽指令內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue?懸浮窗且?guī)ё詣?dòng)吸附功能實(shí)現(xiàn)demo
這篇文章主要為大家介紹了vue?懸浮窗且?guī)ё詣?dòng)吸附功能實(shí)現(xiàn)demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06詳解在vue-cli項(xiàng)目下簡(jiǎn)單使用mockjs模擬數(shù)據(jù)
這篇文章主要介紹了詳解在vue-cli項(xiàng)目下簡(jiǎn)單使用mockjs模擬數(shù)據(jù),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-10-10vue前端img訪問(wèn)鑒權(quán)后端進(jìn)行攔截的代碼示例
路由攔截是一種在用戶訪問(wèn)特定頁(yè)面之前對(duì)其進(jìn)行攔截和處理的機(jī)制,下面這篇文章主要給大家介紹了關(guān)于vue前端img訪問(wèn)鑒權(quán)后端進(jìn)行攔截的相關(guān)資料,需要的朋友可以參考下2024-03-03Vue3使用defineAsyncComponent實(shí)現(xiàn)異步組件加載的代碼示例
在 Vue 3 中,異步組件加載是一種優(yōu)化應(yīng)用性能的重要手段,通過(guò)異步加載組件,可以減少初始加載時(shí)的資源體積,從而提升應(yīng)用的加載速度和用戶體驗(yàn),本文將詳細(xì)介紹如何使用 defineAsyncComponent 實(shí)現(xiàn)異步組件加載,并提供相關(guān)的代碼示例,需要的朋友可以參考下2025-03-03iview 權(quán)限管理的實(shí)現(xiàn)
本文主要介紹了iview 權(quán)限管理,iview-admin2.0自帶權(quán)限管理。可以通過(guò)設(shè)置路由的meta對(duì)象的參數(shù)access來(lái)分配權(quán)限。感興趣的可以了解一下2021-07-07