vue中实现拖拽功能

自定义的全局指令

提示:拖拽指令



提示:以下是本篇文章正文内容,下面案例可供参考

一、拖拽

1.自定义拖拽指令

代码如下(示例):仅供参考

	data(){
		return {
			params:''
		}
	},
  	directives: { // 自定义拖拽指令,先声明这个指令
     drag(el) { // 可就在里写指令的js代码
      const oDiv = el // 当前元素
      document.onselectstart = () => {
        return false
      }
      oDiv.onmousedown = e => { // 鼠标按下时的鼠标所在的X,Y坐标
        // 鼠标按下,计算当前元素距离可视区的距离
        const disX = e.clientX - oDiv.offsetLeft
        const disY = e.clientY - oDiv.offsetTop
        document.onmousemove = e => {
          // 通过事件委托,计算移动的距离 
          // 因为浏览器里并不能直接取到并且使用clientX、clientY,所以使用事件委托在内部做完赋值
          const l = e.clientX - disX
          const t = e.clientY - disY
          // 计算移动当前元素的位置,并且给该元素样式中的left和top值赋值
          oDiv.style.left = l + 'px'
          oDiv.style.top = t + 'px'
        }
        document.onmouseup = e => {  // 鼠标抬起,清空之前所在的位置,新拖拽的位置已生成并赋值
          document.onmousemove = null
          document.onmouseup = null
        }
        // return false不加的话可能导致黏连,拖到一个地方时div粘在鼠标上不下来,相当于onmouseup失效
        return false
      }
    }
  },

2.页面挂载

代码如下(示例):案列仅供参考

<el-popover
      id="customer"
      v-model="isShow"
      v-drag   // 直接挂在指令即可
      placement="left"
      trigger="manual"
    >

3.css样式

#kefu {
  //若用relative定位,该定位不脱离文档流,达不到初始化的样式效果
  //若用absolute定位,该定位相对于页面定位,虽然能实现拖动效果,但页面存在滚条时,会随着
  //滚动而改变top值;若没有滚动条,拖到边缘时超出部分也将出现滚动条显示。
  position: fixed;
  right: 10px;
  bottom: 10px;
  z-index: 999;
  width: 60px;
  height: 60px;
}

注:一定要用fixed定位,而不是使用relative、absolute定位。

参考文档:https://www.jianshu.com/p/9816e8b9040e

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答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方法将拖拽信息清空。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值