AvueAvue
首页
  • 开发指南
  • Skill开发
  • 在线测试工具
  • Form组件
  • Crud组件
  • Default组件
  • Data组件
  • Component组件
产品
工作台
授权
联系
2.x文档
个人支付接口
首页
  • 开发指南
  • Skill开发
  • 在线测试工具
  • Form组件
  • Crud组件
  • Default组件
  • Data组件
  • Component组件
产品
工作台
授权
联系
2.x文档
个人支付接口
  • Article 文章
  • Group 分组容器
  • Title 标题文本
  • CountUp 数字动画
  • Comment 评论
  • Chat 客服聊天
  • Captcha 验证码
  • Contextmenu 右键菜单
  • Clipboard 复制文本
  • DialogForm 弹窗表单
  • Draggable 拖拽
  • Export Excel 导入与导出
  • Flow 流程
  • FilterBuilder 高级筛选
  • FileManager 文件管理
  • QRCode 二维码
  • Iframe 嵌入页面
  • ImagePreview 图片预览
  • Login 登录组件
  • License 授权书
  • Print 打印
  • Screenshot 页面截图
  • Search 标签搜索
  • Sign 电子签名
  • TextEllipsis 超出文本省略
  • Tabs 选项卡
  • Tree 树型
  • Video 摄像头
  • Calendar 日历组合示例

Draggable 拖拽

avue-draggable 以绝对定位包装内容,支持移动、缩放、范围限制和键盘微调。父容器需要 position: relative 和明确尺寸。

效果预览可直接操作下方示例

拖动蓝色卡片,选中后拖动边缘调整大小;方向键微调,Shift + 方向键移动 10 倍步长,Escape 取消选中。

正在加载示例…
<template>
  <div ref="canvas" class="draggable-demo" @pointerdown.self="draggable?.setActive(false)">
    <avue-draggable ref="draggable" index="card" :width="160" :height="100"
                    :left="24" :top="40" :step="5" :grid="5"
                    :bounds="{ left: 0, top: 0, width: canvasWidth, height: 260 }"
                    @change="state = $event">
      <div class="draggable-demo__card">拖动卡片或边缘控制点</div>
    </avue-draggable>
  </div>
  <el-alert :title="state ? `位置 (${state.left}, ${state.top}),尺寸 ${state.width} × ${state.height}` : '点击卡片后可使用方向键微调'"
            type="info" :closable="false" />
</template>

<script setup>
import { onBeforeUnmount, onMounted, ref } from 'vue'
const canvas = ref(null)
const draggable = ref(null)
const canvasWidth = ref(280)
const state = ref(null)
let observer
onMounted(() => {
  const measure = () => { canvasWidth.value = canvas.value?.clientWidth || 280 }
  measure()
  observer = new ResizeObserver(measure)
  observer.observe(canvas.value)
})
onBeforeUnmount(() => observer?.disconnect())
</script>

<style scoped>
.draggable-demo { position: relative; height: 260px; margin-bottom: 16px; border: 1px solid var(--el-border-color); border-radius: 8px; }
.draggable-demo__card { display: grid; place-items: center; padding: 12px; box-sizing: border-box; color: #fff; background: var(--el-color-primary); border-radius: 6px; text-align: center; user-select: none; }
</style>

Props

参数说明类型默认值
index业务标识,在事件载荷中返回string / number—
left / top相对父容器的横向 / 纵向坐标number / 数字字符串0
width / height宽高,不传时读取第一个内容元素的尺寸number / 数字字符串—
zIndex常规图层,选中时内部提升到 9999number / string1
disabled / readonly / lock禁用 / 只读 / 锁定;都阻止移动与缩放booleanfalse
resize是否启用缩放控制点与同步子元素尺寸booleantrue
mask使用遮罩捕获拖动;需要直接操作内容控件时可关闭booleantrue
scale父画布缩放倍率,用于换算指针位移number1
step指针位移倍率,同时是键盘移动步长number1
grid网格吸附间距,0 不吸附number0
minWidth / minHeight最小尺寸number20
maxWidth / maxHeight最大尺寸number—
bounds允许移动的边界,支持 { left, top, right, bottom } 或 { left, top, width, height }object—
handle允许开始拖动的 CSS 选择器string—
ignore无 handle 时跳过的 CSS 选择器string输入框、按钮、链接及 [data-avue-draggable-ignore]

坐标和尺寸通过 Number() 转换,推荐传数字,不要传 '100px'。组件不自动向父级回写位置;需要保存时监听 change 的实际状态。

Events

state 为 { index, left, top, width, height },其中坐标是当前绝对位置。

事件参数说明
move{ index, left, top }位移量;指针拖动为相对本次按下位置的变化,键盘为本次变化
resize{ ...state, deltaX, deltaY }缩放后的状态与指针位移
change{ type: 'move' 或 'resize', ...state }适合持久化的当前状态
focus{ type, ...state }开始拖动或缩放
blurstate指针释放或取消
over / outstate指针进入 / 离开

这里的 focus / blur 是拖动生命周期事件,不等同于原生 DOM 聚焦和失焦事件。

Methods 与 Slots

方法说明
setActive(boolean)设置选中状态,选中时聚焦根元素
setOverActive(boolean)设置悬浮状态
setLeft(left) / setTop(top)修改坐标并按边界约束
setSize(width, height)设置尺寸并应用最小、最大与边界约束
getState()返回当前状态对象

default 放置内容,menu 自定义悬浮操作区,参数为 { index, zIndex }。通过实例方法更新状态不会自动等同于用户拖动事件。

最后更新:
贡献者: smallwei
Prev
DialogForm 弹窗表单
Next
Export Excel 导入与导出