[elementUI] dialog box adds customizable drag and stretch functions

The dialog box adds customizable drag and stretch functions

1. Create a dialog.js file (the path is fine according to your own habits)

import Vue from 'vue'

// v-dialogDrag: 弹窗拖拽属性
Vue.directive('dialogDrag', {
    
    
    bind(el, binding, vnode, oldVnode) {
    
    
        // 自定义属性,判断是否可拖拽
        if (!binding.value) return
        const dialogHeaderEl = el.querySelector('.el-dialog__header')
        const dragDom = el.querySelector('.el-dialog')
        dialogHeaderEl.style.cssText += ';cursor:move;'
        dragDom.style.cssText += ';top:0px;'

        // 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);
        const sty = (function () {
    
    
            if (document.body.currentStyle) {
    
    
                // 在ie下兼容写法
                return (dom, attr) => dom.currentStyle[attr]
            } else {
    
    
                return (dom, attr) => getComputedStyle(dom, false)[attr]
            }
        })()

        dialogHeaderEl.onmousedown = (e) => {
    
    
            // 鼠标按下,计算当前元素距离可视区的距离
            // 鼠标距离窗口左侧距离 - 弹窗头部距离定位父元素(弹窗整体)距离,为0
            const disX = e.clientX - dialogHeaderEl.offsetLeft
            const disY = e.clientY - dialogHeaderEl.offsetTop

            // 浏览器宽高
            const screenWidth = document.body.clientWidth // body当前宽度
            const screenHeight = document.documentElement.clientHeight // 可见区域高度(应为body高度,可某些环境下无法获取)

            const dragDomWidth = dragDom.offsetWidth // 对话框宽度
            const dragDomheight = dragDom.offsetHeight // 对话框高度

            // 弹窗距离浏览器左边距离
            const minDragDomLeft = dragDom.offsetLeft
            const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth

            // 弹窗距离浏览器顶部距离
            const minDragDomTop = dragDom.offsetTop
            const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomheight

            // 获取到的值带px 正则匹配替换
            let styL = sty(dragDom, 'left')
            // 为兼容ie
            if (styL === 'auto') styL = '0px'
            let styT = sty(dragDom, 'top')

            // 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px
            if (styL.includes('%')) {
    
    
                styL = +document.body.clientWidth * (+styL.replace(/%/g, '') / 100)
                styT = +document.body.clientHeight * (+styT.replace(/%/g, '') / 100)
            } else {
    
    
                styL = +styL.replace(/px/g, '')
                styT = +styT.replace(/px/g, '')
            };

            document.onmousemove = function (e) {
    
    
                // 通过事件委托,计算移动的距离
                // console.log(e, disY)
                let left = e.clientX - disX
                let top = e.clientY - disY
                // 边界处理
                if (-(left) > minDragDomLeft) {
    
    
                    left = -(minDragDomLeft)
                } else if (left > maxDragDomLeft) {
    
    
                    left = maxDragDomLeft
                }

                if (-(top) > minDragDomTop) {
    
    
                    top = -(minDragDomTop)
                } else if (top > maxDragDomTop) {
    
    
                    top = maxDragDomTop
                }

                // 移动当前元素
                dragDom.style.cssText += `;left:${
      
      left + styL}px;top:${
      
      top + styT}px;`
            }

            document.onmouseup = function (e) {
    
    
                document.onmousemove = null
                document.onmouseup = null
            }
            return false
        }
    }
})

// v-dialogChange: 弹窗拉伸属性
Vue.directive('dialogChange', {
    
    
    bind (el, binding, vnode, oldVnode) {
    
    
      new Vue({
    
    }).$nextTick(() => {
    
    
        // 自定义属性,判断是否可拉伸
        if (!binding.value) return
        const dragDom = el.querySelector('.el-dialog')
        const dragDomBody = el.querySelector('.el-dialog__body')
        dragDomBody.style.overflow = 'auto'
        const minHeight = 300
        const minWidth = 400
        // 右下角设置一个图标点击拖拽缩放大小(注意:此处mouse需要与代码中的类名一致,否则会报错)
        let dragMouse = document.querySelector('.mouse')
        // 鼠标拖拽
        dragMouse.onmousedown = (e) => {
    
    
          // content区域
          const content = dragDom.parentNode.parentNode.parentNode.parentNode
          const disX = e.clientX - dragDom.offsetWidth
          const disY = e.clientY - dragDom.offsetHeight
  
          document.onmousemove = function (e) {
    
    
            e.preventDefault() // 移动时禁用默认事件
            // 通过事件委托,计算移动的距离e
            let width = e.clientX - disX
            let height = e.clientY - disY
  
            if (width > content.offsetWidth && height < content.offsetHeight) {
    
    
              if (height < minHeight) {
    
    
                height = minHeight
              }
              dragDom.style.height = `${
      
      height}px`
              // 减去头部高度
              dragDomBody.style.height = `${
      
      height - 120}px`
            } else if (width < content.offsetWidth && height > content.offsetHeight) {
    
    
              if (width < minWidth) {
    
    
                width = minWidth
              }
              dragDom.style.width = `${
      
      width}px`
            } else if (width < content.offsetWidth && height < content.offsetHeight) {
    
    
              if (height < minHeight) {
    
    
                height = minHeight
              }
              if (width < minWidth) {
    
    
                width = minWidth
              }
              dragDom.style.width = `${
      
      width}px`
              dragDom.style.height = `${
      
      height}px`
              // 减去头部高度
              dragDomBody.style.height = `${
      
      height - 120}px`
            }
          }
          document.onmouseup = function (e) {
    
    
            document.onmousemove = null
            document.onmouseup = null
          }
          return false
        }
      })
    }
  })

2. Use steps

1. Introduce

import './components/dialog'

2. Use on the page

insert image description here
Add the code from the box on the dialog box that needs to be set.
Add it v-ifso that every time the pop-up box does not inherit the last change, you can
mousemodify it at will. If you want to modify it, you need to modify it synchronously in the dialog.js file


Guess you like

Origin blog.csdn.net/qq_44854653/article/details/128531067