元素在容器内拖拽移动

之前做过元素的拖拽及数据传输,最近碰到一个在容器内拖拽移动的需求

主要是通过 mousemove 方法,监听元素的位置并赋值

首先是鼠标按下事件,鼠标按下之后,全局添加监听事件,监听鼠标的移动和鼠标的松开事件

const mousedown = (e: any, index: number) => {
  e.preventDefault()
  moveIndex.value = index;
  window.addEventListener("mousemove", mousemove);
  window.addEventListener("mouseup", mouseup);
}

鼠标移动动态赋值

const mousemove = (e: any) => {
  dataList.value[moveIndex.value].x =
    e.pageX - dragContainer.value.getBoundingClientRect().left >= 25
      ? e.pageX - dragContainer.value.getBoundingClientRect().left - 25
      : 0;
  dataList.value[moveIndex.value].y =
    e.pageY - dragContainer.value.getBoundingClientRect().top >= 25
      ? e.pageY - dragContainer.value.getBoundingClientRect().top - 25
      : 0;
};

鼠标松开时移除监听事件

const mouseup = () => {
  moveIndex.value = null;
  window.removeEventListener("mousemove", mousemove);
  window.removeEventListener("mouseup", mouseup);
};

需要注意的是:

1. 元素距离容器的距离不能为负值(若未负值则元素会移出容器外)

2. 鼠标按下时 要加上 e.preventDefault() 阻止冒泡,当元素为图片时,不加 e.preventDefault() 会造成鼠标松开时未移除元素的移动事件 mousemove

下面是全部代码(demo只做了上和左不能移出容器的处理,下和右同理)

<template>
  <div class="drag-title">元素在容器内拖拽</div>
  <div class="drag-container" ref="dragContainer">
    <div
      class="drag-el"
      v-for="(item, index) in dataList"
      :key="index"
      :style="{ top: item.y + 'px', left: item.x + 'px' }"
      @mousedown="mousedown($event, index)"
    >
      {{ item.name }}
    </div>
  </div>
</template>

<script lang="ts" setup>
import { ref } from "vue";

const dragContainer = ref();

const dataList = ref([
  {
    name: "元素1",
    x: 0,
    y: 0,
  },
  {
    name: "元素2",
    x: 100,
    y: 100,
  },
  {
    name: "元素3",
    x: 200,
    y: 200,
  },
]);

// 当前移动项
const moveIndex = ref<any>(null);
const mousedown = (e: any, index: number) => {
  moveIndex.value = index;
  window.addEventListener("mousemove", mousemove);
  window.addEventListener("mouseup", mouseup);
};

const mousemove = (e: any) => {
  dataList.value[moveIndex.value].x =
    e.pageX - dragContainer.value.getBoundingClientRect().left >= 25
      ? e.pageX - dragContainer.value.getBoundingClientRect().left - 25
      : 0;
  dataList.value[moveIndex.value].y =
    e.pageY - dragContainer.value.getBoundingClientRect().top >= 25
      ? e.pageY - dragContainer.value.getBoundingClientRect().top - 25
      : 0;
};

const mouseup = () => {
  moveIndex.value = null;
  window.removeEventListener("mousemove", mousemove);
  window.removeEventListener("mouseup", mouseup);
};
</script>

<style lang="less" scoped>
.drag-title {
  margin: 10px 0;
  text-align: center;
  font-size: 18px;
  font-weight: bold;
}
.drag-container {
  margin: 0 auto;
  width: 800px;
  height: 600px;
  background: skyblue;

  position: relative;
  .drag-el {
    position: absolute;
    width: 50px;
    height: 50px;
    background: yellowgreen;

    display: flex;
    align-items: center;
    justify-content: center;
    user-select: none;

    cursor: move;
  }
}
</style>

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要自定义拖拽容器移动样式,可以使用CSS的`dragover`和`dragenter`伪类,来改变拖拽容器的样式。具体实现可以参考以下代码示例: ```css /* 拖拽容器的默认样式 */ #container { border: 1px solid #ccc; padding: 10px; } /* 拖拽容器拖拽时的样式 */ #container.dragover { border: 2px dashed #aaa; background-color: #f5f5f5; } /* 拖拽容器元素拖拽时的样式 */ #container .draggable.dragging { opacity: 0.5; cursor: move; } ``` 在上面的代码,我们定义了三种不同状态下的样式: - 默认样式:拖拽容器的默认样式。 - 拖拽样式:当拖拽容器拖拽时触发的样式,使用了`dragover`伪类来定义。 - 元素拖拽样式:当拖拽容器元素拖拽时触发的样式,使用了`.draggable.dragging`选择器来定义。 然后在JavaScript代码,我们可以通过添加或移除`dragover`类来改变拖拽容器的样式,具体实现可以参考以下代码: ```javascript // 获取拖拽容器 const container = document.getElementById('container'); // 绑定dragover事件 container.addEventListener('dragover', function (event) { event.preventDefault(); // 添加dragover类 container.classList.add('dragover'); }); // 绑定dragleave事件 container.addEventListener('dragleave', function (event) { // 移除dragover类 container.classList.remove('dragover'); }); // 绑定drop事件 container.addEventListener('drop', function (event) { event.preventDefault(); // 移除dragover类 container.classList.remove('dragover'); // 获取被拖拽元素的数据 const data = event.dataTransfer.getData('text/plain'); // 将元素移动到新位置 event.target.appendChild(document.getElementById(data)); }); ``` 在上面的代码,我们添加了`dragover`和`dragleave`事件,通过添加或移除`dragover`类来改变拖拽容器的样式。同时,我们还绑定了drop事件,将元素移动到新的位置。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值