ant_vue模态框拖拽记录

学习笔记----ant_vue模态框拖拽记录

通过自定义命令

  • utils文件夹中新建dragModal.js

  •  import Vue from 'vue'

    // 注册自定义拖拽指令,弥补 modal 组件不能拖动的缺陷
    Vue.directive('drag-modal', (el, bindings, vnode) => {
    Vue.nextTick(() => {
    const { visible, destroyOnClose } = vnode.componentInstance
    // 防止未定义 destroyOnClose 关闭弹窗时dom未被销毁,指令被重复调用
    if (!visible) return
    //找到模态框的dom
    const modal = el.getElementsByClassName('ant-modal')[0]
    //找到模态框的dom 头部 这个有可能会不一样 自己找一下就好了
    const header = el.getElementsByClassName('modal-header')[0]
    let left = 0
    let top = 0

    // 鼠标变成可移动的指示
    header.style.cursor = 'move'

    // 未定义 destroyOnClose 时,dom未被销毁,关闭弹窗再次打开,弹窗会停留在上一次拖动的位置
    if (!destroyOnClose) {
    left = modal.left || 0
    top = modal.top || 0
    }
    // top 初始值为 offsetTop
    top = top || modal.offsetTop
    header.onmousedown = e => {
    const startX = e.clientX
    const startY = e.clientY
    header.left = header.offsetLeft
    header.top = header.offsetTop
    el.onmousemove = event => {
    const endX = event.clientX
    const endY = event.clientY
    modal.left = header.left + (endX - startX) + left
    modal.top = header.top + (endY - startY) + top
    modal.style.left = modal.left + 'px'
    modal.style.top = modal.top + 'px'
    }
    el.onmouseup = event => {
    left = modal.left
    top = modal.top
    el.onmousemove = null
    el.onmouseup = null
    header.releaseCapture && header.releaseCapture()
    }
    header.setCapture && header.setCapture()
    }
    })
    })
  • 在main.js 或者main.ts中引入,全局自定义命令

    import './utils/dragModal.js'

  • 使用的话直接在 a-model上面加

    v-drag-modal
    就好了

  •  <a-modal
    v-drag-modal
    :visible="true"
    :centered="true"
    :destroyOnClose="true"
    :maskClosable="false"
    title="新建文件夹"
    :width="1200"
    >
    ....内容....
    </a-modal>

标签: Javascript

添加新评论