el-table自定义滚动条大小后出现错位
这是一个小伙伴发来的demo
事实上这个问题已经解决了
我们今天来重现一遍解决的过程
因为最终采用的方法
是:不读源码怎么也发现不了的方法
好我们来试一下
首先呢我们把它解压一下
然后呢他只有一个html文件
我们就把它放在一个目录里
叫个:demo吧
然后呢把它放进来
然后我们用 vscode 打开
好然后呢
用 live-server 把它跑起来就行了
这是一个饿了么 ui 的
el-table
这个小伙伴修改了默认滚动条的大小
那他遇到的问题是什么呢
就是当这个表格有
左右的浮动列的时候
比如操作
然后呢滚动条滚动到最后的时候
大家看
他这个表头和内容不对齐
包括他滚动到下面
大家看!每一行也不对齐了
那熟悉el-table的同学都知道
el-table为了做这种浮动列
他会把
表格做成好几个部分
大家看一下把这放大一点
大看他把表格做了几个大的 div
一个是...body-wrapper
这就是真实的表格数据
上面还有一个表头
就说表头为了浮动
在这他单独做了个 div
里边放了个表格
然后又单独做了个 div
里边放了一个内容的表格
然后他又做了两个浮动的
一个是左侧的一个是右侧的
大家看!好再往下先不管它
我们先看左右浮动的这个
我们先把右侧的删掉
大家看!这个滚动其实不对齐就是他
右侧的浮动
这一列和表格真实的内容没有对齐
那我们就可以猜测我们在
滚动的时候他肯定是用 js 来控制
右侧跟着一起滚动
我们把javascript禁用
试一下
再滚动,大家看
左右都不滚动了
这就说明他实现的原理是依赖于:javascript
监测:我们中间这个主表格
滚动
然后呢他去控制两边的固定列的滚动
然后基于这个原理
如果我们修改了滚动条的大小
那么我们在滚动的时候
就会出现刚才那种不对齐的情况
那为什么呢? (我先把加速恢复恢复一下)
那我们仔细观察应该他差的这一点
高度就是一个滚动条的高度
我们试一下
现在是10我们把它都改成30
打开我们把它滚动到最下面
我们试一下
我们这样试吧
大家看正好是这么多差不多
那到这里呢我就想到另外一个问题
就是我现在用的是Mac系统
Mac系统如果不
设置滚动条的大小的话
默认滚动条是隐藏的
大家看
只有我在滚动的时候他会显示出来
所以呢
他往下滚动他不会出现这种问题
但是windows默认不是这样的
他默认都是显示一个条在这的
我们用windows看一下这个效果
好我们打开浏览器
(172)就这个
大家看
我现在没有设置滚动条自定义的样式
他是有一块滚动条在这的
所以到这的话就有点意思了
也就是说同样是el-table
他在 windows 下和在Mac下
展现形式是不一样的
我们可以验证一下我们把中间这个
主表删掉
检查一下
就这个大的wrapper我们把它删掉
大家看他两边浮动的地方
他是让出来这么一点
也就是说:他把滚动条的大小让出来了
我们再去Mac下也是把这个大表删掉
大家看在Mac下
他就没有让出来这一点
我们再看windows
而且windows这一块他也让出了一点
滚动条的宽度大家看
Mac下是没有的
所以这就是我们的突破点
我们就找一下
他是怎么把这一点让出来的
然后呢
当我们修改了滚动条的样式以后
也想办法让他可以让出来
我们修改后的宽度就可以了
大家看这个div
就是刚才我说的后面两个先不管的
其中有一个叫这个
el-table-fixed-right-patch
我们再看 mac
mac 也有这个 table
但是它的宽度是0
那同样代码它在windows下呢
它的宽度就是17像素
我们就以它为突破点
我们去搜一下源代码
复制然后呢我们随便打开一个
vue的项目
去 node_modules 里去找到这个
饿了么 ui
element-ui
然后找到package
然后找到table
在这
table.vue
然后呢我们在这里搜一下这个
大家看这个表格
那他的宽度是什么呢
他看有没有纵向滚动条
有的话他的宽度是layout.gutterWidth
所以呢我们找一下 layout
layout 怎么来的
加空格
在这:TableLayout
那TableLayout怎么来的
在这
打开 table-layout.js
然后呢他用到了这里边的gutterWidth
我们找一下
在这:gutterWidth
又调(用)了这个方法,我们再找这个方法
然后这个方法又引
用了这个文件
我们再把这个文件找到
这个文件里
就这一个方法
function
最终返回这个宽度
我们看他怎么写的哈
我把这个隐藏掉
首先呢他创建了一个 div
名字叫outter
然后outter指定到一个样式
然后把它隐藏起来
宽度等于100
绝对定位
然后呢
放到了一个我们看不到的地方
把它插入到文档里
接着他获取到了这个 div 的宽度
然后强制让这个 div 出现滚动条
overflow = 'scroll'
接着创建一个 inner div
宽度等于百分之百
然后把 inner 放到 outter 里边
然后呢获取到inner的宽度
再把outter删掉
他用outter的宽度减inner的宽度
从而获取到滚动条的默认宽度
什么意思呢
他先创建了一个 div
这个 div 100像素
然后呢
他强制让这个 div 出现滚动条
比如滚动条这么宽
接着呢他下边我们就不不画了哈
因为下边不重要
接着呢他又创建了一个 div
他把这个 div 放到这个
大的 div 里面
是这样的
好这时候他怎么获取滚动条宽度呢
他让这个大的点位的总宽度
减去
小的这个点位的总宽度
比如说刚才看到的
最终得出17像素就这么来的
所以呢我们根据他这个
元代码就很容易找到切入点
我们要想办法让他这个方法执行
到最后拿到的这个
宽度
是我们修改后样式的自定义的宽度
怎么改啊
我们要改这个 div 的样式
我们试一下
把它先恢复回来
这个样式的
我们把它
都复制过来
都是30好
再看一下效果
大家看对齐了
再往下
也对齐了
再看 windows
对齐了
都对齐了
所以总结一下
如果以后我们想修改 el-table 的
滚动条的宽度
那一定要加上这个样式好
今天就到这里谢谢大家
最后更新于
这有帮助吗?