基于antd-vue的可拖拽弹窗

  1. 封装组件
<template>
  <a-modal
    v-if="footer"
    :class="[modalClass, simpleClass]"
    :visible="showModal"
    :title="title"
    @ok="handleOk"
    @cancel="handleCancel"
    :width="width == '100%' ? '100%' : width"
    :closable="false"
  >
     <slot name="modalBody" style="minheight: 600px"></slot>
  </a-modal>
  <a-modal
    v-else
    :class="modalClass"
    :visible="showModal"
    :title="title"
    @ok="handleOk"
    @cancel="handleCancel"
    :width="width == '100%' ? '100%' : width"
    :footer="null"
  >
    <slot name="modalBody"></slot>
  </a-modal>
</template>
<script type="text/ecmascript-6">
var mouseDownX = 0
var mouseDownY = 0
var deltaX = 0
var deltaY = 0
var sumX = 0
var sumY = 0

var header = null
var contain = null
var modalContent = null
export default {
  components: {},
  props: {
    // 容器的类名
    modalClass: {
      type: String,
      default: () => {
        return 'modal-box'
      },
    },
    visible: {
      type: Boolean,
      default: () => {
        return false
      },
    },
    title: {
      type: String,
      default: () => {
        return ''
      },
    },
    width: {
      type: String,
      default: () => {
        return '70%'
      },
    },
    footer: {
      type: Boolean,
      default: () => {
        return true
      },
    },
  },
data() {
 return {
   showModal: this.visible,
   modalPointer: null,
 }
},
  computed: {
    simpleClass() {
      return Math.random().toString(36).substring(2)
    },
  },
   mounted() {
   this.$nextTick(() => {
     this.initialEvent(this.visible)
   })
 },
  beforeDestroy() {
    this.removeMove()
    window.removeEventListener('mouseup', this.removeUp, false)
  },
  methods: {
    handleOk() {
      this.resetNum()
      this.$emit('ok')
    },
    handleCancel() {
      this.resetNum()
      this.$emit('cancel')
    },
    resetNum() {
      mouseDownX = 0
      mouseDownY = 0
      deltaX = 0
      deltaY = 0
      sumX = 0
      sumY = 0
    },
    handleMove(event) {
      const delta1X = event.pageX - mouseDownX
      const delta1Y = event.pageY - mouseDownY

      deltaX = delta1X
      deltaY = delta1Y
      modalContent.style.transform = `translate(${delta1X + sumX}px, ${delta1Y + sumY}px)`
    },
     initialEvent(visible) {
      if (visible) {
        setTimeout(() => {
          window.removeEventListener('mouseup', this.removeUp, false)
          contain = document.getElementsByClassName(this.simpleClass)[0]
          header = contain.getElementsByClassName('ant-modal-header')[0]
          modalContent = contain.getElementsByClassName('ant-modal-content')[0]
          modalContent.style.left = 0
          modalContent.style.transform = 'translate(0px,0px)'

          header.style.cursor = 'all-s `croll'
           contain.onmousedown = (e) => {
            mouseDownX = e.pageX
            mouseDownY = e.pageY
            document.body.onselectstart = () => false
            window.addEventListener('mousemove', this.handleMove, false)
          }
          window.addEventListener('mouseup', this.removeUp, false)
        }, 0)
        }
    },
    removeMove() {
      window.removeEventListener('mousemove', this.handleMove, false)
    },
       removeUp(e) {
      document.body.onselectstart = () => true

      if (!(e.pageX == mouseDownX && e.pageY == mouseDownY)) {
        sumX = sumX + deltaX
        sumY = sumY + deltaY
      }

      this.removeMove()
    },
     },
}
</script>
  1. 引用
    与a-modal属性大致相同
  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值