Vue3自定義drag指令詳解
新增drag.js文件
// 拖拽的指令
class Drap {
static zIndex = 1;
constructor(el, option = {}) {
this.el = el;
this.x = 0;
this.y = 0;
this.option = option;
this.init();
this.timeOutEvent = 0;
this.ele = null
}
init() {
this.setEleStyle(this.option || {});
//拖拽事件賦值給頭部標(biāo)簽,此處代碼可實(shí)現(xiàn)僅在移動(dòng)頭部時(shí)操作整個(gè)DOM塊
// this.ele = this.el.getElementsByClassName('header')[0]
// if(this.ele){
// this.ele.onmousedown = (e) => {
// this.onMouseDown(e)
// this.el.setCapture && this.el.setCapture() //全局捕獲
// }
// }else{
// this.el.onmousedown = (e) => {
// this.onMouseDown(e)
// this.el.setCapture && this.el.setCapture() //全局捕獲
// }
// }
this.el.onmousedown = (e) => {
this.gtouchstart(e)
}
}
//樣式設(shè)置
setEleStyle(option) {
for (const key in option) {
this.el.style[key] = option[key]
}
}
//按下ele
onMouseDown(e) {
let zIndex = getComputedStyle(this.el).getPropertyValue('z-index');
zIndex = isNaN(zIndex) ? 1 : zIndex
Drap.zIndex = Drap.zIndex > zIndex ? Number(Drap.zIndex) + 1 : Number(zIndex) + 1
this.setEleStyle({
"zIndex": Drap.zIndex,
position: 'fixed',
'cursor': 'move'
})
this.x = e.clientX - this.el.offsetLeft;
this.y = e.clientY - this.el.offsetTop;
document.onmousemove = (e) => this.onMouseMove(e);
document.onmouseup = (e) => this.onMouseUp(e)
}
//移動(dòng)move
onMouseMove(e) {
this.gtouchmove()
let X = e.clientX - this.x
let Y = e.clientY - this.y
//下面代碼操作DOM元素不會(huì)移出屏幕,-25應(yīng)更換為-10,按自己需求設(shè)置
if (X < 0) {
X = 0
} else if (X > document.documentElement.clientWidth - this.el.offsetWidth) {
X = document.documentElement.clientWidth - this.el.offsetWidth - 25
}
if (Y < 0) {
Y = 0
} else if (Y > document.documentElement.clientHeight - this.el.offsetHeight) {
Y = document.documentElement.clientHeight - this.el.offsetHeight - 25
}
this.el.style.left = X + 'px'
this.el.style.top = Y + 'px'
}
//釋放
onMouseUp(e) {
this.gtouchend()
document.onmousemove = null
document.onmouseup = null
this.setEleStyle({
'cursor': 'pointer'
})
this.el.setCapture && this.el.setCapture() //釋放全局捕獲
}
gtouchstart(e) {
this.timeOutEvent = setTimeout(() => {
this.timeOutEvent = 0;
//真正長(zhǎng)按后應(yīng)該執(zhí)行的內(nèi)容
console.log("長(zhǎng)按事件觸發(fā)發(fā)");
this.onMouseDown(e)
this.el.setCapture && this.el.setCapture() //全局捕獲
}, 200);
return false;
}
gtouchmove() {
clearTimeout(this.timeOutEvent); //清除定時(shí)器
this.timeOutEvent = 0;
console.log("取消了");
}
gtouchend() {
clearTimeout(this.timeOutEvent); //清除定時(shí)器
if (this.timeOutEvent !== 0) {
console.log("你這是點(diǎn)擊,不是長(zhǎng)按");
}
return false;
}
}
const drag = {
mounted(el, binding) {
new Drap(el, binding.value || {})
}
}
export default drag
main.js添加全局導(dǎo)入
import drag from './directives/drag.js'
app.directive('drag', drag)
頁(yè)面代碼使用v-drag
注:mini-dialog為自定義彈框組件
<div class="m-dia" v-if="dialogShow" v-drag>
<mini-dialog @closed="closedMini"></mini-dialog>
</div>
css樣式
注意,可移動(dòng)塊必須是top和left屬性
.m-dia {
position: absolute;
top: 75%;
left: 70%;
}
結(jié)語(yǔ):
上述代碼能完成基礎(chǔ)自定義拖拽功能,未測(cè)試僅抓取頭部才能拖動(dòng)情況,且拖動(dòng)代碼塊時(shí)光標(biāo)顯示為指針,不是可移動(dòng)光標(biāo)。
到此這篇關(guān)于Vue3自定義drag指令詳解的文章就介紹到這了,更多相關(guān)Vue3自定義drag指令內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue+ElementUI技巧之自定義表單項(xiàng)label的文字提示方法
這篇文章主要給大家介紹了關(guān)于Vue+ElementUI技巧之自定義表單項(xiàng)label文字提示的相關(guān)資料,文中通過(guò)圖文以及代碼示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-02-02
vue-cli 使用axios的操作方法及整合axios的多種方法
這篇文章主要介紹了vue-cli 使用axios的操作方法及整合axios的多種方法,vue-cli整合axios的多種方法,小編一一給大家列出來(lái)了,大家根據(jù)自身需要選擇,需要的朋友可以參考下2018-09-09
用vue 實(shí)現(xiàn)手機(jī)觸屏滑動(dòng)功能
這篇文章主要介紹了用vue 實(shí)現(xiàn)手機(jī)觸屏滑動(dòng)的功能,文中通過(guò)示例代碼給大家介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05
vue2 v-model/v-text 中使用過(guò)濾器的方法示例
這篇文章主要介紹了vue2 v-model/v-text 中使用過(guò)濾器的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-05-05
Composition API思想封裝NProgress示例詳解
這篇文章主要為大家介紹了Composition API思想封裝NProgress示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
解決antd日期選擇組件,添加value就無(wú)法點(diǎn)擊下一年和下一月問(wèn)題
這篇文章主要介紹了解決antd日期選擇組件,添加value就無(wú)法點(diǎn)擊下一年和下一月問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10
Vue實(shí)現(xiàn)調(diào)節(jié)窗口大小時(shí)觸發(fā)事件動(dòng)態(tài)調(diào)節(jié)更新組件尺寸的方法
今天小編就為大家分享一篇Vue實(shí)現(xiàn)調(diào)節(jié)窗口大小時(shí)觸發(fā)事件動(dòng)態(tài)調(diào)節(jié)更新組件尺寸的方法。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
Vue中利用better-scroll組件實(shí)現(xiàn)橫向滾動(dòng)功能
橫向滾動(dòng)這個(gè)功能是我們?nèi)粘i_發(fā)中經(jīng)常會(huì)遇到的一個(gè)需求,下面這篇文章主要給大家介紹了關(guān)于Vue中如何利用better-scroll組件實(shí)現(xiàn)橫向滾動(dòng)的相關(guān)資料,需要的朋友可以參考下2021-06-06
Vue+OpenLayer為地圖添加風(fēng)場(chǎng)效果
這篇文章主要為大家展示了一個(gè)demo,即利用Vue和OpenLayer在地圖上面添加風(fēng)場(chǎng)效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-04-04

