// 普通元素拖拽
Vue.directive('drag', {
  bind: (el, bindings, vnode) => {
    Vue.nextTick(() => {
      // 防止未定义 destroyOnClose 关闭弹窗时dom未被销毁,指令被重复调用
      let modal = el.getElementsByClassName('drag-box')[0]
      let header = el.getElementsByClassName('drag-icon')[0]
      let left = 0
      let top = 0
      let canMove = false
      left = modal.left || 0
      top = modal.top || 0
      // top 初始值为 offsetTop
      top = top || modal.offsetTop
      // 点击title部分拖动
      header.onmousedown = e => {
        console.log("点击")
        canMove = true
        let startX = e.clientX
        let startY = e.clientY
        header.left = header.offsetLeft
        header.top = header.offsetTop
        window.onmousemove = event => {
          if( canMove ){
            console.log("头部鼠标移动", event)
            let endX = event.clientX
            let 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'
          }
        }
        window.onmouseup = event => {
          canMove = false
          left = modal.left
          top = modal.top
          el.onmousemove = null
          el.onmouseup = null
          header.releaseCapture && header.releaseCapture()
        }
        header.setCapture && header.setCapture()
      }
    })
  }
})

 

页面结构

<div class="upload-button" v-if="!recrodTime && recrodTime != 0" v-drag>
   <div class="drag-box">
      <div class="drag-icon">拖拽把柄</div>
      <a-button type="primary" circle icon="plus" class="floatButton" @click="showEventFrom" >录制上报</a-button>
   </div>
</div>

 

 

页面样式

.upload-button{
  position: absolute;
  bottom: 67px;
  right: 150px;
  .time-show-box{
    min-width: 100px;
  }
  .drag-box{
    position: absolute
  }
}

 

posted on 2022-06-29 10:05  occc  阅读(39)  评论(0编辑  收藏  举报