vue-free-drag
Version:
基于Vue3的极简拖拽组件。可通过容器设置拖拽范围。
111 lines (98 loc) • 3.9 kB
Markdown
<h1 align="center">VueFreeDrag</h1>
<p align="center">一款基于vue3的极简拖拽组件!让你自由拖动!</p>
#### 介绍
- 轻量级的 vue 拖拽组件,可通过容器限制拖拽范围。
- 包含两个组件:DragDropContainer 容器组件,DragDrop 拖拽组件。
- 可搭配使用,也可分开使用。
### DragDropContainer 组件属性
| 属性名 | 类型 | 说明 |
| ------ | ------ | -------- |
| id | String | 唯一标识 |
| width | Number | 容器宽度 |
| height | Number | 容器高度 |
### DragDropContainer 组件方法
| 属性名 | 参数 | 说明 |
| -------------- | ---- | ------------------------------------------ |
| obtainChildren | | 动态添加子组件时调用此方法以更新子组件持有 |
### DragDrop 组件属性
| 属性名 | 类型 | 说明 |
| ----------- | ------- | ------------------------- |
| id | String | 唯一标识 |
| collision | Boolean | 是否碰撞,默认为 true。 |
| locking | Boolean | 是否可以移动,默认为 true |
| lockingX | Boolean | 锁定 X 轴,默认为 false |
| lockingY | Boolean | 锁定 Y 轴,默认为 false |
| initialTop | Number | 初始距离容器 top |
| initialLeft | Number | 初始距离容器 left |
### DragDrop 组件事件
| 属性名 | 参数 | 说明 |
| --------- | ---- | --------------------------------------------------------------------------------------- |
| change | none | {id\|String,left\|Number,top\|Number}。组件拖拽停止事件 |
| move | none | {id\|String,left\|Number,top\|Number}。组件拖拽移动事件 |
| collision | none | {targetId\|String,isContainer\|Boolen,left\|Number,top\|Number}。组件碰撞到其他组件事件 |
### 使用说明
```html
<DragDropContainer
id="conta"
:width="300"
:height="300"
style="border: 1px solid; box-sizing: border-box; margin-left: 100px; margin-top: 100px"
>
<DragDrop id="789" @change="dragDropChange" lockingX collision>
<div style="width: 100px; height: 100px; background-color: bisque">
<div>锁定X轴(789)</div>
</div>
</DragDrop>
<DragDrop id="mmm" :initialTop="0" :initialLeft="100" collision>
<div style="width: 100px; height: 100px; background-color: bisque">
<div>mmm</div>
</div>
</DragDrop>
<DragDrop id="sss" :initialTop="0" :initialLeft="200" collision>
<div style="width: 100px; height: 100px; background-color: bisque">
<div>sss</div>
</div>
</DragDrop>
<DragDrop id="ddd" :initialTop="100" :initialLeft="0" collision>
<div style="width: 100px; height: 100px; background-color: bisque">
<div>ddd</div>
</div>
</DragDrop>
<DragDrop id="jjj" :initialTop="200" :initialLeft="0" collision>
<div style="width: 100px; height: 100px; background-color: bisque">
<div>jjj</div>
</div>
</DragDrop>
<DragDrop
id="xxx"
@change="dragDropChange"
:initialTop="100"
:initialLeft="100"
lockingY
collision
>
<div style="width: 100px; height: 100px; background-color: bisque">
<div>锁定Y轴(xxx)</div>
</div>
</DragDrop>
<DragDrop
id="234"
@change="dragDropChange"
@move="dragDropMove"
:initialLeft="200"
:initialTop="200"
collision
>
<div style="width: 100px; height: 100px; background-color: aquamarine">联动主体(234)</div>
</DragDrop>
</DragDropContainer>
<DragDrop
id="122"
@change="dragDropChange"
:initialLeft="initialLeft"
:initialTop="initialTop"
:locking="false"
>
<div style="width: 100px; height: 100px; background-color: aquamarine">联动客体(122)</div>
</DragDrop>
```