网址:vue3-draggable-resizable - npm
npm下载插件
$ npm install vue3-draggable-resizable
文件中引入:全局注册
// >main.js import { createApp } from 'vue' import App from './App.vue' import Vue3DraggableResizable from 'vue3-draggable-resizable' //default styles import 'vue3-draggable-resizable/dist/Vue3DraggableResizable.css' // You will have a global component named "Vue3DraggableResizable" createApp(App) .use(Vue3DraggableResizable) .mount('#app')
在组件中使用
// >component.js import { defineComponent } from 'vue' import Vue3DraggableResizable from 'vue3-draggable-resizable' //default styles import 'vue3-draggable-resizable/dist/Vue3DraggableResizable.css' export default defineComponent({ components: { Vue3DraggableResizable } // ...other })
示范案例:
This is a test example
initW:设置宽度;
initH:设置高度;
w:容器的当前宽度(px),您可以使用“v-model:w”使其保持最新状态;
h:容器的当前高度(px),您可以使用“v-model:h”使其保持最新状态;
x:容器的当前距离左边的距离(px),您可以使用“v-model:x”使其保持最新状态;
y:容器的当前距离顶部的距离(px),您可以使用“v-model:y”使其保持最新状态;
minW:设置最小宽度;
minH:设置最小高度;
active:显示该组件是否被选中,您可以使用“v-model:active”使其保持最新状态;
draggable:定义组件是否可拖动;
resizable:定义组件是否可调整大小;
lockAspectRatio:lockAspectRatio属性用于锁定长宽比;
disabledX:定义组件是否可以在x轴上移动;
disabledY:定义组件是否可以在y轴上移动;
disabledW:定义组件的宽度是否可以修改;
disabledH:定义组件的高度是否可以修改;
parent:限制父节点内的移动和大小;
handles:定义枚举的大小数组来限制元素的大小调整
default: ['tl', 'tm', 'tr', 'ml', 'mr', 'bl', 'bm', 'br']
tl
: Top lefttm
: Top middletr
: Top rightmr
: Middle rightml
: Middle leftbl
: Bottom leftbm
: Bottom middlebr
: Bottom right
classNameDraggable:用于在启用可拖动组件时设置可拖动可调整大小的组件的自定义类;
classNameResizable:用于在拖动时设置可拖动可调整大小的组件的自定义类;
classNameDragging:用于在拖动时设置可拖动可调整大小的组件的自定义类;
classNameResizing:用于在调整大小时设置可拖动可调整大小的组件的自定义类;
classNameActive:用于在活动时设置可拖动可调整大小的组件的自定义类;
classNameHandle:用于设置每个句柄元素的自定义公共类。
[Vue3 组件] 用于拖拽调整位置和大小的的组件,同时支持冲突检测,元素吸附对齐,实时参考线。
$ npm install vue3-draggable-resizable
使用 use 方法注册组件
// >main.js import { createApp } from 'vue' import App from './App.vue' import Vue3DraggableResizable from 'vue3-draggable-resizable' //需引入默认样式 import 'vue3-draggable-resizable/dist/Vue3DraggableResizable.css' // 你将会获得一个名为Vue3DraggableResizable的全局组件 createApp(App) .use(Vue3DraggableResizable) .mount('#app')
也可以单独在你的组件内部使用
// >component.js import { defineComponent } from 'vue' import Vue3DraggableResizable from 'vue3-draggable-resizable' //需引入默认样式 import 'vue3-draggable-resizable/dist/Vue3DraggableResizable.css' export default defineComponent({ components: { Vue3DraggableResizable } // ...other })
下面是一个使用 vue-template 语法写的例子
This is a test example
type: Number
default: null
设置初始宽度(px)
type: Number
default: null
设置初始高度(px)
type: Number
default: 0
组件的当前宽度(px)
你可以使用“v-model:w”语法使它和父组件保持一致
type: Number
default: 0
组件的当前高度(px)
你可以使用“v-model:h”语法使它和父组件保持一致
type: Number
default: 0
组件距离父容器的左侧的距离(px)
你可以使用“v-model:x”语法使它和父组件保持一致
type: Number
default: 0
组件距离父容器顶部的距离(px)
你可以使用“v-model:y”语法使它和父组件保持一致
type: Number
default: 20
组件的最小宽度(px)
type: Number
default: 20
组件的最小高度(px)
type: Boolean
default: false
组件当前是否处于活跃状态
你可以使用“v-model:active”语法使它和父组件保持一致
type: Boolean
default: true
组件是否可拖动
type: Boolean
default: true
组件是否可调整大小
type: Boolean
default: false
该属性用来设置是否锁定比例
type: Boolean
default: false
是否禁止组件在 X 轴上移动
type: Boolean
default: false
是否禁止组件在 Y 轴上移动
type: Boolean
default: false
是否禁止组件修改宽度
type: Boolean
default: false
是否禁止组件修改高度
type: Boolean
default: false
是否将组件的拖动和缩放限制在其父节点内,即组件不会超出父节点,默认关闭
type: Array
default: ['tl', 'tm', 'tr', 'ml', 'mr', 'bl', 'bm', 'br']
定义缩放的句柄(共八个方向)
tl
: 上左tm
: 上中tr
: 上右mr
: 中左ml
: 中右bl
: 下左bm
: 下中br
: 下右type: String
default: draggable
自定义组件的类名,该类名在组件是“可拖动”时显示
type: String
default: resizable
自定义组件类名,该类名在组件是“可缩放”时显示
type: String
default: dragging
定义组件在拖动时显示的类名
type: String
default: resizing
定义组件在缩放时显示的类名
type: String
default: active
定义组件在活跃状态下的类名
type: String
default: handle
定义缩放句柄的类名
以上设置将会渲染出下面的缩放句柄节点(my-handle-*)
... ...
payload: -
组件从非活跃状态到活跃状态时触发
payload: -
组件从活跃状态到非活跃状态时触发
payload: { x: number, y: number }
组件开始拖动时触发
payload: { x: number, y: number }v
组件在拖动过程中持续触发
payload: { x: number, y: number }
组件拖动结束时触发
payload: { x: number, y: number, w: number, h: number }
组件开始缩放时触发
payload: { x: number, y: number, w: number, h: number }
组件在缩放过程中持续触发
payload: { x: number, y: number, w: number, h: number }
组件缩放结束时触发
吸附对齐功能可以在拖动过程中和其他元素自动吸附,你也可以自定义吸附对齐的校准线
你需要引入另外一个组件来使用该特性
像下面这样,将 Vue3DraggableResizable 放在 DraggableContainer 内:
Test Another test
这些 props 适用于 DraggableContainer 组件
type: Boolean
default: false
关闭吸附对齐功能
Test Another test
type: Boolean
default: true
是否和父组件对齐,如果开启,则元素拖拽到父容器边缘(父容器的上中下左中右边)时会发生吸附,否则不会
Test Another test
type: Array
default: null
自定义列的校准线,元素在x轴上拖动到这些线附近时,会产生吸附
Test Another test
type: Array
default: null
自定义行的校准线,元素在y轴上拖动到这些线附近时,会产生吸附
Test Another test
type: Boolean
default: true
是否显示实时参考线,元素在产生自动吸附后,会有一条参考线线出现,如果不需要,可通过该选项关闭。
Test Another test
type: String
default: #f00
实时参考线的颜色,默认红色
Test Another test
1.activated
2.deactivated
3.drag-start
4.dragging
5.drag-end
6.resize-start
7.resizing
8.resize-end
网址:Vue3DragResizeRotate
最基本的组件,没有任何道具,甚至可以在父元素之外自由移动。
基本组件 你可以拖着我,按照自己的意愿调整大小。1
你可以拖着我,按照自己的意愿调整大小。2
自适应大小 随便填一点内容,我会自动适应大小
具有Min Height和Min Width基本组件的基本组件,最小高度和最小宽度分别由:minw
和:minh
属性控制。
min Width: min Height: 基本组件,可以配置
minWidth 和 minHeight 属性 w:{{ w }},h:{{ h }}
具有Max Height和Max Width基本组件的基本组件,最大高度和最大宽度分别由 :max-height
和:max-width
属性控制。
一个基本组件,内部有一个表单。 输入应该是可聚焦的,按钮应该是可点击的。
组件插槽 基本组件内插入表单
一个基本组件,带有active
prop,用于控制组件外部的活动状态。
Toggle Active1 Toggle Active2 外部组件通过控制 :active prop来控制组件的激活状态
外部组件通过控制 :active prop来控制组件的激活状态
一个基本组件,带有prevent-deactivation
prop,以避免在外部点击时解除活动状态。
外部点击不会失活 设置 :prevent-deactivation 属性,让组件不能取消激活状态
设置 :prevent-deactivation 属性,让组件不能取消激活状态
一个基本组件,draggable
prop设置为false
,因此它不可拖动。
一个基本组件,resizable
prop设置为false
,因此它不可调整大小。
一个基本组件,rotatable
prop设置为true
,因此它可以旋转角度。
一个基本组件,enable-native-drag
prop设置为true
,以允许组件内部元素的拖动行为。 您可以通过使用球拖动每个组件来查看差异。 默认值为false
。
允许内部元素拖拽 不允许浏览器原生JavaScript拖拽
Native drag disabled. Try to drag the component from the ball.
允许浏览器原生JavaScript拖拽
Native drag enabled. Try to drag the component from the ball.
一个基本组件,只能通过一个句柄拖动,由prop drag-handle
和一个有效的CSS选择器来指定,只能通过该DOM元素来拖动组件。
限制允许拖动的范围 Drag Only Here
一个基本组件,无法通过句柄拖动,由prop drag-cancel
和有效的CSS选择器来指定,该范围无法将无法拖动组件。
限制禁止拖动的范围 Cannot Drag Here
一个基本组件,使用z-index
prop来控制组件外部的z-index
。 如果没有提供,它将采用值auto
。
Change z-index: 通过 :z属性 控制组件的z-index:{{ z }}层级
1 9
您可以使用handles
prop选择要为组件提供的句柄,它接受句柄数组。 例如,如果你想仅在横轴上进行成本调整,你只能提供左右句柄:handles =“['ml','mr']”
。
Enable/disable handles.
- {{ handle }} - {{ handles[handle] ? "✓" : "✗" }}
一个基本组件,使用axis
来控制可拖动的轴。 合适的值是x
,y
或both
。
Draggable on {{ axis }} axis.
阻止用户选中组件内文本
Toggle disableUserSelect1 Toggle disableUserSelect2 你 {{ disableUserSelect1 ? "不可以" : "可以" }} 选择组件内部的的文字,不妨双击试试!!!
:disableUserSelect prop equal to {{ disableUserSelect1 }}.
你 {{ disableUserSelect2 ? "不可以" : "可以" }} 选择组件内部的的文字,不妨双击试试!!!
:disableUserSelect prop equal to {{ disableUserSelect2 }}.
放缩时,建议保持父元素盒子和vue-drag-resize-rotate放缩值保持一致
scaleRatio 位置为({{ position.x }},{{ position.y }})
大小为({{ position.w }},{{ position.h }})
角度为{{ angle }}
一个基本组件,用grid = [20,20]
prop来设置网格单元的尺寸(高度和宽度,以像素为单位)。
Size: {{ width }} x {{ height }} Grid 20x20 starting from the top-left corner
2.网格20x40
始终从组件的左上角计算网格。 在此示例中,您可以看到它相对于父元素具有偏移量。 这对于父元素中的成本要求很重要。
Size: {{ width }} x {{ height }} Grid 20x20 starting with a 10x10 offset
4.网格20x40+偏移10x20+最小限制
如果您提供的minHeight
和minWidth
值低于相应的网格值,您可以注意到调整大小会停止到最低的合适值。 例如,在x
轴上,尊重minWidth
和grid [x]
约束的最低有效值是40.同样适用于y
轴。
Size: {{ width }} x {{ height }} Grid 20x40 starting with a 10x20 offset and min height, min width values equal to 30.
5.网格20x40+偏移10x20+最大限制
如果提供的maxHeight
和maxWidth
值高于相应的网格值,则可以注意到调整大小会停止到较低的合适值。 例如,在x
轴上,尊重maxWidth
和grid [x]
约束的最低有效值是80.这同样适用于y
轴。
无法在其父元素之外拖动或调整大小的组件,使用prop :parent =“true”
定义。
父级容器基本案例 你不能将当前组件拖动或调整大小超过父元素容器
父级+自适应 随便填一点东西
无法在其父元素之外拖动或调整大小的组件,使用 maxWidth 和 maxHeight 来限制其大小。
Size: {{ width }} x {{ height }} Component costrained in parent with maxWidth and maxHeight equal to 300.
附加到网格的组件,不能在其父元素之外拖动或调整大小,使用prop :parent =“true”
定义。 在这种情况下,父级的大小完全匹配网格。
父级+网格 You cannot move me or resize me outside my parent.
组件附加到具有小偏移的网格。 它的起始位置与父级的左上角不完全对齐。
父级限制+网格+偏移 You cannot move me or resize me outside my parent. And my edges cannot touch the parent element.
附加到网格的组件,无法在其父元素之外拖动或调整大小,使用 maxWidth 和 maxHeight 来限制其大小。 __Notice__使用20
作为grid
prop为 y轴,元素的maxHeight
是280
而不是290
。
Size: {{ width }} x {{ height }} Component costrained in parent with maxWidth and maxHeight equal to 290.
一个基本的父控制组件,x
,y
,w
和h
用于控制组件位置和大小的道具。 __Notice__使用grid
prop,组件只会对网格值的有效倍数作出反应。
X: Y: Width: Height: You cannot move me or resize me outside my parent.
具有lock-aspect-ratio
prop的组件,用于在调整大小期间保持组件的宽高比。
Toggle Lock Aspect Ratio Keep aspect ratio using :lock-aspect-ratio prop.
一个组件,lock-aspect-ratio
prop和最小高度设置为100
,最小宽度设置为50
.请注意,锁定纵横比也会强制最小宽度为100(条件:1 / 1)。
Size: {{ width }} x {{ height }} Keep aspect ratio and set minHeight to 100 and minWidth to 50.
一个组件,lock-aspect-ratio
prop和 maxWidth 设置为300
, maxHeight 设置为250
。 请注意,锁定纵横比也会强制最大宽度为250
。
在父级中使用的组件,lock-aspect-ratio
prop用于在调整大小期间保持组件的宽高比。
Combine aspect ratio and costrain in parent.
具有宽高比的组件在20x20网格上进行了受限
使用lock-aspect-ratio
时,在网格上使用组件的成本并不是很好。 您可以通过拖动(例如右手柄或底部手柄)来注意到您有不同的结果。
Keep aspect ratio in component costrained on grid.
Aspect ratio in Grid 20x40 starting with a 10x20 offset
Keep aspect ratio, grid and parent costrained.
具有lock-aspect-ratio
prop的组件,用于在调整大小期间保持组件的宽高比。
设置outsideAspectRatio
来控制组件的纵横比
Toggle Lock Aspect Ratio Keep aspect ratio using :lock-aspect-ratio prop.
具有自定义类名的组件,由prop class-name
提供。
具有自定义类名的组件 你可以给组件设置一个类名,覆盖其默认类名 class-name
在拖动时具有自定义类名的组件,由prop class-name-dragging
提供。
拖动时具有自定义类名的组件 你也可以设置组件处于拖拽式的类名 class-name-dragging
调整大小时具有自定义类名的组件,由prop class-name-resizing
提供。
在活动状态下具有自定义类名的组件,由prop class-name-active
提供。
具有handle的自定义类的组件,随prop class-name-handle
提供。 这样,您可以单独设置每个手柄的样式。
记得为句柄类设置position:absolute
具有句柄自定义标记的组件,由VueJS named slots提供(例如slot =“tl”
)。
Slots | Vue.js
具有句柄自定义标记的组件 The first child will populate the default slot.
😀 😂 😆 😉 😎 😍 😣 😕
当组件被激活时,会发出activated()
事件。 当组件被停用时,会发出deactivated()
事件。
点击激活组件activated和取消激活deactivated 这个组件正处于激活状态
拖动组件时会发出dragging(x,y)
事件。 拖动停止时会发生dragstop(x,y)
事件。
拖动组件触发事件dragging和停止拖拽dragstop {{ dragging ? "你正在拖动" : "我就待在这里" }}
X: {{ x }} / Y: {{ y }}
调整组件大小时会发出resizing(x,y,width,height)
事件。 调整大小停止时会发出resizestop(x,y,width,height)
事件。
调整大小触发事件resizing和停止调整resizestop {{ resizing ? "你正在调整大小" : "这个大小还行" }}
X: {{ x }} / Y: {{ y }} - Width: {{ width }} / Height: {{ height }}
调整旋转角度触发事件rotating和rotatestop {{ rotating ? "你正在旋转" : "这个角度刚刚好" }}
Rotate: {{ rotate }}
开启冲突检测时,各个可拖拽组件之间不可重叠,冲突后当前元素回到原来的位置
位置冲突检测
设置:snap="true"
开启吸附功能和设置:snapTolerance="20"
可控制吸附判断距离
位置吸附对齐
返回参数是一个Object,里面包含vLine
与hLine
,具体使用参考下面代码。
对齐时出现辅助线
默认情况下,这不是组件提供的功能,但它是如何使用现有功能构建复杂方案的示例。
由于ctrl
事件处理程序的注册方式,请确保在开始拖动元素之前单击容器内的任何位置。
dragging(element.id, left, top)" @dragstop="(left, top) => dragstop(element.id, left, top)" > {{ element.text }}