vue中实现拖拽功能/可定制桌面

vue中实现拖拽互换模块功能

页面为了实现较好的交互功能和页面个性化设置,常出现模块拖拽交换的功能,vue中实现拖拽有一些插件,下面比较常用的两种方式:

vue-grid-layout

这种方式通过栅格布局、利用定位(绝对定位),即通过改变X和Y的坐标值来改变元素位置,监听鼠标的按下、移动和弹起事件。进阶做法:任意改变每一模块大小,可添加/删除模块。

拖拽效果:
在这里插入图片描述
用法:
1、
安装: npm install vue-grid-layout --save
**使用:**script标签下:import { GridLayout,GridItem } from ‘vue-grid-layout’

2、
template内容:

在这里插入图片描述
参数用法:

参数类型默认值说明
autoSizeBooleantrue是否根据内容确定容器的高度
colNumcolNum12列数
rowHeightNumber150行高
maxRowsNumberInfinity最大的行高
marginArray[10, 10]两个可移动元素间的距离
isDraggableBooleantrue是否支持推拽
isResizableBooleantrue是否支持改变大小
useCssTransformsBooleantrue是否使用自定义的过渡效果
verticalCompactBooleantrue是否使用verticalCompact布局
layoutArray-布局位置

3、data数据格式
在这里插入图片描述
其中x、y分别定位元素位置(相当于坐标),w、h分别是模块的宽和高,i为唯一标识;
xw即为元素 实际定位横坐标位置,yh为纵坐标位置。

4、事件
在这里插入图片描述
moveEvent()移动事件,即鼠标按下时的事件;
movedEvent()移动完成事件,鼠标抬起事件

这里需要注意用到一个监听函数(否则会出现拖拽模块时其他模块跟着移动)
在这里插入图片描述
在data里声明一个和layout相同的数组,用来存储历史记录,当拖拽完成后,historyLayout数组才更新数据。

5、交换算法
我们要实现的是模块拖拽时目标元素占据当前元素位置,其之后的元素向后顺移,其之前的元素位置不变。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如图将5移到2的位置,2,3,4向后移,0,1不变,从前向后换时,逻辑相反。

算法代码:
在这里插入图片描述
当删除某一模块时,后面的模块向前顺移,同时删除数组中元素。
在这里插入图片描述
优势: 接口较多,可以实现更多的功能(如模块宽高自定义等),交互感受较好
劣势: 操纵X和Y坐标,交互算法复杂,加入删除后逻辑更复杂,如果每一模块宽高相等,建议使用下面的方法。

awe-dnd

既然使用vue就要发挥其巨大优势——数据操控,dom元素被数组渲染,因此只要改变数组中数据位置即可,删除和添加模块也只需要增删数组元素。
页面效果:

在这里插入图片描述
实际项目样式:
在这里插入图片描述
页面有些丑,我们来看下代码实现:
1、
安装: npm install awe-dnd --save
应用: 在main.js中引入(或当前页面局部引入)
import VueDND from ‘awe-dnd’
Vue.use(VueDND)

2、
在这里插入图片描述
加入删除和增加模块后也只有这些代码,非常轻便。

**优势:**操纵数据顺序来改变元素位置,逻辑简单;
**劣势:**只适用于模块大小相同的情况,无法实现完全的定制

  • 0
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: Vue实现卡片拖拽功能可以使用vue-grid-layout插件,它是一个基于Gridster.js封装的Vue组件,支持拖拽、排序、缩放等功能。下面是一个简单的示例: 1. 安装vue-grid-layout插件: ``` npm install vue-grid-layout --save ``` 2. 在Vue组件引入并注册vue-grid-layout组件: ``` <template> <div> <vue-grid-layout :layout="layout" :col-num="12" :row-height="30" :is-draggable="true" :is-resizable="true" :vertical-compact="false" :margin="[10, 10]"> <div v-for="item in items" :key="item.id" :data-grid="{x: item.x, y: item.y, w: item.w, h: item.h}"> <div class="card">{{ item.text }}</div> </div> </vue-grid-layout> </div> </template> <script> import VueGridLayout from 'vue-grid-layout' export default { components: { VueGridLayout }, data() { return { layout: [ { x: 0, y: 0, w: 4, h: 2 }, { x: 4, y: 0, w: 4, h: 2 }, { x: 8, y: 0, w: 4, h: 2 }, { x: 0, y: 2, w: 4, h: 2 }, { x: 4, y: 2, w: 4, h: 2 }, { x: 8, y: 2, w: 4, h: 2 }, { x: 0, y: 4, w: 4, h: 2 }, { x: 4, y: 4, w: 4, h: 2 }, { x: 8, y: 4, w: 4, h: 2 } ], items: [ { id: 1, text: 'Card 1', x: 0, y: 0, w: 4, h: 2 }, { id: 2, text: 'Card 2', x: 4, y: 0, w: 4, h: 2 }, { id: 3, text: 'Card 3', x: 8, y: 0, w: 4, h: 2 }, { id: 4, text: 'Card 4', x: 0, y: 2, w: 4, h: 2 }, { id: 5, text: 'Card 5', x: 4, y: 2, w: 4, h: 2 }, { id: 6, text: 'Card 6', x: 8, y: 2, w: 4, h: 2 }, { id: 7, text: 'Card 7', x: 0, y: 4, w: 4, h: 2 }, { id: 8, text: 'Card 8', x: 4, y: 4, w: 4, h: 2 }, { id: 9, text: 'Card 9', x: 8, y: 4, w: 4, h: 2 } ] } } } </script> <style> .card { background-color: #eee; padding: 10px; } </style> ``` 3. 在Vue组件使用vue-grid-layout组件,并设置相关属性和回调函数。 其,`layout`为卡片的布局数据,`items`为卡片数据,可以设置卡片的大小、位置、内容等。`col-num`为列数,`row-height`为行高,`is-draggable`和`is-resizable`分别为是否可拖拽和缩放,`vertical-compact`为是否自动间隙调整,`margin`为卡片之间的间距。 通过以上步骤,就可以在Vue实现卡片拖拽功能了。如果需要更多定制化的功能,可以参考vue-grid-layout的文档进行配置。 ### 回答2: Vue.js是一个流行的JavaScript框架,提供了许多便捷的工具和组件,可以帮助我们快速构建交互式的Web应用程序。在Vue实现卡片拖拽功能可以通过使用Vue的指令和事件来实现。 首先,我们可以使用Vue自定义指令来实现拖拽功能。我们可以创建一个名为`v-draggable`的指令,并在其添加适当的事件监听器。在指令的`bind`和`update`钩子函数,我们可以添加`mousedown`、`mousemove`和`mouseup`事件的监听器来跟踪鼠标的位置,并计算卡片的偏移量。在`bind`钩子函数,我们还可以将卡片的初始位置保存起来,以便在拖拽结束时进行处理。 接下来,我们可以在需要拖拽功能的卡片元素上添加`v-draggable`指令,并传入相应的参数。例如,我们可以将卡片的位置信息传递给指令,使其知道卡片应该在哪个位置进行拖拽。这可以通过在指令的`bind`钩子函数将卡片的位置信息保存到指令实例的属性实现。 最后,我们还可以在指令添加一些逻辑,以处理拖拽结束时的操作。例如,我们可以在`mouseup`事件的监听器更新卡片的位置信息,并触发相应的事件来通知其他组件或监听器。 通过以上步骤,我们可以在Vue实现卡片拖拽功能。并且,由于Vue的响应式系统,我们可以很方便地更新卡片的位置信息,并对其进行相应的处理。这使得卡片拖拽功能更加灵活和易于扩展。 ### 回答3: Vue实现卡片拖拽功能可以通过Vue的事件绑定和动态样式来实现。以下是一个简单的示例代码: 首先,在Vue的data定义一个卡片对象数组,包含每个卡片的位置信息,如left和top: ```javascript data() { return { cards: [ { id: 1, left: 0, top: 0 }, { id: 2, left: 100, top: 0 }, { id: 3, left: 200, top: 0 } ], draggingCardId: null, offsetX: 0, offsetY: 0 }; }, ``` 然后,通过v-for指令渲染卡片列表,并为每个卡片绑定mousedown、mousemove、mouseup事件: ```html <div id="app"> <div class="card" v-for="card in cards" :key="card.id" :style="{ left: card.left + 'px', top: card.top + 'px' }" @mousedown="startDragging(card.id, $event)"> Card {{ card.id }} </div> </div> ``` 在methods,定义startDragging方法用于设置拖拽起点和拖拽的卡片ID,还有onDrag和stopDragging方法用于设置卡片位置和清空拖拽信息: ```javascript methods: { startDragging(cardId, event) { this.draggingCardId = cardId; this.offsetX = event.clientX - this.cards[cardId - 1].left; this.offsetY = event.clientY - this.cards[cardId - 1].top; document.addEventListener('mousemove', this.onDrag); document.addEventListener('mouseup', this.stopDragging); }, onDrag(event) { if (this.draggingCardId !== null) { this.cards[this.draggingCardId - 1].left = event.clientX - this.offsetX; this.cards[this.draggingCardId - 1].top = event.clientY - this.offsetY; } }, stopDragging() { this.draggingCardId = null; document.removeEventListener('mousemove', this.onDrag); document.removeEventListener('mouseup', this.stopDragging); } } ``` 通过上述代码,我们就可以实现拖拽卡片的功能。当鼠标按下时,调用startDragging方法设置起点和卡片ID,然后在mousemove事件通过onDrag方法不断更新卡片的位置,当鼠标释放时,调用stopDragging方法将拖拽信息清空。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值