解决elemen-ui Table表格动态计算高度的bug----el-table__body-wrapper

大千世界,茫茫人海,相识就是一种缘分。若此篇文章对您有帮助,点个赞或点个关注呗!

相信大家在使用element-ui–Table表格组件时,都遇到过需要监听屏幕窗口的大小,动态计算table的height,达到适配屏幕尺寸的友好界面项目。网上有各种各样的办法,同样可以实现动态计算table表格的高度,前提是列的宽度width,设定为固定像素值;但是大家有没有发现切换路由到其他界面再返回到当前界面,table的表格高度少了24px(我自己测试是24px,可能会更高)。其实,这是element-ui内部的一个bug;接下来给大家呈现我的解决方案。

  • 项目需求
    表格的每一列都是通过配置中心配置存储到数据库,后台查询所有列的字段名称以及对应的数据,前台调用对应的接口获取数据,采用v-for循环遍历展示。所以el-table-colum的宽度width,就不能设定为固定的像素值px。如果用户需要展示的列特别少或者特别多,这个时候所有列无法铺满整个屏幕,导致界面效果不友好!所以我设定为min-width="5%"百分比,可以适配不同分辨率的屏幕。当然,当列特别多的时候,你也可以设定固定像素值,固定fixed不同的列,中间采用滚动效果!
  • Table界面------高度bug复现
    正常效果:
    在这里插入图片描述
    在这里插入图片描述
    切换路由到其他界面,再返回后,bug复现底部出现一部分空白,table的body部分高度,明显缩小
    在这里插入图片描述
  • 解决方案一:(推荐使用)
    created初始化的时候,执行calcHeight(value)方法,我写了一个公共的计算方法,有需要可直接引入
 created() {
    window.addEventListener('resize', () => {
      this.tableHeight = calcHeightx(120);
    });
    this.tableHeight = calcHeightx(120);
  },

动态计算公共方法:
//定义wappered boolean值是为了区别我自己定义的同名方法,可忽略
export function calcHeightx(value, wappered = true) {
  //项目自定义的公共header部分的高度,可忽略
  let header = variable.headerHeight;
  //value为动态计算table界面高度时,减去的其他空白部分,需自行在调试找到临界值,剩下的就是table表格的高度(包含header+body部分)
  value = value == undefined ? 100 : value;
  let res = window.innerHeight - parseInt(header.substring(0, header.indexOf('px'))) - value;
  if (wappered) {
    //通过原生方法,获取dom节点的高度------获取element-ui table表格body的元素
    let wapper = window.document.getElementsByClassName('el-table__body-wrapper');
    //通过原生方法,获取dom节点的高度------获取element-ui table表格header的元素
    let header = window.document.getElementsByClassName('el-table__header-wrapper');
    //必须加延时,要不然赋不上去值
    setTimeout(() => {
      //通过上边计算得到的table高度的value值,减去table表格的header高度,剩下的通过dom节点直接强行赋给table表格的body
      wapper[0].style.height = (value - header[0].clientHeight) + 'px';
    }, 100)
  }
  return res;
}
  • 解决方案二:(不推荐)
    当数据为空时,界面效果不友好,只有达到一定数据量时,才撑开页面的高度!个人感觉不是有效解决方案
 <el-table
 	    :max-height = "tableHeight"
        ref="tableHeight"
        border
        :data="tableData"
        :span-method="spanList"
        style="width: 100%;"
        :cell-class-name="tableCellClassName"
        :header-cell-style="{background:'#FFF',color:'#000000'}"
      >

完美解决,无论切换路由至其他界面,还是切换不同分辨率模式,都不会出现高度计算错误的问题!应客户的需求:原本是通过点击某行,通过’<‘el-dialog’>'的form表单实现数据的录入;结果客户需要在table的单元格上直接点击批量录入多个人信息,并且加入了键盘上下左右回车的键盘事件切换,至使我做了两版的录入方式,通过配置的方式进行切换!
有同样需求的伙伴,需要可私信!

<think>好的,我现在需要解决用户提到的el-tooltip在鼠标滚动时定位不准确的问题。首先,我需要了解el-tooltip的基本工作原理和常见问题。根据用户提到的引用[2],可能和滚动条的样式不一致有关,导致计算位置时出现偏差。 首先,检查el-scrollbar和表格的滚动条样式是否统一。用户提到两者的滚动条宽度和高度不一致,这可能会影响el-tooltip的位置计算。因为当存在多个滚动条时,浏览器可能无法正确获取滚动容器的位置,导致定位错误。所以,我需要确保所有滚动条的样式一致,例如设置相同的::-webkit-scrollbar的宽度和高度。 其次,考虑滚动事件的处理。el-tooltip可能在滚动时没有及时更新位置。通常,组件库会监听滚动事件来重新定位浮动元素,但有时可能因为事件未正确绑定或防抖处理导致更新不及时。可以尝试手动触发tooltip的更新,例如在滚动容器上添加scroll事件,调用tooltip的update方法。 另外,检查是否在正确的容器内使用。如果el-tooltip的父元素有transform或position属性,可能会导致定位错误。这时候可能需要调整append-to属性的设置,将tooltip插入到body中,避免受到父容器样式的影响。 还有一种可能是滚动条的存在导致页面布局变化,从而影响元素的相对位置。比如,当滚动条出现或消失时,页面宽度变化,元素位置偏移。这时候需要确保滚动条始终占用空间,可以通过设置overflow: overlay或者自定义滚动条样式来避免布局抖动。 最后,查看Element UI的文档是否有相关配置,比如是否提供了自动更新位置的选项,或者是否有已知的bug和修复方法。如果问题依然存在,可能需要升级Element UI版本或寻求其他解决方案,例如使用第三方库来辅助定位。</think>### el-tooltip 鼠标滚动时定位不准的解决方案 #### 1. 滚动容器样式统一 确保滚动条样式一致,避免因滚动条宽度/高度差异导致布局偏移: ```css /* 统一所有滚动条样式 */ .el-scrollbar__wrap::-webkit-scrollbar, .el-table__body-wrapper::-webkit-scrollbar { width: 6px; height: 6px; } ``` #### 2. 强制更新定位 在滚动事件中手动触发tooltip位置更新: ```vue <template> <div class="scroll-container" @scroll="handleScroll"> <el-tooltip ref="myTooltip" content="提示信息"> <button>悬停按钮</button> </el-tooltip> </div> </template> <script> export default { methods: { handleScroll() { this.$refs.myTooltip.updatePopper(); } } } </script> ``` #### 3. 使用append-to-body属性 防止父容器定位干扰: ```vue <el-tooltip append-to-body :popper-options="{ boundariesElement: 'viewport' }"> ``` #### 4. 配置防抖参数(Element UI 2.15+) ```vue <el-tooltip :scroll-adaptive="true" :scroll-throttle="100"> ``` #### 5. 检查transform容器 若父元素使用transform,添加transform豁免: ```css .transform-container { transform: translateZ(0); /* 创建新的层叠上下文 */ } ``` [^1]: 定位问题通常与滚动容器计算相关,需统一滚动条样式 [^2]: 滚动条尺寸差异会导致布局偏移
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

能先森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值