import Vue from 'vue'
const isServer = Vue.prototype.$isServer
export default {
inserted (el, binding, vnode) {
const on = (function () {
if (!isServer && document.addEventListener) {
return function (element, event, handler) {
if (element && event && handler) {
element.addEventListener(event, handler, false)
}
}
} else {
return function (element, event, handler) {
if (element && event && handler) {
element.attachEvent('on' + event, handler)
}
}
}
})()
const off = (function () {
if (!isServer && document.removeEventListener) {
return function (element, event, handler) {
if (element && event) {
element.removeEventListener(event, handler, false)
}
}
} else {
return function (element, event, handler) {
if (element && event) {
element.detachEvent('on' + event, handler)
}
}
}
})()
// const rafThrottle = function (fn) {
// let locked = false
// return function (...args) {
// if (locked) return false
// locked = true
// window.requestAnimationFrame(_ => {
// console.log(this, 999)
// fn.apply(this, args) // 一個(gè)一個(gè)傳
// locked = false
// })
// }
// }
const rafThrottle = function (fn) {
let locked = false
return function (e) {
if (locked) return false
locked = true
console.log(this) // document
window.requestAnimationFrame(_ => {
fn.call(this, e) // 整體傳
locked = false
})
}
}
// console.log(el)
const dragDom = el.querySelector('.el-dialog')
const drayHeader = el.querySelector('.el-dialog__header')
drayHeader.style.cursor = 'move'
// console.log(dragDom, drayHeader)
const getStyle = (function () {
if (window.document.currentStyle) {
return (dom, attr) => dom.currentStyle[attr]
} else {
return (dom, attr) => getComputedStyle(dom, false)[attr]
}
})()
drayHeader.onmousedown = (e) => {
// 當(dāng)前元素距離可是區(qū)域的距離
const disX = e.clientX - drayHeader.offsetLeft
const disY = e.clientY - drayHeader.offsetTop
// 可是區(qū)域的寬高
const screenHeight = document.body.offsetHeight
const screenWidth = document.body.offsetWidth
// // 獲取left top
let styLeft = getStyle(dragDom, 'left')
let styTop = getStyle(dragDom, 'top')
if (styLeft.includes('%')) {
styLeft = +screenWidth * (+styLeft.replace(/%/g, '') / 100)
styTop = +screenHeight * (+styTop.replace(/%/g, '') / 100)
} else {
styLeft = +styLeft.replace(/\px/g, '')
styTop = +styTop.replace(/\px/g, '')
}
const hehe = rafThrottle(e => {
const left = e.clientX - disX
const top = e.clientY - disY
dragDom.style.cssText += `;left: ${left + styLeft}px; top:${top + styTop}px`
})
on(document, 'mousemove', hehe)
on(document, 'mouseup', ev => {
off(document, 'mousemove', hehe)
})
e.preventDefault()
}
}
}
vue彈窗拖拽事件
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 解決思路: 記錄鼠標(biāo)按下時(shí)和鼠標(biāo)抬起時(shí)對(duì)應(yīng)的坐標(biāo)(pageX 和 pageY) 通過開方將按下時(shí)位置與抬起時(shí)位置進(jìn)...
- vue-draggable版本:2.24.3解決辦法:新增options參數(shù),把需要拖拽的元素添加到handle屬...
- element ui 彈框拖拽 vue自定義事件 在utils文件下創(chuàng)建一個(gè)dialog.js 在main.js...