<!-- HomeComp.vue -->

<template>

  <div class="home-comp" v-draggable>

    <!-- 子组件内容 -->

  </div>

</template>


<script>

export default {

  directives: {

    draggable: {

      bind(el, binding, vnode) {

        // 在元素上绑定mousedown事件,开始拖拽

        el.addEventListener("mousedown", startDrag);


        function startDrag(event) {

          // 阻止默认行为,避免拖拽时选中文字等

          event.preventDefault();


          // 记录初始点击位置

          const startX = event.clientX;

          const startY = event.clientY;


          // 记录元素初始位置

          const startLeft = el.offsetLeft;

          const startTop = el.offsetTop;


          // 计算鼠标移动距离,并更新元素位置

          function moveHandler(event) {

            const offsetX = event.clientX - startX;

            const offsetY = event.clientY - startY;


            el.style.left = startLeft + offsetX + "px";

            el.style.top = startTop + offsetY + "px";

          }


          // 结束拖拽时移除事件监听器

          function endDrag() {

            document.removeEventListener("mousemove", moveHandler);

            document.removeEventListener("mouseup", endDrag);

          }


          // 监听mousemove和mouseup事件

          document.addEventListener("mousemove", moveHandler);

          document.addEventListener("mouseup", endDrag);

        }

      }

    }

  }

};

</script>


<style scoped>

.home-comp {

  position: absolute;

  /* 初始位置 */

  left: 100px;

  top: 100px;

}

</style>