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

可拖拽指令

该文章用于封装一个指令用于对一个元素(div)进行不同方向的拖拽

dragX.js
代码如下:

export default (el, binding) => {//  默认参数let defaultOpts = {dragDirection: 'n, e, s, w, ne, se, sw, nw, all',dragContainerId: '', //dragBarClass: '', // 类选择器resizeEdge: 10,dirctDom: true,canDrag:true,canResize:true,};let isMove = false;binding.value = binding.value || {};let cfg = Object.assign({}, defaultOpts, binding.value);// 获取目标元素 resize方向function getDirection(e) {let elTar = e.currentTarget;let dir = '';let rect = elTar.getBoundingClientRect();let win = elTar.ownerDocument.defaultView;let offset = {top: rect.top + win.pageYOffset,left: rect.left + win.pageXOffset,right: rect.right + win.pageXOffset,bottom: rect.bottom + win.pageYOffset}if (e.pageY > offset.top && e.pageY < offset.top + cfg.resizeEdge) {dir += 'n';} else if (e.pageY < offset.bottom && e.pageY > offset.bottom - cfg.resizeEdge) {dir += 's';}if (e.pageX > offset.left && e.pageX < offset.left + cfg.resizeEdge) {dir += 'w';} else if (e.pageX < offset.right && e.pageX > offset.right - cfg.resizeEdge) {dir += 'e';}if (binding.value) {let directions = cfg.dragDirection.split(',');for (let direction of directions) {let handle = direction.replace(/(^\s*)|(\s*$)/g, '');if (handle === 'all' || handle === dir) {return dir;}}}return '';}//  设置约束范围function setConstraint(data) {if (cfg.dragContainerId) {let constraintDom = document.querySelector("#" + cfg.dragContainerId);let constraintRect = constraintDom.getBoundingClientRect();if (data.left <= 0) data.left = 0;if (data.top <= 0) data.top = 0;if (data.top + data.height+data.borderTop+data.borderBottom >= constraintRect.height) data.top = constraintRect.height - data.height-data.borderTop-data.borderBottom;if (data.left + data.width+data.borderLeft+data.borderRight > constraintRect.width) data.left = constraintRect.width - data.width-data.borderLeft-data.borderRight;}}el.onmousemove = function (e) {if (cfg.dragBarClass.length > 0 && e.target.classList.contains(cfg.dragBarClass)&&cfg.canDrag) {el.style.cursor = 'move';return;}let dir = getDirection(e);if (dir !== '') {el.style.cursor = dir + '-resize'; return;}el.style.cursor = '';}el.onmouseleave = function () {el.style.cursor = '';}el.onmousedown = function (e) {isMove = false;if (cfg.dragBarClass.length > 0 && e.target.classList.contains(cfg.dragBarClass)) {isMove = true;document.body.style.cursor = 'move';}const style = window.getComputedStyle(el);const getStyleNumValue = key => parseInt(style.getPropertyValue(key), 10);const rect = el.getBoundingClientRect();const data = {width: getStyleNumValue("width"),height: getStyleNumValue("height"),left: getStyleNumValue("left"),top: getStyleNumValue("top"),borderLeft: getStyleNumValue("border-left-width"),borderTop: getStyleNumValue("border-top-width"),borderRight: getStyleNumValue("border-right-width"),borderBottom: getStyleNumValue("border-bottom-width"),deltX: e.pageX - rect.left,deltY: e.pageY - rect.top,startX: rect.left,startY: rect.top};const dir = getDirection(e);if (dir === '' && !isMove) return;// 创建遮罩const mask = document.createElement("div");mask.style.cssText = "position:absolute;top:0;bottom:0;left:0;right:0;";document.body.appendChild(mask);document.onmousemove = function (edom) {// === 方向调整映射 ===const resizeActions = {e() {data.width = edom.pageX - data.startX + data.borderLeft + data.borderRight;},s() {data.height = edom.pageY - data.startY + data.borderBottom + data.borderTop;},n() {const deltheight = data.startY + data.borderBottom + data.borderTop - edom.pageY;data.height += deltheight;data.top -= deltheight;data.startY -= deltheight;},w() {const deltwidth = data.startX + data.borderLeft + data.borderRight - edom.pageX;data.width += deltwidth;data.left -= deltwidth;data.startX -= deltwidth;}};// 遍历执行对应方向Object.keys(resizeActions).forEach(key => {if (dir.includes(key)) {resizeActions[key]();}});// === 拖拽处理 ===if (isMove && cfg.canDrag) {const deltX = edom.pageX - data.startX - data.deltX;const deltY = edom.pageY - data.startY - data.deltY;const newLeft = (parseInt(getStyleNumValue("left") || '0', 10)) + deltX;const newTop = (parseInt(getStyleNumValue("top") || '0', 10)) + deltY;data.left = newLeft;data.top = newTop;data.startX += deltX;data.startY += deltY;setConstraint(data);}// === DOM 更新 ===unpdateDom(el, cfg, data)// 自定义事件通知el.dispatchEvent(new CustomEvent('bindUpdate', { detail: data }));};document.onmouseup = function () {document.body.style.cursor = '';document.onmousemove = null;document.onmouseup = null;isMove = false;if (mask.parentNode) {document.body.removeChild(mask);}};document.body.style.cursor = dir + '-resize';};
}
function unpdateDom(el, cfg, data) {if (cfg.dirctDom) {Object.assign(el.style, {width: cfg.canResize ? data.width + "px" : el.style.width,height: cfg.canResize ? data.height + "px" : el.style.height,left: cfg.canDrag ? data.left + "px" : el.style.left,top: cfg.canDrag ? data.top + "px" : el.style.top});
}
}

父组件使用的时候

在这里插入图片描述

    <material-tree class="left" ref="materialTree" v-dragx="dragColumn" @bindUpdate="dragColumnUpdate":treeData="treeData" :menuList="menuList" @nodeClick="handleNodeClick" @operate="handleOperate"></material-tree>

在这里插入图片描述

   dragColumnUpdate() {this.$refs.materialTree.style.height = '100%';},
http://www.dtcms.com/a/355080.html

相关文章:

  • Xray与XPOC工具对比分析
  • 让企业资产管理高效透明——深度解析固定资产管理系统的功能、优势与价值
  • HBase Compaction HFile 可见性和并发安全性分析
  • Docker-compose离线安装
  • 【Canvas与盾牌】“靡不有初,鲜克有终”黄竖条盾牌
  • [ICCV25]TRACE:用3D高斯直接学习物理参数,让AI“推演”未来场景
  • 微硕WINSOK高性能MOS管WSF80P04,助力充电宝效能与安全升级
  • 在IAR Embedded Workbench for Arm中实现Infineon TRAVEO™ T2G安全调试
  • 舆情监测系统有哪些功能
  • 省市区三级联动选择器-组件
  • C++ 方向 Web 自动化测试实战博客系统思路
  • mac系统本地部署Dify步骤梳理
  • 资产与设备管理数字化转型实践:企业降本增效的新引擎
  • 图书管理系统练习项目源码-前后端分离-【Java版】
  • Linux /proc/pid 探索
  • 【全开源】云贝餐饮V3独立版系统 v1.8.7+API接口开发文档+搭建教程
  • 从 Dockerfile 到 Kubernetes:现代化 PHP 应用配置管理进阶指南
  • 打造旅游实训新场景:旅游管理虚拟仿真实训室的运营与教学落地
  • 旅游管理新阵地:虚拟仿真实训室的功能设计与教学应用
  • Python 实现冒泡排序:从原理到代码
  • java去图片水印的方法
  • Redis 连接数爆炸:连接池配置错误踩坑记录
  • Runway Gen-2 深度技术解析:AI视频生成的范式变革
  • Bscan Bonding Chain
  • 使用llamafactory对模型进行微调
  • 软考-系统架构设计师 决策支持系统(DSS)详细讲解
  • 滤波算法作用
  • Redis高性能数据库讲解与实战指南
  • 文件系统挂载详细分析(《图解Linux内核》虚拟文件系统篇笔记三)
  • [机械结构设计-48]:机械工程师的岗位要求