vue中elementui组件el-dialog拖拽(已处理边界情况)
全局注册
Vue.directive("elDialogDrag", (el) => {
const header = el.querySelector(".el-dialog__header");
const main = el.querySelector(".el-dialog");
header.style.cursor = "move";
header.onmousedown = (e) => {
// 上次鼠标弹起时X轴的偏移量
let l = +main.style.left.replace(/px/, "");
// 上次鼠标弹起时Y轴的偏移量
let t = +main.style.top.replace(/px/, "");
let x = e.pageX - l;
let y = e.pageY - t;
let markL = 0,
markT = 0,
markR = 0,
markB = 0,
offset = 10; // 偏移量
document.onmousemove = (e) => {
// 处理右边界
if (main.offsetLeft + main.offsetWidth + offset >= el.offsetWidth) {
markR === 0 && (markR = e.pageX - x);
e.pageX - x < markR && (main.style.left = e.pageX - x + "px");
} else if (main.offsetLeft > offset) {
main.style.left = e.pageX - x + "px";
} else {
// 处理左边界
markL === 0 && (markL = e.pageX - x);
e.pageX - x > markL && (main.style.left = e.pageX - x + "px");
}
// 处理下边界
if (main.offsetTop + main.offsetHeight + offset >= el.offsetHeight) {
markB === 0 && (markB = e.pageY - y);
e.pageY - y < markB && (main.style.top = e.pageY - y + "px");
} else if (main.offsetTop > offset) {
main.style.top = e.pageY - y + "px";
} else {
// 处理上边界
markT === 0 && (markT = e.pageY - y);
e.pageY - y > markT && (main.style.top = e.pageY - y + "px");
}
};
document.onmouseup = () => {
document.onmousemove = null;
document.onmouseup = null;
};
};
});
局部注册
directives: {
elDialogDrag: {
bind(el) {
const header = el.querySelector(".el-dialog__header");
const main = el.querySelector(".el-dialog");
header.style.cursor = "move";
header.onmousedown = (e) => {
// 上次鼠标按下时X轴的偏移量
let l = +main.style.left.replace(/px/, "");
// 上次鼠标按下时Y轴的偏移量
let t = +main.style.top.replace(/px/, "");
let x = e.pageX - l;
let y = e.pageY - t;
let markL = 0,
markT = 0,
markR = 0,
markB = 0,
offset = 10; // 偏移量
document.onmousemove = (e) => {
// 处理右边界
if (main.offsetLeft + main.offsetWidth + offset >= el.offsetWidth) {
markR === 0 && (markR = e.pageX - x);
e.pageX - x < markR && (main.style.left = e.pageX - x + "px");
} else if (main.offsetLeft > offset) {
main.style.left = e.pageX - x + "px";
} else {
// 处理左边界
markL === 0 && (markL = e.pageX - x);
e.pageX - x > markL && (main.style.left = e.pageX - x + "px");
}
// 处理下边界
if (
main.offsetTop + main.offsetHeight + offset >=
el.offsetHeight
) {
markB === 0 && (markB = e.pageY - y);
e.pageY - y < markB && (main.style.top = e.pageY - y + "px");
} else if (main.offsetTop > offset) {
main.style.top = e.pageY - y + "px";
} else {
// 处理上边界
markT === 0 && (markT = e.pageY - y);
e.pageY - y > markT && (main.style.top = e.pageY - y + "px");
}
};
document.onmouseup = () => {
document.onmousemove = null;
document.onmouseup = null;
};
};
},
},
},
引用
在el-dialog中 v-elDialogDrag
vue中elementui组件el-dialog拖拽(已处理边界情况)的更多相关文章
- Vue. 之 Element dialog 拖拽
Vue. 之 Element dialog 拖拽 默认情况下,在使用Element的Dialog模块时,弹出框是不能移动的,且 一旦点击遮罩层区域,弹框就会消失. 解决方案: 1 在 utils 中新 ...
- 实现在vue中element-ui的el-dialog弹框拖拽
参考:实现在vue中element-ui的el-dialog弹框拖拽 1.在 utils 中新建 directives.js 文件 import Vue from 'vue' // v-dialogD ...
- Vue中父组件向子组件传值
Vue中父组件向子组件传值 相关Html: <!DOCTYPE html> <html lang="en"> <head> <meta c ...
- Vue 中的组件
VUE中的组件 一个自定义的标签,vue就会把他看成一个组件,vue可以给这些标签赋予一定意义:一个页面就是一个组件 好处: 1.提高开发效率 2.方便重复使用 3.便于协同开发 4.更容易被管理和维 ...
- Vue 中数据流组件
好久不见呀,这两年写了很多很多东西,也学到很多很多东西,没有时常分享是因为大多都是我独自思考.明年我想出去与更多的大神交流,再修筑自己构建的内容. 有时候我会想:我们遇到的问题,碰到的界限,是别人给的 ...
- vue中自定义组件(插件)
vue中自定义组件(插件) 原创 2017年01月04日 22:46:43 标签: 插件 在vue项目中,可以自定义组件像vue-resource一样使用Vue.use()方法来使用,具体实现方法: ...
- Vue中父子组件执行的先后顺序
Vera Vue中父子组件执行的先后顺序探讨(转载) 前几天,朋友向我提出了一个关于Vue中父子组件执行的先后顺序问题,相信很多朋友在学习的过程中也会遇到这个问题,所以我就在此提出我自己的一些小看 ...
- Vue中父子组件执行的先后顺序探讨
前几天,朋友向我提出了一个关于Vue中父子组件执行的先后顺序问题,相信很多朋友在学习的过程中也会遇到这个问题,所以我就在此提出我自己的一些小看法. 问题如下:请问下图中父子组件执行的先后顺序? 首先, ...
- 简述vue中父子组件是怎样相互传递值的(基础向)
前言 首先,你需要知道vue中父组件和子组件分别指的是什么? 父组件:vue的根实例——用new Vue()构造函数创建的vue实例(实例会有一个挂载点,挂载点里的所有内容可理解为父组件的内容) ...
- 解决vue中element组件样式修改无效
vue中element组件样式修改无效 <style> .detail{ .el-input__inner { height: 48px; } } </style> 直接写st ...
随机推荐
- 序列化协议:Protobuf入门
偶然在网上清华大学电子系科协软件部2023暑期培训的内容中发现了这个东西,后面随着了解发现以后学习有关项目时会用到,便写个随笔记录一下这次学习的经历.作为一种序列化协议,与使用文本方式存储的xml.j ...
- 解决idea中使用git fetch报远程仓库Authentication failed
这个问题是项目组同事在从git服务器clone代码后做fetch操作老是报错: Authentication failed, 弹出框提示:invalid user or password 其实问题出i ...
- 《系列二》-- 5、单例bean缓存的获取
目录 1 判断bean是否完成整个加载流程 2 判断当前bean是否被加载过,是否已作为提前暴露的bean 关于循环依赖 阅读之前要注意的东西:本文就是主打流水账式的源码阅读,主导的是一个参考,主要内 ...
- 并发慎用——System.currentTimeMillis()
好记忆不如烂笔头,能记下点东西,就记下点,有时间拿出来看看,也会发觉不一样的感受. System.currentTimeMillis()是极其常用的基础Java API,广泛地用来获取时间戳或测量代码 ...
- Linux驱动开发笔记(一):helloworld驱动源码编写、makefile编写以及驱动编译基本流程
前言 基于linux的驱动开发学习笔记,本篇是描述了一个字符驱动的基础开发流程,以便做嵌入式开发多年的应用或者系统学习驱动开发. 笔者自身情况 笔者拥有硬件基础,单片机软硬基础,linux ...
- mysql数据库jar包下载
1.mysql-connector-java-8.0.16.jar驱动包 链接:https://pan.baidu.com/s/1G1SfPP895wU6YvTOAcTxhA提取码:7r43 2.my ...
- 【LeetCode动态规划#17】知道秘密的人,维护多个dp数组
知道秘密的人数 在第 1 天,有一个人发现了一个秘密. 给你一个整数 delay ,表示每个人会在发现秘密后的 delay 天之后,每天 给一个新的人 分享 秘密.同时给你一个整数 forget ,表 ...
- Vue源码学习(十):关于dep和watcher使用的一些思考
好家伙, 前面想了好久,都没想明白为什么要dep和watcher打配合才能实现数据-视图同步 为什么要多一个依赖管理这样的东西 给每个数据绑个watcher(xxfunction),然后,数据变了 ...
- 【Azure 媒体服务】Azure Media Service上传的视频资产,如何保证在Transfer编码后音频文件和视频文件不分成两个文件?保持在一个可以直接播放的MP4文件中呢?
问题描述 Azure Media Service上传的视频资产,如何保证在Transfer编码后音频文件和视频文件不分成两个文件?保持在一个可以直接播放的MP4文件中呢? 问题解答 Azure Med ...
- TensorFlow 回归模型
TensorFlow 回归模型 首先,导入所需的库和模块.代码中使用了numpy进行数值计算,matplotlib进行数据可视化,tensorflow进行机器学习模型的构建和训练,sklearn进行多 ...