用vue+ts实现元素鼠标拖动完整代码

该博客介绍了如何使用JavaScript实现元素的拖动功能。通过监听鼠标事件,结合clientX, clientY, offsetTop, offsetLeft等属性计算元素的移动距离,并限制其在父容器内的移动范围,从而实现元素的拖拽效果。

实现效果

在这里插入图片描述

相关使用属性


  // clientX 鼠标相对于浏览器左上角x轴的坐标; 不随滚动条滚动而改变;
  // clientY 鼠标相对于浏览器左上角y轴的坐标; 不随滚动条滚动而改变;
  // element.offsetTop 指 element距离上方或上层控件的位置,整型,单位像素。

  // element.offsetLeft 指 element距离左方或上层控件的位置,整型,单位像素。

  // element.offsetWidth 指 element控件自身的宽度,整型,单位像素。

  // element.offsetHeight 指 element控件自身的高度,整型,单位像素。
  //  clientHeigh = height + 上下padding

  //   clientWidth = width+左右padding

实现完整代码

<template>
  <div class="to-do-list" ref="parentBox">
    <div class="search-title">
      <h1 class="add-bold left-box" style="margin-left:35px">
        <a-icon type="unordered-list" style="margin-right: 10px;" />元素拖动
      </h1>
    </div>
    <a-button ref="moveBtn" style="width: 100px;height: 40px;transition:none" class="move-btn" type="primary"
      >拖动按钮</a-button
    >
  </div>
</template>

<script lang="ts">
import { Component, Emit, Inject, Prop, Ref, Vue, Watch } from 'vue-property-decorator';

@Component({
  components: {},
})
export default class BriberyInformation extends Vue {
  @Ref() readonly moveBtn;
  @Ref() readonly parentBox;

  btnDown() {
    let box = this.moveBtn.$el; //获取button的盒子dom元素
    let parentBox = this.parentBox; //获取button父级元素的dom元素
    let parentH = parentBox.clientHeight; //获取button父级元素的height
    let parentW = parentBox.clientWidth; //获取button父级元素的width

    let x, y;
    let moveX, moveY; //移动距离
    let maxX, maxY; //最大移动距离
    let isDrop = false;

    box.onmousedown = e => {
      x = e.clientX - box.offsetLeft; // e.clientX鼠标相对于浏览器左上角x轴的坐标-button上层控件的位置
      y = e.clientY - box.offsetTop;
      isDrop = true;
    };
    document.onmousemove = e => {
      if (isDrop) {
        e.preventDefault();
        moveX = e.clientX - x; //得到距离左边移动距离
        moveY = e.clientY - y; //得到距离上边移动距离

        //可移动最大距离
        maxX = parentW - box.offsetWidth;
        maxY = parentH - box.offsetHeight;

        //移动的有效距离计算
        //console.log(Math.min(-1, 4, 6, 12));//输出-1-----多个参数,返回最小值
        moveX = Math.min(maxX, Math.max(0, moveX));

        moveY = Math.min(maxY, Math.max(0, moveY));
        box.style.left = moveX + 'px';
        box.style.top = moveY + 'px';
      } else {
        return;
      }
    };
    document.onmouseup = e => {
      e.preventDefault();
      isDrop = false;
    };
  }

  mounted() {
    this.btnDown();
  }
}
</script>
<style scoped lang="less">
.to-do-list {
  position: relative;
  min-height: 600px;
  max-height: 600px;
  width: 600px;
  overflow: hidden;
  border: 2px solid black;
  .move-btn {
    position: absolute;
  }
}
</style>

参考来源:

参考来源:用JavaScript实现div的鼠标拖拽效果

Vue 3 结合 TypeScript (TS) 中实现 Ant Design Vue 的 Modal 可拖动功能,可以通过以下步骤进行: 1. 首先确保项目中已经安装并配置好了 Ant Design Vue 和 TypeScript。 2. 使用 `v-model` 来控制 Modal 的显示与隐藏。 3. 利用 `@before-enter`、`@enter`、`@after-enter`、`@before-leave`、`@leave` 和 `@after-leave` 这些事件钩子来处理拖动的逻辑。 4. 使用 `draggable` 属性的 `handle` 选项来指定 Modal 头部或任何其他可拖动的部分。 5. 在 Modal 中添加自定义的样式或方法来处理拖动事件。例如,你可以在 Modal 内部使用一个可拖动的 div 元素,并使用 `mousedown`、`mousemove` 和 `mouseup` 事件来实现拖动效果。 6. 通过修改 Modal 的 style 属性或直接使用 JavaScript 来改变其位置。 示例代码片段(基于 Vue 3 + TypeScript): ```typescript <template> <a-modal v-model:visible="visible" draggable @enter="handleModalEnter" @leave="handleModalLeave" :footer="[]" :handle="dragDom" @dragstart.native.prevent > <div class="drag-dom" ref="dragDom" @mousedown="handleMouseDown"> 我是拖动区域 </div> <!-- Modal 内容 --> </a-modal> </template> <script lang="ts"> import { defineComponent, ref, onMounted, onBeforeUnmount } from 'vue'; export default defineComponent({ setup() { const visible = ref(false); const dragDom = ref<HTMLElement | null>(null); const handleMouseDown = (e: MouseEvent) => { // 在这里实现拖动的逻辑 // e as MouseEvent 相当于 const e: MouseEvent = e // ... }; const handleModalEnter = (e: any) => { // Modal 进入动画开始之前的操作 }; const handleModalLeave = (e: any) => { // Modal 离开动画开始之前的操作 }; onMounted(() => { // 组件挂载后的操作,如绑定事件监听等 }); onBeforeUnmount(() => { // 组件销毁前的操作,如解绑事件监听等 }); return { visible, dragDom, handleMouseDown, handleModalEnter, handleModalLeave }; } }); </script> <style> .drag-dom { /* 自定义样式 */ } </style> ``` 在实现拖动逻辑时,通常需要记录鼠标的初始位置和元素的初始位置,然后在 `mousemove` 事件中计算偏移量,并相应地更新 Modal 的位置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值