<template>
  <div class='dialog' :style="{top: top + 'px', left: left + 'px', zIndex: zIndex}">
    <div class='dialog-title' @mousedown="handleMouseDown">
      <slot name='title'></slot>
    </div>
    <div class='dialog-content'>
      <slot></slot>
    </div>
  </div>
</template>
<script>
export default {
  data() {
    return {
      dragging: false,
      top: 0,
      left: 0,
      startX: 0,
      startY: 0,
      zIndex: 1000
    }
  },
  methods: {
    handleMouseDown(event) {
      this.dragging = true
      this.startX = event.clientX
      this.startY = event.clientY
    },
    handleMouseMove(event) {
      if (this.dragging) {
        const deltaX = event.clientX - this.startX
        const deltaY = event.clientY - this.startY
        this.left += deltaX
        this.top += deltaY
        this.startX = event.clientX
        this.startY = event.clientY
      }
    },
    handleMouseUp() {
      this.dragging = false
    }
  },
  mounted() {
    document.addEventListener('mousemove', this.handleMouseMove)
    document.addEventListener('mouseup', this.handleMouseUp)
  },
  beforeDestroy() {
    document.removeEventListener('mousemove', this.handleMouseMove)
    document.removeEventListener('mouseup', this.handleMouseUp)
  }
}
</script>
<style scoped>
.dialog {
  position: absolute;
  width: 400px;
  background-color: #fff;
  border: 1px solid #ddd;
}
.dialog-title {
  padding: 10px;
  cursor: move;
  background-color: #f5f5f5;
}
.dialog-content {
  padding: 20px;
}
</style>
<p>该代码示例展示了如何使用 Vue2 创建一个可拖拽的 Dialog 弹框。</p>
<p>我们创建了一个名为 'Dialog' 的 Vue 组件,该组件包含一个可拖拽的弹框。</p>
<p>通过使用 'mousedown'、'mousemove' 和 'mouseup' 事件,实现了拖拽功能。</p>
<p>当用户按下鼠标左键时,我们将 'dragging' 属性设置为 'true',并记录鼠标初始位置。</p>
<p>然后,在移动鼠标时,我们计算鼠标位置的变化,并更新弹框的位置。</p>
<p>最后,在松开鼠标时,我们将 'dragging' 属性设置为 'false',以停止拖拽操作。</p>
<p>我们还将弹框的位置、z-index 属性和样式绑定到 Vue 组件的数据属性上,以使其可响应式地更新。</p>
<p>在组件的模板中,我们使用了插槽来允许用户自定义弹框的标题和内容。</p>
<p>我们还为标题元素添加了 'mousedown' 事件监听器,以启动拖拽操作。</p>
<p>最后,我们还为组件添加了一些基本的 CSS 样式,以使其看起来更像一个弹框。</p>
Vue2 实现可拖拽 Dialog 弹框:代码示例与解析

原文地址: https://www.cveoy.top/t/topic/ozQm 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录