4 changed files with 78 additions and 4 deletions
@ -0,0 +1,69 @@ |
|||
import Vue from 'vue' |
|||
|
|||
Vue.directive('dialogDrag', { |
|||
bind: (el) => { |
|||
// 获取弹框标题区域DOM节点
|
|||
const headerDOM = el.querySelector('.el-dialog__header') |
|||
// 修改鼠标图标样式
|
|||
headerDOM.style.curser = 'move' |
|||
// 禁止拖拽时选中标题文本内容
|
|||
headerDOM.style.userSelect = 'none' |
|||
// 获取弹框区域DOM节点
|
|||
const dialogDOM = el.querySelector('.el-dialog') |
|||
let isDown = false, // 是否按下
|
|||
// 鼠标按下时坐标位置
|
|||
clientX = 0, |
|||
clientY = 0, |
|||
// 按下时弹框位置
|
|||
dialogLeft = 0, |
|||
dialogTop = 0 |
|||
// 定义函数判断当前是否在可见范围内
|
|||
function boundingRange() { |
|||
const bounding = dialogDOM.getBoundingClientRect() |
|||
return { |
|||
top: bounding.top >= 0, // 表示顶部在可见范围内
|
|||
left: bounding.left >= 0, // 表示左侧在可见范围内
|
|||
right: bounding.left < window.innerWidth - bounding.width, // 表示右侧在制定范围内
|
|||
bottom: bounding.top < window.innerHeight - bounding.height // 表示底部在制定范围内
|
|||
} |
|||
} |
|||
function update(e) { |
|||
// 获取当前鼠标按钮位置坐标
|
|||
clientX = e.clientX |
|||
clientY = e.clientY |
|||
// 获取弹框位置
|
|||
dialogLeft = isNaN(parseFloat(dialogDOM.style.left)) ? 0 : parseFloat(dialogDOM.style.left) |
|||
dialogTop = isNaN(parseFloat(dialogDOM.style.top)) ? 0 : parseFloat(dialogDOM.style.top) |
|||
} |
|||
// 监听鼠标按下事件
|
|||
headerDOM.onmousedown = e => { |
|||
isDown = true |
|||
update(e) |
|||
} |
|||
// 监听鼠标移动事件
|
|||
headerDOM.onmousemove = e => { |
|||
// 不按下时执行移动操作
|
|||
if (isDown) { |
|||
// 获取DOM边界范围
|
|||
const range = boundingRange() |
|||
// 获取当前
|
|||
const distX = e.clientX - clientX |
|||
const distY = e.clientY - clientY |
|||
// 判断左侧或右侧是否可移动
|
|||
if ((range.left && distX < 0) || range.right && distX > 0) { |
|||
dialogDOM.style.left = (dialogLeft + distX) + 'px' |
|||
} |
|||
if ((range.top && distY < 0) || range.bottom && distY > 0) { |
|||
dialogDOM.style.top = (dialogTop + distY) + 'px' |
|||
} |
|||
update(e) |
|||
} |
|||
} |
|||
headerDOM.onmouseup = e => { |
|||
isDown = false |
|||
} |
|||
window.onmouseup = () => { |
|||
isDown = false |
|||
} |
|||
} |
|||
}) |
Loading…
Reference in new issue