div横向拖动 vue_vue实现div拖拽互换位置
时间: 2023-06-30 11:24:33 浏览: 184
要实现 div 横向拖动并互换位置,可以使用 Vue.js 和一些 JavaScript 库来实现。
首先,你需要在 Vue.js 中创建一个拖动事件。你可以使用 `v-on:mousemove` 来监听鼠标移动事件,并使用 `v-on:mousedown` 来监听鼠标按下事件。在鼠标按下事件中,你需要记录鼠标的当前位置。
接下来,在鼠标移动事件中,你需要计算鼠标的偏移量,并将偏移量添加到 div 的 left 样式中。这将使 div 沿着 x 轴移动。
当鼠标释放时,你需要计算 div 的位置,并使用 JavaScript 库来实现 div 位置的互换。你可以使用 Sortable.js 或者 Draggable.js 这样的库来实现拖拽和位置交换。
最后,你需要将这些逻辑封装在一个 Vue.js 组件中,以便在应用程序中使用。以下是一个简单的示例:
```html
<template>
<div class="container">
<div v-for="(item, index) in items" :key="index"
:class="{ active: activeIndex === index }"
v-bind:style="{ left: item.left + 'px' }"
v-on:mousedown="startDrag(index, $event)">
{{ item.text }}
</div>
</div>
</template>
<script>
import Sortable from 'sortablejs';
export default {
data() {
return {
items: [
{ text: 'Item 1', left: 0 },
{ text: 'Item 2', left: 100 },
{ text: 'Item 3', left: 200 },
{ text: 'Item 4', left: 300 },
],
activeIndex: null,
startX: 0,
};
},
mounted() {
const container = this.$el.querySelector('.container');
Sortable.create(container, {
animation: 150,
swapThreshold: 0.5,
onSwap: (evt) => {
const { oldIndex, newIndex } = evt;
const item = this.items.splice(oldIndex, 1)[0];
this.items.splice(newIndex, 0, item);
},
});
},
methods: {
startDrag(index, event) {
this.activeIndex = index;
this.startX = event.clientX;
window.addEventListener('mousemove', this.drag);
window.addEventListener('mouseup', this.stopDrag);
},
drag(event) {
const deltaX = event.clientX - this.startX;
this.items[this.activeIndex].left += deltaX;
this.startX = event.clientX;
},
stopDrag() {
window.removeEventListener('mousemove', this.drag);
window.removeEventListener('mouseup', this.stopDrag);
this.activeIndex = null;
},
},
};
</script>
<style>
.container {
display: flex;
position: relative;
width: 100%;
height: 100px;
background-color: #f5f5f5;
}
.container > div {
position: absolute;
top: 0;
height: 100%;
width: 100px;
background-color: #fff;
border: 1px solid #ccc;
display: flex;
justify-content: center;
align-items: center;
cursor: move;
}
.container > div.active {
z-index: 1;
}
</style>
```
在这个示例中,我们创建了一个包含多个 div 的容器,并使用 Vue.js 的数据绑定将每个 div 的位置绑定到数据模型中。当用户按下鼠标并开始拖动 div 时,我们记录 div 的当前位置,并在每次移动时计算偏移量。当用户释放鼠标时,我们使用 Sortable.js 库来实现 div 的位置交换。
阅读全文