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) // 一个一个传
// 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) => {
// 当前元素距离可是区域的距离
const disX = e.clientX - drayHeader.offsetLeft
const disY = e.clientY - drayHeader.offsetTop
// 可是区域的宽高
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弹窗拖拽事件
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 解决思路: 记录鼠标按下时和鼠标抬起时对应的坐标(pageX 和 pageY) 通过开方将按下时位置与抬起时位置进...
- vue-draggable版本:2.24.3解决办法:新增options参数,把需要拖拽的元素添加到handle属...
- element ui 弹框拖拽 vue自定义事件 在utils文件下创建一个dialog.js 在main.js...