当前位置:   article > 正文

实现在vue中element-ui的el-dialog弹框拖拽及拉伸、双击全屏的两种方法 (一)_vue3 element-plus 弹窗拉伸双击全屏自定义指令

vue3 element-plus 弹窗拉伸双击全屏自定义指令

 

1、在 utils 中新建 directives.js 文件

  1. import Vue from 'vue'
  2. /*
  3. * 使用方法
  4. * 将以下代码复制到一个directives.js文件中,然后在入口文件main.js中导入:import ‘./utils/directives.js’;
  5. * 给elementUI的dialog上加上 v-dialogDrag 指令就可以实现弹窗的全屏和拉伸了。
  6. * 给dialog设置 :close-on-click-modal="false" , 禁止点击遮罩层关闭弹出层
  7. * 如果是form表单,不要将提交等按钮放置el-form-item,以免在上下拉伸时被隐藏
  8. */
  9. // v-dialogDrag: 弹窗拖拽+水平方向伸缩
  10. Vue.directive('dialogDrag', {
  11. bind(el, binding, vnode, oldVnode) {
  12. // 弹框可拉伸最小宽高
  13. const minWidth = 400
  14. const minHeight = 300
  15. // 初始非全屏
  16. let isFullScreen = false
  17. // 当前顶部高度
  18. let nowMarginTop = 0
  19. // 获取弹框头部(这部分可双击全屏)
  20. const dialogHeaderEl = el.querySelector('.el-dialog__header')
  21. // 弹窗
  22. const dragDom = el.querySelector('.el-dialog')
  23. // 给弹窗加上overflow auto;不然缩小时框内的标签可能超出dialog;
  24. dragDom.style.overflow = 'auto'
  25. // 清除选择头部文字效果
  26. // dialogHeaderEl.onselectstart = new Function("return false");
  27. // 头部加上可拖动cursor
  28. dialogHeaderEl.style.cursor = 'move'
  29. // 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);
  30. const sty = dragDom.currentStyle || window.getComputedStyle(dragDom, null)
  31. const moveDown = e => {
  32. // 鼠标按下,计算当前元素距离可视区的距离
  33. const disX = e.clientX - dialogHeaderEl.offsetLeft
  34. const disY = e.clientY - dialogHeaderEl.offsetTop
  35. // 获取到的值带px 正则匹配替换
  36. let styL, styT
  37. // 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px
  38. if (sty.left.includes('%')) {
  39. styL = +document.body.clientWidth * (+sty.left.replace(/\%/g, '') / 100)
  40. styT = +document.body.clientHeight * (+sty.top.replace(/\%/g, '') / 100)
  41. } else {
  42. styL = +sty.left.replace(/\px/g, '')
  43. styT = +sty.top.replace(/\px/g, '')
  44. }
  45. document.onmousemove = function(e) {
  46. // 通过事件委托,计算移动的距离
  47. const l = e.clientX - disX
  48. const t = e.clientY - disY
  49. // 移动当前元素
  50. dragDom.style.left = `${l + styL}px`
  51. dragDom.style.top = `${t + styT}px`
  52. // 将此时的位置传出去
  53. // binding.value({x:e.pageX,y:e.pageY})
  54. }
  55. document.onmouseup = function(e) {
  56. document.onmousemove = null
  57. document.onmouseup = null
  58. }
  59. }
  60. dialogHeaderEl.onmousedown = moveDown
  61. // 当前宽高
  62. let nowWidth = 0
  63. // let nowHight = 0
  64. // 双击头部全屏效果
  65. dialogHeaderEl.ondblclick = e => {
  66. if (isFullScreen === false) {
  67. // nowHight = dragDom.clientHeight
  68. nowWidth = dragDom.clientWidth
  69. nowMarginTop = dragDom.style.marginTop
  70. dragDom.style.left = 0
  71. dragDom.style.top = 0
  72. dragDom.style.height = '100VH'
  73. dragDom.style.width = '100VW'
  74. dragDom.style.marginTop = 0
  75. isFullScreen = true
  76. dialogHeaderEl.style.cursor = 'initial'
  77. dialogHeaderEl.onmousedown = null
  78. } else {
  79. dragDom.style.height = 'auto'
  80. dragDom.style.width = nowWidth + 'px'
  81. dragDom.style.marginTop = nowMarginTop
  82. isFullScreen = false
  83. dialogHeaderEl.style.cursor = 'move'
  84. dialogHeaderEl.onmousedown = moveDown
  85. }
  86. }
  87. dragDom.onmousemove = function(e) {
  88. // let moveE = e
  89. if (
  90. e.clientX > dragDom.offsetLeft + dragDom.clientWidth - 10 ||
  91. dragDom.offsetLeft + 10 > e.clientX
  92. ) {
  93. dragDom.style.cursor = 'w-resize'
  94. } else if (
  95. el.scrollTop + e.clientY >
  96. dragDom.offsetTop + dragDom.clientHeight - 10
  97. ) {
  98. dragDom.style.cursor = 's-resize'
  99. } else {
  100. dragDom.style.cursor = 'default'
  101. dragDom.onmousedown = null
  102. }
  103. dragDom.onmousedown = e => {
  104. const clientX = e.clientX
  105. const clientY = e.clientY
  106. const elW = dragDom.clientWidth
  107. const elH = dragDom.clientHeight
  108. const EloffsetLeft = dragDom.offsetLeft
  109. const EloffsetTop = dragDom.offsetTop
  110. dragDom.style.userSelect = 'none'
  111. const ELscrollTop = el.scrollTop
  112. // 判断点击的位置是不是为头部
  113. if (
  114. clientX > EloffsetLeft &&
  115. clientX < EloffsetLeft + elW &&
  116. clientY > EloffsetTop &&
  117. clientY < EloffsetTop + 100
  118. ) {
  119. // 如果是头部在此就不做任何动作,以上有绑定dialogHeaderEl.onmousedown = moveDown;
  120. } else {
  121. document.onmousemove = function(e) {
  122. // 移动时禁用默认事件
  123. e.preventDefault()
  124. // 左侧鼠标拖拽位置
  125. if (clientX > EloffsetLeft && clientX < EloffsetLeft + 10) {
  126. // 往左拖拽
  127. if (clientX > e.clientX) {
  128. dragDom.style.width = elW + (clientX - e.clientX) * 2 + 'px'
  129. }
  130. // 往右拖拽
  131. if (clientX < e.clientX) {
  132. if (dragDom.clientWidth < minWidth) {
  133. console.log()
  134. } else {
  135. dragDom.style.width = elW - (e.clientX - clientX) * 2 + 'px'
  136. }
  137. }
  138. }
  139. // 右侧鼠标拖拽位置
  140. if (
  141. clientX > EloffsetLeft + elW - 10 &&
  142. clientX < EloffsetLeft + elW
  143. ) {
  144. // 往左拖拽
  145. if (clientX > e.clientX) {
  146. if (dragDom.clientWidth < minWidth) {
  147. console.log()
  148. } else {
  149. dragDom.style.width = elW - (clientX - e.clientX) * 2 + 'px'
  150. }
  151. }
  152. // 往右拖拽
  153. if (clientX < e.clientX) {
  154. dragDom.style.width = elW + (e.clientX - clientX) * 2 + 'px'
  155. }
  156. }
  157. // 底部鼠标拖拽位置
  158. if (
  159. ELscrollTop + clientY > EloffsetTop + elH - 20 &&
  160. ELscrollTop + clientY < EloffsetTop + elH
  161. ) {
  162. // 往上拖拽
  163. if (clientY > e.clientY) {
  164. if (dragDom.clientHeight < minHeight) {
  165. console.log()
  166. } else {
  167. dragDom.style.height = elH - (clientY - e.clientY) * 2 + 'px'
  168. }
  169. }
  170. // 往下拖拽
  171. if (clientY < e.clientY) {
  172. dragDom.style.height = elH + (e.clientY - clientY) * 2 + 'px'
  173. }
  174. }
  175. }
  176. // 拉伸结束
  177. document.onmouseup = function(e) {
  178. document.onmousemove = null
  179. document.onmouseup = null
  180. }
  181. }
  182. }
  183. }
  184. }
  185. })

2、main.js中导入:import ‘./utils/directives.js’
3、使用 el-dialog 的地方加入 v-dialogDrag

  1. <el-dialog
  2. :visible.sync="dialogVisible"
  3. v-dialogDrag>
  4. // ...
  5. </el-dialog>

 参考:实现在vue中element-ui的el-dialog弹框拖拽

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/283603
推荐阅读
相关标签
  

闽ICP备14008679号