一个全新的Vue拖拽特性实现:“调整尺寸”部分
关于拖拽
CabloyJS提供了完备的拖拽特性,可以实现移动和调整尺寸两大类功能,这里对调整尺寸的开发进行阐述
关于
移动的开发,请参见:拖拽:移动
演示

开发步骤
下面以模块test-party为例,说明拖拽(调整尺寸)的开发步骤
完整源码请参见文件src/module/test-party/front/src/kitchen-sink/pages/dragdrop/dragdropResize.vue,这里只说明开发要点
1. v-eb-dragdrop
通过directive v-eb-dragdrop向需要实现调整尺寸的DOM元素附加拖拽特性
更多情况下,我们并不是拖拽DOM元素本身,而是拖拽与DOM元素相对应的手柄元素
<div class="test-dragdrop-resize-element" :style="{width:width+'px',height:height+'px'}">
<span class="resize-handler-col" v-eb-dragdrop="getDragdropContext('col')"></span>
<span class="resize-handler-row" v-eb-dragdrop="getDragdropContext('row')"></span>
</div>
getDragdropContext(resizeDirection) {
return {
scene: this.dragdropScene,
resizable: true,
resizeDirection,
onDragStart: this.onDragStart,
onDragMove: this.onDragMove,
onDragEnd: this.onDragEnd,
};
},
我们向v-eb-dragdrop传入一个拖拽Context对象,具体参数如下:
| 名称 | 说明 |
|---|---|
| scene | 应用场景,用于隔离不同的拖拽元素组,通常我们使用便捷方法Vue.prototype.$meta.util.nextId('dragdrop')创建一个唯一值 |
| resizable | 标明此拖拽是用于调整尺寸 |
| resizeDirection | 拖拽方向,col/row |
| onDragStart | 当启动拖拽时激发 |
| onDragMove | 当拖动时激发 |
| onDragEnd | 当拖拽行为结束时激发 |
拖拽事件
1. onDragStart
当启动拖拽时激发。我们可以通过此事件返回一个tooltip信息,进行友好的提示
onDragStart({ $el, context }) {
const isRow = context.resizeDirection === 'row';
const size = this.$view.sizeExtent;
const tooltip = isRow ? this.height : this.width;
return { size, tooltip };
},
- 参数
| 名称 | 说明 |
|---|---|
| $el | 拖拽手柄元素 |
| context | 拖拽Context对象 |
- 返回值
| 名称 | 说明 |
|---|---|
| size | 当前拖拽元素所属容器的尺寸,当拖动时便于准确计算偏移量的百分比。如果不关心移动的百分比信息,size可以返回null |
| tooltip | 拖拽元素的提示信息 |
2. onDragMove
当拖动时激发
onDragMove({ $el, context, diff }) {
const isRow = context.resizeDirection === 'row';
if (!isRow) {
let diffAbs = parseInt(diff.abs.x);
if (diffAbs === 0) return;
this.width += diffAbs;
const tooltip = this.width;
return { eaten: true, tooltip };
} else {
let diffAbs = parseInt(diff.abs.y);
if (diffAbs === 0) return;
this.height += diffAbs;
const tooltip = this.height;
return { eaten: true, tooltip };
}
},
- 参数
| 名称 | 说明 |
|---|---|
| $el | 拖拽手柄元素 |
| context | 拖拽Context对象 |
| diff | 拖动时的偏移量 |
| diff.abs | 偏移量的绝对值表示 |
| diff.percent | 偏移量的百分比表示 |
关于
diff.percent:
- 在Grid布局中,往往通过百分比来布局DOM元素。如果给这些DOM元素启用拖放特性来调整尺寸,那么调整的尺寸也将是百分比。可以参考
仪表盘中部件的拖放实现- 如果要得到准确的
diff.percent信息,必须在事件onDragStart中返回Grid布局容器的size信息
- 返回值
| 名称 | 说明 |
|---|---|
| eaten | 如果当前传入的diff偏移量有效,就设置eaten:true,从而重新计算新的diff偏移量 |
| tooltip | 拖拽元素的提示信息 |
关于
eaten:
- 在Grid布局中,往往通过百分比来布局DOM元素。而这些百分比不是连续值。因此,需要拖动一定的像素才认为是一个有效的百分比变更。这时,我们就需要返回
eaten:false,告知系统当前的偏移量需要累积,直到一个认可的偏移量出现,然后再返回eaten:true
3. onDragEnd
当拖拽行为结束时激发。如果需要执行清理工作,可以响应此事件
onDragEnd({ $el, context }) {
// do nothing
},
- 参数
| 名称 | 说明 |
|---|---|
| $el | 拖拽手柄元素 |
| context | 拖拽Context对象 |
一个全新的Vue拖拽特性实现:“调整尺寸”部分的更多相关文章
- 一个全新的Vue拖拽特性实现:“移动”部分
关于拖拽 CabloyJS提供了完备的拖拽特性,可以实现移动和调整尺寸两大类功能,这里对移动的开发进行阐述 关于调整尺寸的开发,请参见:拖拽:调整尺寸 演示 开发步骤 下面以模块test-party为 ...
- Vue拖拽组件
vue开发公众号项目,***产品需要添加一个新的功能.拖拽功能.一听简单.百度上轮子挺多,直接拉一个过来用着就行.然鹅...兴奋之余,却失望至极.东西很多,没有一个能使得.你让我失望,那我就让你绝望. ...
- vue拖拽组件开发
vue拖拽组件开发 创建临时vue项目 先查看node和npm版本,怎么安装就不多多bb了 再安装vue-cli npm install vue-cli -g //全局安装 vue-cli 检测是否安 ...
- 每天一个JavaScript实例-html5拖拽
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- jQuery 学习笔记3 点击弹出一个div并允许拖拽移动
这里我看了下http://qings.blog.51cto.com/4857138/998878/ 的文章,感谢他的分享. 首先我们有一个a标签和一个div,div默认是不显示的,当用户点击时改为显示 ...
- 使用TypeScript给Vue 3.0写一个指令实现组件拖拽
最近在用vue3重构后台的一个功能.一个弹窗组件,弹出一个表单.然后点击提交. 早上运维突然跑过来问我,为啥弹窗挡住了下边的表格的数据,我添加的时候,都没法对照表格来看了.你必须给我解决一下. 我参考 ...
- vue2-dragula vue拖拽组件
https://github.com/kristianmandrup/vue2-dragula git 地址 https://github.com/kristianmandrup/vue2-dragu ...
- Vue.Draggable:基于 Sortable.js 的 Vue 拖拽组件使用中遇到的问题
Sortable.js 介绍 https://segmentfault.com/a/1190000008209715 项目中遇到的问题: A - 我需要在项目的拖拽组件中,使用背景 1 - 想到的第一 ...
- Vue 拖拽组件 vuedraggable 和 vue-dragging
一.描述 之前用 vue 写过一个在线的多二维码生成服务,体验地址:https://postbird.gitee.io/vue-online-qrcode/ 后面发现二维码多了之后有时候想要排序,需要 ...
随机推荐
- Mybatis映射文件动态SQL语句-01
因为在很多业务逻辑复杂的项目中,往往不是简单的sql语句就能查询出来自己想要的数据,所有mybatis引入了动态sql语句, UserMapper.xml <?xml version=" ...
- redis 指定db库导入导出数据
最近根据之前的项目重新改编一个新的项目,发现上一个项目的搭建者,把一些区域权限和划分放在redis上存储,因此不得不照搬过来,所以搜索一下相关如何做的 发现一个比较简单的做法,记录一下操作过程,方便以 ...
- 『忘了再学』Shell基础 — 9、Bash中的特殊符号(一)
目录 1.双单引号 2.双引号 3.$符号 4.反引号 5.$()符号 6.#符号 7.\符号 1.双单引号 '':单引号.在单引号中所有的特殊符号,如$和"`"(反引号)都没有特 ...
- Spring-Mybatis使用到的依赖及配置
日志(log4j) log4j.rootLogger=DEBUG,console,file log4j.appender.console = org.apache.log4j.ConsoleAppen ...
- what 的页面制作
1. html结构 <!-- section: what we do --> <section id="what" class="bg-light py ...
- VMware虚拟机无法安装Win11解决方法 (暂时全网最全方案)
目录 1.现象 1.蓝屏重启 2.如下图示,无法启动 2.解决方案 2.1 Hyper-V方案 2.2 禁用 Device Guard(系统:win11) 2.3 升级虚拟机VMware pro的版本 ...
- javascript中的宏任务和微任务(二)
js事件轮询执行顺序总结: 1)所有的同步任务都在主线程上执行,行成一个执行栈. 2)除了主线程之外,还存在一个任务列队,只要异步任务有了运行结果,就在任务列队中植入一个时间标记. 3)主线程完成所有 ...
- 一个实战让你搞懂Dockerfile
摘要 在认识Dockerfile的基础功能之后,即一个用基础镜像来构建新镜像的文本文件,就需要在实际工作中使用其灵活便利的操作来提升我们的工作效率了,这里演示在Tomcat里运行一个程序的过程,以此来 ...
- 【CSAPP】Shell Lab 实验笔记
shlab这节是要求写个支持任务(job)功能的简易shell,主要考察了linux信号机制的相关内容.难度上如果熟读了<CSAPP>的"异常控制流"一章,应该是可以不 ...
- 题解0011:图书管理(哈希、vector)
信奥一本通--哈希 里的例题2 题目链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1456 题目描述:两个命令,一个是进一本名字为s的图书,一个是 ...