Vue 用于可调整大小和可拖动元素的组件并支持冲突检测、元素吸附、元素对齐、辅助线
See the code当前主线已升级到 Vue 3.5+,并同步迁移到 Vite 5、Vitest 2、Storybook 8。
parent 现支持 Boolean | String,可直接传 CSS selectorw / h 支持 autox / y / w / h 属性设置无效问题activated 导致 transform 属性丢失问题minWidth / minHeight 动态改变activeOnTopselectOnContextMenurotateparent 传入 CSS 选择器Q 交流群:138146781
本组件基于 vue-draggable-resizable 进行二次开发。
之前这个 fork 主要维护冲突检测、吸附对齐、辅助线等增强能力。现在默认主线已经切换到 Vue 3,后续 README、示例和构建方式也都以 Vue 3 为准。
官方英文示例 | 本仓库 GitHub Pages 示例 | 自定义域名
说明:本仓库新增功能的演示主要在 Storybook 的
Advanced分类里查看。

npm install vue-draggable-resizable-gorkys
import { createApp } from 'vue'
import App from './App.vue'
import VueDraggableResizable from 'vue-draggable-resizable-gorkys'
import 'vue-draggable-resizable-gorkys/style.css'
const app = createApp(App)
app.component('vdr', VueDraggableResizable)
app.mount('#app')
<template>
<div style="height: 500px; width: 500px; border: 1px solid red; position: relative;">
<vdr :w="100" :h="100" @dragging="onDrag" @resizing="onResize" :parent="true">
<p>
Hello! I'm a flexible component. You can drag me around and you can resize me.<br>
X: {{ x }} / Y: {{ y }} - Width: {{ width }} / Height: {{ height }}
</p>
</vdr>
<vdr
:w="200"
:h="200"
:parent="true"
:min-width="200"
:min-height="200"
:is-conflict-check="true"
:snap="true"
:snap-tolerance="20"
/>
</div>
</template>
<script>
import vdr from 'vue-draggable-resizable-gorkys'
import 'vue-draggable-resizable-gorkys/style.css'
export default {
components: { vdr },
data () {
return {
width: 0,
height: 0,
x: 0,
y: 0
}
},
methods: {
onResize (x, y, width, height) {
this.x = x
this.y = y
this.width = width
this.height = height
},
onDrag (x, y) {
this.x = x
this.y = y
}
}
}
</script>
README.md 默认文档已切换到 Vue 3 版本说明dist/VueDraggableResizable.css 改为 style.csslint、test、build、storybook、build-storybookhandleInfo类型: Object
必需: false
默认:
{
size: 8,
offset: -5,
switch: true
}
当使用 transform: scale() 进行缩放操作时:
switch 控制 handle 是否保持视觉尺寸不变size 为 handle 大小offset 为 handle 位置偏移<vue-draggable-resizable :handle-info="{ size: 14, offset: -5, switch: true }" />
scaleRatio类型: Number
必需: false
默认: 1
用于修复在 transform: scale() 场景下,鼠标位置与拖拽/缩放位置偏移的问题。
<vue-draggable-resizable :scale-ratio="0.6" />
isConflictCheck类型: Boolean
必需: false
默认: false
定义组件是否开启冲突检测。
<vue-draggable-resizable :is-conflict-check="true" />
snap类型: Boolean
必需: false
默认: false
定义组件是否开启元素对齐/吸附。
<vue-draggable-resizable :snap="true" />
snapTolerance类型: Number
必需: false
默认: 5
当启用 snap 时,定义组件与元素之间的对齐距离,单位为像素。
<vue-draggable-resizable :snap="true" :snap-tolerance="20" />
parent类型: Boolean | String
必需: false
默认: false
用于限制组件拖拽/缩放边界:
true 时,限制在直接父元素内<vue-draggable-resizable :parent="true" />
<vue-draggable-resizable parent=".canvas-container" />
w / h类型: Number | String
必需: false
除数字外,也支持传入 auto,组件会按照内容尺寸初始化,后续手动缩放后再转为具体数值。
<vue-draggable-resizable w="auto" h="auto" />
activeOnTop类型: Boolean
必需: false
默认: false
定义组件激活时是否自动提升到最前面。
<vue-draggable-resizable :active-on-top="true" />
selectOnContextMenu类型: Boolean
必需: false
默认: false
定义组件是否支持右键选中。
<vue-draggable-resizable :select-on-context-menu="true" />
rotate类型: Number
必需: false
默认: 0
定义组件旋转角度,单位为度。
<vue-draggable-resizable :rotate="45" />
refLineParams参数: params
返回值为一个对象,包含 vLine 和 hLine,可用于自行渲染辅助线。
<template>
<div>
<vue-draggable-resizable :snap="true" :snap-tolerance="20" @refLineParams="getRefLineParams" />
<vue-draggable-resizable :snap="true" :snap-tolerance="20" @refLineParams="getRefLineParams" />
<span
v-for="item in vLine"
:key="item.position + item.origin"
class="ref-line v-line"
v-show="item.display"
:style="{ left: item.position, top: item.origin, height: item.lineLength }"
/>
<span
v-for="item in hLine"
:key="item.position + item.origin"
class="ref-line h-line"
v-show="item.display"
:style="{ top: item.position, left: item.origin, width: item.lineLength }"
/>
</div>
</template>
<script>
import VueDraggableResizable from 'vue-draggable-resizable-gorkys'
import 'vue-draggable-resizable-gorkys/style.css'
export default {
components: {
VueDraggableResizable
},
data () {
return {
vLine: [],
hLine: []
}
},
methods: {
getRefLineParams (params) {
const { vLine, hLine } = params
this.vLine = vLine
this.hLine = hLine
}
}
}
</script>
当前开发环境要求 Node.js
>= 20。
npm install
# lint
npm run lint
# unit / feature tests
npm test
# library build
npm run build
# storybook dev
npm run storybook
# storybook static build
npm run build-storybook
Basic、Advanced、How To 分类The MIT License (MIT). Please see License File for more information.
Overall
Maintained
Code review
Latest release
Releases this year
Vue 用于可调整大小和可拖动元素的组件并支持冲突检测、元素吸附、元素对齐、辅助线
See the code当前主线已升级到 Vue 3.5+,并同步迁移到 Vite 5、Vitest 2、Storybook 8。
parent 现支持 Boolean | String,可直接传 CSS selectorw / h 支持 autox / y / w / h 属性设置无效问题activated 导致 transform 属性丢失问题minWidth / minHeight 动态改变activeOnTopselectOnContextMenurotateparent 传入 CSS 选择器Q 交流群:138146781
本组件基于 vue-draggable-resizable 进行二次开发。
之前这个 fork 主要维护冲突检测、吸附对齐、辅助线等增强能力。现在默认主线已经切换到 Vue 3,后续 README、示例和构建方式也都以 Vue 3 为准。
官方英文示例 | 本仓库 GitHub Pages 示例 | 自定义域名
说明:本仓库新增功能的演示主要在 Storybook 的
Advanced分类里查看。

npm install vue-draggable-resizable-gorkys
import { createApp } from 'vue'
import App from './App.vue'
import VueDraggableResizable from 'vue-draggable-resizable-gorkys'
import 'vue-draggable-resizable-gorkys/style.css'
const app = createApp(App)
app.component('vdr', VueDraggableResizable)
app.mount('#app')
<template>
<div style="height: 500px; width: 500px; border: 1px solid red; position: relative;">
<vdr :w="100" :h="100" @dragging="onDrag" @resizing="onResize" :parent="true">
<p>
Hello! I'm a flexible component. You can drag me around and you can resize me.<br>
X: {{ x }} / Y: {{ y }} - Width: {{ width }} / Height: {{ height }}
</p>
</vdr>
<vdr
:w="200"
:h="200"
:parent="true"
:min-width="200"
:min-height="200"
:is-conflict-check="true"
:snap="true"
:snap-tolerance="20"
/>
</div>
</template>
<script>
import vdr from 'vue-draggable-resizable-gorkys'
import 'vue-draggable-resizable-gorkys/style.css'
export default {
components: { vdr },
data () {
return {
width: 0,
height: 0,
x: 0,
y: 0
}
},
methods: {
onResize (x, y, width, height) {
this.x = x
this.y = y
this.width = width
this.height = height
},
onDrag (x, y) {
this.x = x
this.y = y
}
}
}
</script>
README.md 默认文档已切换到 Vue 3 版本说明dist/VueDraggableResizable.css 改为 style.csslint、test、build、storybook、build-storybookhandleInfo类型: Object
必需: false
默认:
{
size: 8,
offset: -5,
switch: true
}
当使用 transform: scale() 进行缩放操作时:
switch 控制 handle 是否保持视觉尺寸不变size 为 handle 大小offset 为 handle 位置偏移<vue-draggable-resizable :handle-info="{ size: 14, offset: -5, switch: true }" />
scaleRatio类型: Number
必需: false
默认: 1
用于修复在 transform: scale() 场景下,鼠标位置与拖拽/缩放位置偏移的问题。
<vue-draggable-resizable :scale-ratio="0.6" />
isConflictCheck类型: Boolean
必需: false
默认: false
定义组件是否开启冲突检测。
<vue-draggable-resizable :is-conflict-check="true" />
snap类型: Boolean
必需: false
默认: false
定义组件是否开启元素对齐/吸附。
<vue-draggable-resizable :snap="true" />
snapTolerance类型: Number
必需: false
默认: 5
当启用 snap 时,定义组件与元素之间的对齐距离,单位为像素。
<vue-draggable-resizable :snap="true" :snap-tolerance="20" />
parent类型: Boolean | String
必需: false
默认: false
用于限制组件拖拽/缩放边界:
true 时,限制在直接父元素内<vue-draggable-resizable :parent="true" />
<vue-draggable-resizable parent=".canvas-container" />
w / h类型: Number | String
必需: false
除数字外,也支持传入 auto,组件会按照内容尺寸初始化,后续手动缩放后再转为具体数值。
<vue-draggable-resizable w="auto" h="auto" />
activeOnTop类型: Boolean
必需: false
默认: false
定义组件激活时是否自动提升到最前面。
<vue-draggable-resizable :active-on-top="true" />
selectOnContextMenu类型: Boolean
必需: false
默认: false
定义组件是否支持右键选中。
<vue-draggable-resizable :select-on-context-menu="true" />
rotate类型: Number
必需: false
默认: 0
定义组件旋转角度,单位为度。
<vue-draggable-resizable :rotate="45" />
refLineParams参数: params
返回值为一个对象,包含 vLine 和 hLine,可用于自行渲染辅助线。
<template>
<div>
<vue-draggable-resizable :snap="true" :snap-tolerance="20" @refLineParams="getRefLineParams" />
<vue-draggable-resizable :snap="true" :snap-tolerance="20" @refLineParams="getRefLineParams" />
<span
v-for="item in vLine"
:key="item.position + item.origin"
class="ref-line v-line"
v-show="item.display"
:style="{ left: item.position, top: item.origin, height: item.lineLength }"
/>
<span
v-for="item in hLine"
:key="item.position + item.origin"
class="ref-line h-line"
v-show="item.display"
:style="{ top: item.position, left: item.origin, width: item.lineLength }"
/>
</div>
</template>
<script>
import VueDraggableResizable from 'vue-draggable-resizable-gorkys'
import 'vue-draggable-resizable-gorkys/style.css'
export default {
components: {
VueDraggableResizable
},
data () {
return {
vLine: [],
hLine: []
}
},
methods: {
getRefLineParams (params) {
const { vLine, hLine } = params
this.vLine = vLine
this.hLine = hLine
}
}
}
</script>
当前开发环境要求 Node.js
>= 20。
npm install
# lint
npm run lint
# unit / feature tests
npm test
# library build
npm run build
# storybook dev
npm run storybook
# storybook static build
npm run build-storybook
Basic、Advanced、How To 分类The MIT License (MIT). Please see License File for more information.
Overall
Maintained
Code review
Latest release
Releases this year