Explorar el Código

自定义弹窗拖拽指令

RuoYi hace 4 años
padre
commit
e14fb70c26

+ 64 - 0
ruoyi-ui/src/directive/dialog/drag.js

@@ -0,0 +1,64 @@
1
+/**
2
+* v-dialogDrag 弹窗拖拽
3
+* Copyright (c) 2019 ruoyi
4
+*/
5
+
6
+export default {
7
+  bind(el, binding, vnode, oldVnode) {
8
+    const value = binding.value
9
+    if (value == false) return
10
+    // 获取拖拽内容头部
11
+    const dialogHeaderEl = el.querySelector('.el-dialog__header');
12
+    const dragDom = el.querySelector('.el-dialog');
13
+    dialogHeaderEl.style.cursor = 'move';
14
+    // 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);
15
+    const sty = dragDom.currentStyle || window.getComputedStyle(dragDom, null);
16
+    dragDom.style.position = 'absolute';
17
+    dragDom.style.marginTop = 0;
18
+    let width = dragDom.style.width;
19
+    if (width.includes('%')) {
20
+      width = +document.body.clientWidth * (+width.replace(/\%/g, '') / 100);
21
+    } else {
22
+      width = +width.replace(/\px/g, '');
23
+    }
24
+    dragDom.style.left = `${(document.body.clientWidth - width) / 2}px`;
25
+    // 鼠标按下事件
26
+    dialogHeaderEl.onmousedown = (e) => {
27
+      // 鼠标按下,计算当前元素距离可视区的距离 (鼠标点击位置距离可视窗口的距离)
28
+      const disX = e.clientX - dialogHeaderEl.offsetLeft;
29
+      const disY = e.clientY - dialogHeaderEl.offsetTop;
30
+
31
+      // 获取到的值带px 正则匹配替换
32
+      let styL, styT;
33
+
34
+      // 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px
35
+      if (sty.left.includes('%')) {
36
+        styL = +document.body.clientWidth * (+sty.left.replace(/\%/g, '') / 100);
37
+        styT = +document.body.clientHeight * (+sty.top.replace(/\%/g, '') / 100);
38
+      } else {
39
+        styL = +sty.left.replace(/\px/g, '');
40
+        styT = +sty.top.replace(/\px/g, '');
41
+      };
42
+
43
+      // 鼠标拖拽事件
44
+      document.onmousemove = function (e) {
45
+        // 通过事件委托,计算移动的距离 (开始拖拽至结束拖拽的距离)
46
+        const l = e.clientX - disX;
47
+        const t = e.clientY - disY;
48
+
49
+        let finallyL = l + styL
50
+        let finallyT = t + styT
51
+
52
+        // 移动当前元素
53
+        dragDom.style.left = `${finallyL}px`;
54
+        dragDom.style.top = `${finallyT}px`;
55
+
56
+      };
57
+
58
+      document.onmouseup = function (e) {
59
+        document.onmousemove = null;
60
+        document.onmouseup = null;
61
+      };
62
+    }
63
+  }
64
+};

+ 18 - 0
ruoyi-ui/src/directive/index.js

@@ -0,0 +1,18 @@
1
+import hasRole from './permission/hasRole'
2
+import hasPermi from './permission/hasPermi'
3
+import dialogDrag from './dialog/drag'
4
+
5
+const install = function(Vue) {
6
+  Vue.directive('hasRole', hasRole)
7
+  Vue.directive('hasPermi', hasPermi)
8
+  Vue.directive('dialogDrag', dialogDrag)
9
+}
10
+
11
+if (window.Vue) {
12
+  window['hasRole'] = hasRole
13
+  window['hasPermi'] = hasPermi
14
+  window['dialogDrag'] = dialogDrag
15
+  Vue.use(install); // eslint-disable-line
16
+}
17
+
18
+export default install

+ 1 - 1
ruoyi-ui/src/directive/permission/hasPermi.js

@@ -1,5 +1,5 @@
1 1
  /**
2
- * 操作权限处理
2
+ * v-hasPermi 操作权限处理
3 3
  * Copyright (c) 2019 ruoyi
4 4
  */
5 5
  

+ 1 - 1
ruoyi-ui/src/directive/permission/hasRole.js

@@ -1,5 +1,5 @@
1 1
  /**
2
- * 角色权限处理
2
+ * v-hasRole 角色权限处理
3 3
  * Copyright (c) 2019 ruoyi
4 4
  */
5 5