前端组件拖拽以及自定义组件布局demo(基于vue2实现)

  • 这篇文章简单介绍前端(vue)里组件拖拽以及拖拽完成以后组件自定义排列的的写法。主要介绍思路以及实现方式。
  • 组件的放大缩小以及拖拽借助一个不错的插件

vue-grid-layout
git文档:https://github.com/jbaysolutions/vue-grid-layout/blob/master/README-zh_CN.md

  • 这个插件定义的某一个元素的宽高是利用倍数计算宽高以及位置,在使用的时候可以自己先去定义一个栅格的背景,我做的是12格,通过javascript动态计算每一个元素占总宽度的百分比。下方图片展示
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201216175651706.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1NzM1NzI4,size_16,color_FFFFFF,t_70

  • 这个栅格布局是利用css的背景渐变实现(linear-gradient)
    在这里插入图片描述

  • 组件使用需要详细的看文档,下边我列一下代码片段
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 到这里就完成了栅格布局以及栅格内的元素拖拽以及放大缩小

下边介绍从左侧列表内拖拽组件在右侧栅格布局内展示
  • 不借助插件,因为用插件可能会造成冲突(猜测,没有测过),有一款拖拽插件,有兴趣可以试一试 => vuedraggable
  • 思路

1.首先要利用鼠标事件

鼠标按下事件 onmousedown
鼠标移动事件 onmousemove
鼠标抬起事件 onmouseup

2.鼠标按下时,确定按的是列表的哪个元素,获取到对应的数据,鼠标按下事件实在当前元素的身上。
3.鼠标按下时,这时如果要拖拽,那这时鼠标移动事件就得是全局的了,因为要把元素拖到栅格容器内,要在window上操作onmousemove,那么能拿到鼠标距离屏幕左侧以及上边的距离,也就是x轴和y轴的坐标点,那么这时拖动的并不是当前在dom结构里的元素,而是一个定位的元素(需要页面上有一个隐藏的定位元素,拖拽的时候显示),这时要把你拿到的数据,赋值给到定位的数据,把鼠标的距离,也就是保存的坐标点赋值到定位元素的top,和left。如下图:
在这里插入图片描述
3.这时候拖拽就实现了,要把它准确的拖到栅格容器内那么它才会显示出来,就要判断鼠标距离屏幕左侧距离是否大于栅格容器距离屏幕左侧距离,以及鼠标距离屏幕顶部距离是否大于栅格容器距离屏幕顶部距离。
4.这时还需要一个开关去控制是否要监听鼠标移动事件,否则鼠标一开始移动就会触发你的逻辑(很重要)。
5.到这里基本就实现了左侧拖拽列表元素到栅格容器内展示出来。里面还有一系列的判断,比如,你已经把某一个元素拖进去了,那么它就不能在进行拖拽,以及鼠标在进入栅格容器时并没有抬起鼠标左键而是移动出去抬起,那么就要删除你放到容器里的元素;鼠标进入容器内时,元素会显示出来,这是如果没有抬起鼠标,还是在移动状态,那么这个容器内的元素就要随着鼠标移动;以及你已经拖拽到容器内部了,那左侧列表对应的哪一项就要变换样式以及鼠标移入时不可拖拽等一系列的需求。如下图简单展示一下:
在这里插入图片描述
在这里插入图片描述

  • 部分js
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
code_demo

  • 17
    点赞
  • 101
    收藏
    觉得还不错? 一键收藏
  • 23
    评论
Vue 组件可以通过使用 HTML5 的放 API 实现,具体步骤如下: 1. 在组件定义一个 `draggable` 属性,设置为 `true`,表示该组件。 2. 监听组件的 `dragstart` 事件,在事件处理函数中设置 `event.dataTransfer.setData` 方法,将要传递的数据存储到 `dataTransfer` 对象中,这里可以存储组件的标识符或其他需要传递的数据。 3. 监听组件的 `dragover` 事件,阻止默认行为(即禁止放元素的默认行为,如禁止在时选中文本),同时设置 `event.dataTransfer.dropEffect` 属性,表示当前的放操作是复制、移动还是链接等。 4. 监听组件的 `drop` 事件,在事件处理函数中获取 `dataTransfer` 对象中存储的数据,进行相关操作。 下面是一个简单的示例: ```vue <template> <div> <div class="box" draggable="true" @dragstart="onDragStart">我</div> <div class="dropzone" @dragover.prevent @drop="onDrop">放置区域</div> </div> </template> <script> export default { methods: { onDragStart(event) { // 设置要传递的数据 event.dataTransfer.setData('text/plain', 'box'); }, onDrop(event) { // 获取传递的数据 const type = event.dataTransfer.getData('text/plain'); if (type === 'box') { console.log('成功!'); } } } } </script> ``` 在上面的示例中,我们在 `box` 元素上设置了 `draggable` 属性,并监听了 `dragstart` 事件,在事件处理函数中使用 `setData` 方法设置要传递的数据。在 `dropzone` 元素上监听了 `dragover` 和 `drop` 事件,分别阻止默认行为和获取传递的数据。当完成后,在控制台中会输出“成功!”。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值