当前位置: 首页 > 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.jsqmd.com/news/894390/

相关文章:

  • 2026中水回用零排放设备企业精选:印染废水中水回用设备厂家盘点 - 栗子测评
  • 用STM32F407的SDIO给TF卡做个“体检”:读写速度测试与文件系统底层探索(FatFS预备篇)
  • AIFS Single v2.0 vs v1.1:6大核心升级让AI天气预报准确率提升30%
  • Atom-7B-Chat-openmind硬件兼容性指南:从NPU到消费级显卡的完整部署方案
  • 别再只跑官方Demo了!用Nerfstudio处理你自己的照片/视频,从数据准备到3D模型导出一站式指南
  • macOS窗口管理终极指南:AutoRaise提升多任务效率50%的完整教程
  • 如何永久保存你的微信聊天记录?免费开源工具WeChatMsg完整指南
  • 告别SDIO和USB!在i.MX8平台上为你的IoT设备选型与部署PCIe WIFI模块(以88W8997为例)
  • 无曝气PTFE-MBR+RO回用技术哪家好?2026优质合作厂商推荐 - 栗子测评
  • 从手势识别到UI交互:用LeapMotion在Unity里打造你的隔空操作Demo
  • Unity URP/HDRP项目里,用ShaderGraph节点快速实现5个酷炫效果(附节点图)
  • 别再只会用php://filter了!深入理解PHP文件包含的三种利用姿势:伪协议、远程包含与日志注入
  • Git常用命令教程,非常细致,零基础也能听懂
  • 城市规划师必备:如何用ArcGIS插件高效评估区域风环境(迎风面密度保姆级教程)
  • 2026采购指南:饮用水PFAS去除设备厂家汇总推荐 - 栗子测评
  • Qwen2.5-0.5B-Instruct模型下载与配置:从HuggingFace到本地部署完整教程
  • FactoryBluePrints:戴森球计划玩家的终极蓝图宝库,轻松建造宇宙工业帝国
  • 2026年靠谱的大连企业空气能供暖/空气能/大连空气能取暖销售设备供应商 - 品牌宣传支持者
  • 嵌入式工程师避坑指南:OV5640摄像头寄存器配置,这5个关键点新手最容易出错
  • 2026年4月有实力的吸塑托盘定制厂家怎么选择,胶盒吸塑/电子吸塑包装/五金吸塑包装/吸塑包装,吸塑托盘厂商哪家靠谱 - 品牌推荐师
  • 用Python和Keras从零搭建CNN:我的胃病影像识别课程设计复盘(附完整代码与数据集)
  • Lovable表单生成工具私密配置手册:解锁隐藏API、自定义渲染器注入、服务端Schema动态编译、离线PWA表单缓存策略(仅限内部技术委员会成员参考)
  • SDLPAL跨平台终极指南:在10大平台重温经典仙剑奇侠传
  • 如何优化TinyLlama-1.1B-Chat-v0.4性能:10个实用技巧提升对话质量
  • Unity UGUI事件系统保姆级拆解:从EventSystem到OnClick,你的按钮点击到底经历了什么?
  • 2026工业大风扇厂家推荐:工业吊扇生产厂家+大吊扇厂家推荐名录 - 栗子测评
  • 别再只调PID了!深入浅出聊聊IMU姿态解算中的‘互补滤波’思想
  • yolov11 安卓部署 2025最新
  • DrBERT-7GB核心功能深度解析:医学文本掩码填充与序列分类实战
  • 三步搞定iPhone抢购难题:Apple Store预约助手实战指南