修身养性,知行合一

  • 首页
  • 爱码
    • 系统
    • 数据库
    • JavaScript
    • CSharp
    • Python
  • 生活
    • 文化
    • 美食
  • 杂谈
  • 关于
修身养性,知行合一
码字,杂谈
  1. 首页
  2. 爱码
  3. 前端
  4. 正文

el-table 自定义滚动条后的错位问题

2023年9月28日 3408点热度 0人点赞 0条评论

问题出现

在使用 el-table 中,在使用 fixed 字段固定列后,当我们自定义表格的滚动条的宽高后,会出现底部高度不对齐,右侧列宽不对齐等情况。

file

上图可以看到,当我们滚动到底部后,会出现明显的错位现象。此时,第一时间就去 F12 查看元素,企图重载样式。但是始终无所收获。

解决方案

其实,只要在重载对应的 .el-scrollbar__wrap::-webkit-scrollbar 样式即可:

.el-table__body-wrapper::-webkit-scrollbar {
  height: 10px;
}

.el-scrollbar__wrap::-webkit-scrollbar {
  width: 10px;
  height: 10px;
}

此时,刷新页面,再看效果:

file

已经根据自定义高度正常展示了。

原因解读

我们知道,el-table 比较复杂,尤其是当我们用了 fixed 属性后,通过 F12 查看元素就可知,其通过构造多个不同配置的表格,通过 js 实现表格之间滚动的联动效果。

其中,这个滚动条是中间滚动内容的,左右的固定列应该把这个位置让出来(同理,右侧的滚动条,在表格和表头之间也有这个问题)。让出来多少呢?计算一下滚动条高度即可,然后通过 js 直接写到表格的样式里面即可。

但是,大小怎么计算呢?在我之前写的 @xpyjs/gantt 组件中,也有这个问题。我通过一种比较取巧的方式,左侧表格高度 - 右侧甘特区高度 = 滚动条高度,通过这样的方式,可以准确判断出当前差值是多少,甚至可以"预判"用户自定义滚动条的高度。

但是的但是,el-table 并没有这样实现,至少它没有像我那样准确的方式。而是使用了比较通用的方式:通过创建元素、计算滚动条高度、再删除元素的方式得到滚动条的宽高:

let scrollBarWidth;

export default function() {
  if (scrollBarWidth !== undefined) return scrollBarWidth;

  const outer = document.createElement('div');
  outer.className = 'el-scrollbar__wrap';
  outer.style.visibility = 'hidden';
  outer.style.width = '100px';
  outer.style.position = 'absolute';
  outer.style.top = '-9999px';
  document.body.appendChild(outer);

  const widthNoScroll = outer.offsetWidth;
  outer.style.overflow = 'scroll';

  const inner = document.createElement('div');
  inner.style.width = '100%';
  outer.appendChild(inner);

  const widthWithScroll = inner.offsetWidth;
  outer.parentNode.removeChild(outer);
  scrollBarWidth = widthNoScroll - widthWithScroll;

  return scrollBarWidth;
}

文件路径:element-ui/src/utils/scrollbar-width.js

有了这样的原因,我们就可以知道,它在内部自动计算了滚动条的宽高。也就是说,我们单单修改 el-table 的滚动条样式,只会改变表格当前的滚动条的高度,而不会改变这个预留出来的间隙高度,所以我们要动态改变这个元素的滚动条的宽高,于是就有了我们改变 .el-scrollbar__wrap::-webkit-scrollbar 的方式。

切记,这个改变需要改变的是全局的。也就是说,如果你的项目中有多个表格,你不可以单独给某一个表格的滚动条重置宽高。因为,fixed 列的高度是在内部计算死的,用了统一的 scrollBarWidth 值,所以,这个方法只能做到统一修改。

另外,还要记得,这个方法要全局生效~

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: 暂无
最后更新:2023年9月28日

jeremyjone

这个人很懒,什么都没留下

打赏 点赞
< 上一篇
下一篇 >

文章评论

取消回复

文章目录
  • 问题出现
  • 解决方案
  • 原因解读
最新 热点 随机
最新 热点 随机
推一个vscode纯黑主题 vue 的递归插槽穿透 Github Pages SPA 重定向 行间距引出的 DOCTYPE 怪异行为 写个小彩蛋 绘制一个可重用的线条阴影
docker 自动更新 .net core 3.x使用mysql EntityFramework vue 给全局自定义属性添加 ts 类型声明 fetch的二次封装 歌曲分享--爱得太迟 @typescript-eslint/no-unused-vars 警告问题

(っ•̀ω•́)っ✎⁾⁾ 开心每一天

COPYRIGHT © 2021 jeremyjone.com. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS

京ICP备19012859号-1

京公网安备 11010802028585号