当前位置: 首页 > news >正文

vben中通过自定义指令 实现边界拖拽

注意: 当前写法是在vben中实现 若使用其他前端模板 只需要更改第二步 注册方式即可
问题描述:项目中经常遇到某些上下结构或者左右结构的排版 其中某些元素需要边界拖拽以实现其他元素的展示
常见场景:业务上需要是左树右列表的页面 树节点title过长时无法全部展示 通过边界拖拽 可以更友好的展示树节点的信息

第一步 创建边界拖拽自定义指令文件

文件地址:src\directives\dragResize.ts

importtype{Directive,App}from'vue';constdragResizeDirective:Directive={mounted(el:HTMLElement,binding){constsideArr=['right','left','top','bottom'];constminSize=binding.value?.minSize||100;constmaxSize=binding.value?.maxSize||1000;constdragSize=5;constoriCur=el.style.cursor;// 解析需要拖拽的边constsides=binding.value?.replace(/\s/g,'').split(',')||['right'];constdragable:Record<string,boolean>={};for(constsideofsides){if(!sideArr.includes(side)){thrownewError('resizable needs string value of: '+sideArr);}dragable[side]=true;}letdragSide='';letdragging=false;// 辅助函数:获取鼠标相对于 el 的坐标constgetMousePos=(e:MouseEvent)=>{constrect=el.getBoundingClientRect();return{x:e.clientX-rect.left,y:e.clientY-rect.top,width:rect.width,height:rect.height,};};el.addEventListener('mousemove',(e:MouseEvent)=>{if(dragging)return;const{x,y,width,height}=getMousePos(e);if(dragable.right&&width-x<dragSize){el.style.cursor='col-resize';dragSide='right';}elseif(dragable.left&&x<dragSize){el.style.cursor='col-resize';dragSide='left';}elseif(dragable.top&&y<dragSize){el.style.cursor='row-resize';dragSide='top';}elseif(dragable.bottom&&height-y<dragSize){el.style.cursor='row-resize';dragSide='bottom';}else{el.style.cursor=oriCur;dragSide='';}});el.addEventListener('mousedown',(e:MouseEvent)=>{if(!dragSide)return;dragging=true;const{width,height}=getMousePos(e);constelW=width;constelH=height;constclientX=e.clientX;constclientY=e.clientY;constmovefun=(e:MouseEvent)=>{e.preventDefault();if(dragSide==='right'&&(e.clientX>clientX||el.offsetWidth>=minSize)){constnewWidth=elW+(e.clientX-clientX);el.style.width=Math.min(newWidth,maxSize)+'px';}elseif(dragSide==='left'&&(e.clientX<clientX||el.offsetWidth>=minSize)){constnewWidth=elW+(clientX-e.clientX);el.style.width=Math.min(newWidth,maxSize)+'px';}elseif(dragSide==='top'&&(e.clientY<clientY||el.offsetHeight>=minSize)){constnewHeight=elH+(clientY-e.clientY);el.style.height=Math.min(newHeight,maxSize)+'px';}elseif(dragSide==='bottom'&&(e.clientY>clientY||el.offsetHeight>=minSize)){constnewHeight=elH+(e.clientY-clientY);el.style.height=Math.min(newHeight,maxSize)+'px';}};constremovefun=()=>{dragging=false;document.removeEventListener('mousemove',movefun);document.removeEventListener('mouseup',removefun);};document.addEventListener('mousemove',movefun);document.addEventListener('mouseup',removefun);});},};exportfunctionsetupDragResizeDirective(app:App){app.directive('drag-resize',dragResizeDirective);}exportdefaultdragResizeDirective;

第二步 在统一自定义指令注册ts中注册边界拖拽指令

文件地址:src\directives\index.ts


或:参考 vue官网自定义指令 注册全局自定义指令

第三步 使用

在需要使用边界指令的元素上添加 v-drag-resize

<divstyle="display: flex"><div v-drag-resize></div><divstyle="flex: 1">列表</div></div>

注意:

  1. 将其父元素设置成弹性盒模型
  2. 给其兄弟元素设置属性flex: 1
http://www.rkmt.cn/news/1398929.html

相关文章:

  • 终极围棋AI训练指南:3步快速提升棋力的免费解决方案 [特殊字符]
  • RankMixer:抖音工业级推荐系统的异构特征交互与并行化架构
  • Mengzi3模型架构详解:万亿tokens训练如何塑造卓越中文理解能力
  • 无曝气PTFE-MBR+RO回用技术哪家好?2026优质合作厂商推荐 - 栗子测评
  • 告别SDIO和USB!在i.MX8平台上为你的IoT设备选型与部署PCIe WIFI模块(以88W8997为例)
  • 别再只会用php://filter了!深入理解PHP文件包含的三种利用姿势:伪协议、远程包含与日志注入
  • everfu/hexo-theme-solitude主题本地搜索功能:基于hexo-generator-search的配置
  • 分布式系统一致性与事务处理实战
  • 别再为SSL证书续期发愁了!1Panel + Cloudflare API Token 实现全自动托管(保姆级配置)
  • 别再手动摆路网了!用Houdini 18.5 + UE4程序化道路生成,效率提升10倍(附HDA资产)
  • 保姆级教程:手把手教你将TI官方元器件库导入Altium Designer 24
  • 从零组装一台CNC小机床:手把手教你用树莓派4B+DM542+步进电机搭建核心控制系统
  • 用FPGA和帧差算法DIY一个智能监控系统:从OV5640摄像头到HDMI显示的完整流程(含11套源码)
  • DrBERT-7GB核心功能深度解析:医学文本掩码填充与序列分类实战
  • 2026负压风机厂家推荐:车间通风降温实力派,靠谱厂商一键选 - 栗子测评
  • UCF101数据集预处理避坑指南:视频转pkl文件加速读取的完整流程与代码解析
  • 主题移植实战:如何将现有Hexo博客无缝迁移至hexo-theme-solitude
  • 知识图谱与SHACL在机器人任务规划中的应用
  • C166微控制器位寻址原理与汇编实践
  • 10分钟实战指南:如何用LivePortrait让静态人像活起来
  • Harrier-OSS-v1-0.6B的对比学习训练策略:提升多语言嵌入质量的关键
  • FactoryBluePrints:戴森球计划玩家的终极蓝图宝库,轻松建造宇宙工业帝国
  • Qwen3.5-122B-A10B未来路线图:多节点部署与PD分离技术前瞻
  • 当apt找不到内核时怎么办?手把手教你在Debian 9/10/11上手动下载并安装指定版本内核
  • 别再只调参了!手把手教你为TensorRT INT8量化准备校准数据集(附代码)
  • 别再死磕梯度下降了!用Python手把手教你实现粒子群优化算法(PSO)解决函数优化问题
  • 用Python搞定FEMTO-ST轴承数据集:从下载到特征提取的保姆级教程
  • Qwen2.5-0.5B-Instruct模型下载与配置:从HuggingFace到本地部署完整教程
  • 从手势识别到UI交互:用LeapMotion在Unity里打造你的隔空操作Demo
  • 2026年4月食品级真空袋直销厂家推荐,玉米真空袋/蒸煮袋/粽子袋/真空袋/食品级真空袋,食品级真空袋厂家有哪些 - 品牌推荐师