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

Element的el-table实现拖拽改变某一行的高度

Element的el-table实现拖拽改变某一行的高度

刚看到这个需求的时候感觉也不难,就在官网看了一下文档,官方只支持横向拖拽改变某一列的宽度,并不支持纵向拖拽改变其高度。
于是就自己封装了一个指令

  • 在项目中创建一个js文件dragTable.js,将一下代码复制进去,然后在使用页面引入这个js文件,然后在el-table标签中直接使用
  • import dragTable from './dragTable.js'
  • v-drag-table
import Vue from 'vue';let resizeable = false
let mousedown = false
let newindex = null
let targetTd = null
Vue.directive('dragTable', {inserted: function(el,binding,vnode,prevVnode) {/* 获取头部td集合,这边是测试表格,只有一个所以直接el-table__body 的0,后续可以在<el-table> 加class,再用querySelector*/let tblObj = el.getElementsByClassName("el-table__body");//如果不用数组,最后遍历的时候不能有【】这个来选取元素let headerRows = [];for (const item of tblObj) {for (const itemElement of item.rows) {headerRows[itemElement] = itemElement.cells[0]}}// 去头部的位置let headerTds = el.getElementsByClassName("el-table__body")[0].rows[0];let screenYStart = 0;let tdHeight = 0;for (let i = 0; i < headerRows.length; i++) {//添加头部单元格事件addListener(headerRows[i], "mousedown", onmousedown);addListener(headerRows[i], "mousemove", onmousemove);}//鼠标点击触发事件document.onmousedown = function(event) {//如果不是tanle就不给他托if(!event.target._prevClass || (event.target._prevClass && event.target._prevClass.indexOf('table') === -1)){return}//获取当前行数下标let tr = event.target.parentElementlet td = event.target.parentElement.parentElement.childrenlet index = 0for (const item of td) {item.setAttribute('id',index++)}newindex = tr.getAttribute('id')if (resizeable) {let evt = event || window.event;mousedown = true;screenYStart = evt.screenY;tdHeight = targetTd.offsetHeight}};//鼠标拖拽触发事件document.onmousemove = function(event) {//如果不是table就不给他托if(!event.target._prevClass || (event.target._prevClass && event.target._prevClass.indexOf('table') === -1)){return}let evt = event || window.event;let srcObj = getTarget(evt);//rowIndex是未定义!!!cellIndex是好用的。我应该获取的是tr的rowindex//获取偏移 这里是鼠标的偏移let offsetY = evt.offsetY;if (mousedown) {let newHeight = tdHeight + (evt.screenY - screenYStart) + "px"; //计算后的新的宽度,原始td+偏移for (const item of tblObj) {let trlist = item.getElementsByTagName('tbody')[0].childrenlet trIndex = parseInt(newindex)trlist[trIndex < 0 ? 0 : trIndex].style.height = newHeight}} else {//修改光标样式,ele原来头部的不能影响,于是有一些offset位置的判断,如有更好的方式请留言srcObj.style.cursor = '';if (srcObj.offsetHeight - evt.offsetY <= 4 &&srcObj.offsetWidth - evt.offsetX > 4) {srcObj.style.cursor = '';targetTd = srcObjresizeable = true;srcObj.style.cursor = "row-resize"; //修改光标样式} else if (evt.offsetY <= 4 && evt.offsetX > 4) {srcObj.style.cursor = '';if (srcObj.parentNode.rowIndex) {resizeable = true;// srcObj.style.cursor = "row-resize";}} else if (srcObj.offsetHeight - evt.offsetY > 4 &&srcObj.offsetWidth - evt.offsetX <= 4) {srcObj.style.cursor = '';srcObj.style.cursor = "column-resize"; //修改光标样式}else if (evt.offsetY > 4 && evt.offsetX <= 4) {srcObj.style.cursor = '';if (srcObj.parentNode.rowIndex) {// srcObj.style.cursor = "column-resize";}} else {srcObj.style.cursor = '';resizeable = false;srcObj.style.cursor = "default";}}};//放开鼠标恢复原位document.onmouseup = function(event) {resizeable = false;mousedown = false;document.body.style.cursor = "default";};// 得到目标值事件function getTarget(evt) {return evt.target || evt.srcElement;}// 添加监听function addListener(element, type, listener, useCapture) {//这是两种写法,对应不同浏览器element.addEventListener? element.addEventListener(type, listener, useCapture): element.attachEvent("on" + type, listener);}},
});
http://www.xdnf.cn/news/11722.html

相关文章:

  • 好用的博客评论系统 Valine 使用及避坑指南
  • 如何免费获得可以升级的nod32官方中文版杀毒软件 - 非淡泊无以明志,非宁静无以致远。 - C++博客...
  • GPS介绍(一)—基本工作原理
  • phpnow如何卸载mysql_phpnow卸载方法 完全删除或卸载PHPnow环境配置包(图解)
  • WINDOWS 7全系列验证码
  • phpstorm的简单配置
  • 。iBm T43 程序组 IBM软件详解
  • [附源码]java毕业设计基于新高考模式下的排课系统
  • ESET NOD32 升级 激活码 用户名和密码~MF111
  • c语言万年历带农历
  • [数位dp] 计数问题(模板题+数位dp)
  • 一键彻底清理!解密如何清理电脑C盘垃圾的绝佳方法
  • MyEclipse6.5下载地址(含注册码)
  • 如何隐藏IE地址栏
  • 元搜索推荐:比比猫!(马丁编辑)
  • 肇庆游记:绿色高要最自然
  • wegame登录cf显示服务器人数已满,WeGame
  • [C#]C# 字符串(String)的使用
  • android PendingIntent:有用的requestCode参数
  • 如何把大容量10G的文件分享给别人?整理了3个简单的方法~
  • 三级数据库技术考点(详解!!),35岁技术人如何转型做管理
  • python爬取某站磁力链
  • uniapp的那些坑
  • 公司面试题
  • 主打实用!分享两个制作答辩PPT的技巧,还有8套高校通用毕业论文PPT模板
  • 高速动车组全谱系图解
  • 计算机视觉简介
  • Android应用程序 --- WakeLock 保持后台唤醒状态
  • 微信小程序详细教程(建议收藏)
  • 使用PHPProxy把虚拟空间变成HTTP代理(ZT)