vue實(shí)現(xiàn)拖拽效果
vue中實(shí)現(xiàn)拖拽效果,供大家參考,具體內(nèi)容如下
首先要搞明白分清clientY pageY screenY layerY offsetY的區(qū)別
作用3(事件對(duì)象中記錄的鼠標(biāo)位置)
語法 解釋
evt.screenX 相對(duì)于屏幕的左上角為原點(diǎn)
evt.screenY
evt.clientX 相對(duì)于瀏覽器的客戶端左上角為原點(diǎn)(不計(jì)算滾動(dòng)條位置)
evt.clientY
evt.pageX 相對(duì)于瀏覽器的客戶端左上角為原點(diǎn)(計(jì)算滾動(dòng)條的位置)
evt.pageY
evt.offsetX 以自己的左上角為原點(diǎn)
evt.offsetY
evt.pageY/evt.pageX 相當(dāng)于文檔的左上角為原點(diǎn),即包括被被隱藏的距離;
evt.clientY/evt.clientX 相當(dāng)于瀏覽器可視窗口的左上角為原點(diǎn),即不包括被被隱藏的距離;
實(shí)現(xiàn)拖拽功能
<style> #app{ position: relative; /*定位*/ top: 10px; left: 10px; width: 200px; height: 200px; background: #666; /*設(shè)置一下背景*/ } </style> <body> <div id="app" @mousedown="move"> <!--綁定按下事件--> {{positionX}} {{positionY}} </div> </body> //main.js let app = new Vue({ el:'#app', data:{ positionX:0, positionY:0, }, methods:{ move(e){ let odiv = e.target; //獲取目標(biāo)元素 //算出鼠標(biāo)相對(duì)元素的位置 let disX = e.clientX - odiv.offsetLeft; let disY = e.clientY - odiv.offsetTop; document.onmousemove = (e)=>{ //鼠標(biāo)按下并移動(dòng)的事件 //用鼠標(biāo)的位置減去鼠標(biāo)相對(duì)元素的位置,得到元素的位置 let left = e.clientX - disX; let top = e.clientY - disY; //綁定元素位置到positionX和positionY上面 this.positionX = top; this.positionY = left; //移動(dòng)當(dāng)前元素 odiv.style.left = left + 'px'; odiv.style.top = top + 'px'; }; document.onmouseup = (e) => { document.onmousemove = null; document.onmouseup = null; }; } }, computed:{}, });
當(dāng)然,我們可以將它綁定為一個(gè)自定義指令,這樣的話就可以用調(diào)用指令的形式來實(shí)現(xiàn)拖拽效果,下面是定義自定義指令的代碼
在main.js中定義全局指令
Vue.directive('drag' drag: { // 指令的定義 bind(el) { let odiv = el; //獲取當(dāng)前元素 oDiv.onmousedown = (e) => { //算出鼠標(biāo)相對(duì)元素的位置 let disX = e.clientX - odiv.offsetLeft; let disY = e.clientY - odiv.offsetTop; document.onmousemove = (e)=>{ //用鼠標(biāo)的位置減去鼠標(biāo)相對(duì)元素的位置,得到元素的位置 let left = e.clientX - disX; let top = e.clientY - disY; if(left<3) { left=0; odiv.style.width="2px"; }else{odiv.style.width="auto";} if(left>innerWidth-odiv.offsetWidth) {left=innerWidth- odiv.offsetWidth;odiv.style.width="2px";} //移動(dòng)當(dāng)前元素 odiv.style.left = left + 'px'; odiv.style.top = top + 'px'; }; document.onmouseup = (e) => { document.onmousemove = null; document.onmouseup = null; }; } } });
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
基于vue中解決v-for使用報(bào)紅并出現(xiàn)警告的問題
下面小編就為大家分享一篇基于vue中解決v-for使用報(bào)紅并出現(xiàn)警告的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-03-03Vue項(xiàng)目打包、合并及壓縮優(yōu)化網(wǎng)頁響應(yīng)速度
網(wǎng)站頁面的響應(yīng)速度與用戶體驗(yàn)息息相關(guān),直接影響到用戶是否愿意繼續(xù)訪問你的網(wǎng)站,所以這篇文章主要給大家介紹了關(guān)于Vue項(xiàng)目打包、合并及壓縮優(yōu)化網(wǎng)頁響應(yīng)速度的相關(guān)資料,需要的朋友可以參考下2021-07-07Element?el-date-picker?日期選擇器的使用
本文主要介紹了Element?el-date-picker?日期選擇器的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04vue進(jìn)入頁面加載數(shù)據(jù)緩慢實(shí)現(xiàn)loading提示過程
這篇文章主要介紹了vue進(jìn)入頁面加載數(shù)據(jù)緩慢實(shí)現(xiàn)loading提示過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08vue對(duì)象復(fù)制方式(深拷貝,多層對(duì)象拷貝方式在后面)
這篇文章主要介紹了vue對(duì)象復(fù)制方式(深拷貝,多層對(duì)象拷貝方式在后面),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09vue自適應(yīng)布局postcss-px2rem詳解
這篇文章主要介紹了vue自適應(yīng)布局(postcss-px2rem)的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2022-05-05