当前位置:网站首页>Antdesign a-modal自定义指令实现拖拽放大缩小
Antdesign a-modal自定义指令实现拖拽放大缩小
2022-07-27 09:02:00 【温柔的风归功于带笑的你】
import Vue from 'vue'
// v-dialogDrag: 弹窗拖拽
Vue.directive('dragModal', {
bind(el, binding, vnode, oldVnode) {
// 弹框可拉伸最小宽高
const minWidth = 400;
const minHeight = 300;
// 获取弹框头部(这部分可双击全屏)
const dialogHeaderEl = el.querySelector('.ant-modal')
// 弹窗
const dragDom = el.querySelector('.ant-modal-wrap')
// 头部加上可拖动cursor
dialogHeaderEl.style.cursor = 'move';
// 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);
const sty = dragDom.currentStyle || window.getComputedStyle(dragDom, null);
dialogHeaderEl.onmousedown = (e) => {
// 鼠标按下,计算当前元素距离可视区的距离
const disX = e.clientX - dialogHeaderEl.offsetLeft;
const disY = e.clientY - dialogHeaderEl.offsetTop;
// 获取到的值带px 正则匹配替换
let styL, styT;
// 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px
if (sty.left.includes('%')) {
// eslint-disable-next-line no-useless-escape
styL = +document.body.clientWidth * (+sty.left.replace(/\%/g, '') / 100);
// eslint-disable-next-line no-useless-escape
styT = +document.body.clientHeight * (+sty.top.replace(/\%/g, '') / 100);
} else {
styL = +sty.left.replace(/\px/g, '');
styT = +sty.top.replace(/\px/g, '');
}
document.onmousemove = function(e) {
// 通过事件委托,计算移动的距离
const l = e.clientX - disX;
const t = e.clientY - disY;
// 移动当前元素
dragDom.style.left = `${l + styL}px`;
dragDom.style.top = `${t + styT}px`;
// 将此时的位置传出去
// binding.value({x:e.pageX,y:e.pageY})
};
document.onmouseup = function(e) {
document.onmousemove = null;
document.onmouseup = null;
};
}
dragDom.onmousemove = function(e) {
// console.log(dialogHeaderEl,dragDom.querySelector('.el-dialog__body'), 123);
const moveE = e;
if (e.clientX > dragDom.offsetLeft + dragDom.clientWidth - 10 || dragDom.offsetLeft + 10 > e.clientX) {
dragDom.style.cursor = 'se-resize';
} else if (el.scrollTop + e.clientY > dragDom.offsetTop + dragDom.clientHeight - 10) {
dragDom.style.cursor = 's-resize';
} else {
dragDom.style.cursor = 'default';
dragDom.onmousedown = null;
}
dragDom.onmousedown = (e) => {
const clientX = e.clientX;
const clientY = e.clientY;
const elW = dragDom.clientWidth;
const elH = dragDom.clientHeight;
const EloffsetLeft = dragDom.offsetLeft;
const EloffsetTop = dragDom.offsetTop;
dragDom.style.userSelect = 'none';
const ELscrollTop = el.scrollTop;
// 判断点击的位置是不是为头部
if (clientX > EloffsetLeft && clientX < EloffsetLeft + elW && clientY > EloffsetTop && clientY < EloffsetTop + 100) {
// 如果是头部在此就不做任何动作,以上有绑定dialogHeaderEl.onmousedown = moveDown;
} else {
document.onmousemove = function(e) {
e.stopPropagation(); // 移动时禁用默认事件
// 左侧鼠标拖拽位置
if (clientX > EloffsetLeft && clientX < EloffsetLeft + 10) {
// 往左拖拽
if (clientX > e.clientX) {
dragDom.style.width = elW + (clientX - e.clientX) * 2 + 'px';
}
// 往右拖拽
if (clientX < e.clientX) {
// eslint-disable-next-line no-empty
if (dragDom.clientWidth < minWidth) {
} else {
dragDom.style.width = elW - (e.clientX - clientX) * 2 + 'px';
}
}
}
// 右侧鼠标拖拽位置
if (clientX > EloffsetLeft + elW - 10 && clientX < EloffsetLeft + elW) {
// 往左拖拽
if (clientX > e.clientX) {
// eslint-disable-next-line no-empty
if (dragDom.clientWidth < minWidth) {
} else {
dragDom.style.width = elW - (clientX - e.clientX) * 2 + 'px';
}
}
// 往右拖拽
if (clientX < e.clientX) {
dragDom.style.width = elW + (e.clientX - clientX) * 2 + 'px';
}
}
// 底部鼠标拖拽位置
if (ELscrollTop + clientY > EloffsetTop + elH - 20 && ELscrollTop + clientY < EloffsetTop + elH) {
// 往上拖拽
if (clientY > e.clientY) {
// eslint-disable-next-line no-empty
if (dragDom.clientHeight < minHeight) {
} else {
dragDom.style.height = elH - (clientY - e.clientY) * 2 + 'px';
}
}
// 往下拖拽
if (clientY < e.clientY) {
dragDom.style.height = elH + (e.clientY - clientY) * 2 + 'px';
}
}
};
// 拉伸结束
document.onmouseup = function(e) {
document.onmousemove = null;
document.onmouseup = null;
};
}
}
}
}
})
使用

边栏推荐
- 杭州电子商务研究院发布“数字化存在”新名词解释
- qt中使用sqlite同时打开多个数据库文件
- 接口测试工具-Postman使用详解
- NiO example
- 数智革新
- pollFirst(),pollLast(),peekFirst(),peekLast()
- How to optimize the deep learning model to improve the reasoning speed
- Babbitt | yuan universe daily must read: Guangzhou Nansha released the "Yuan universe nine" measures, and the platform can obtain up to 200million yuan of financial support
- Interface test tool - JMeter pressure test use
- Huawei machine test question: String transformation minimum string JS
猜你喜欢

被三星和台积电挤压的Intel终放下身段,为中国芯片定制芯片工艺

CUDA Programming -03: thread level

How to optimize the deep learning model to improve the reasoning speed

Arm system call exception assembly

PyTorch自定义CUDA算子教程与运行时间分析

4274. 后缀表达式

Understand various IOU loss functions in target detection

“鼓浪屿元宇宙”,能否成为中国文旅产业的“升级样本”

PyQt5快速开发与实战 4.1 QMainWindow

pollFirst(),pollLast(),peekFirst(),peekLast()
随机推荐
TensorFlow损失函数
Aruba学习笔记10-安全认证-Portal认证(web页面配置)
Understand various IOU loss functions in target detection
PyTorch自定义CUDA算子教程与运行时间分析
3428. Put apples
【微服务~Sentinel】Sentinel之dashboard控制面板
Detailed explanation of two methods of Sqlalchemy
Interface test tool - JMeter pressure test use
3311. Longest arithmetic
四个开源的人脸识别项目分享
HUAWEI 机试题:火星文计算 js
A survey of robust lidar based 3D object detection methods for autonomous driving paper notes
Principle of flex:1
微信安装包从0.5M暴涨到260M,为什么我们的程序越来越大?
Rewrite the tensorrt version deployment code of yolox
Intel, squeezed by Samsung and TSMC, finally put down its body to customize chip technology for Chinese chips
网络IO总结文
E. Split into two sets
【ACL2020】一种新颖的成分句法树序列化方法
[acl2020] a novel method of component syntax tree serialization