el-select下拉错位(下)
最后更新于
这有帮助吗?
最后更新于
这有帮助吗?
今天终于可以把这个BUG
详细的给大家讲完了
大概现在这个就是不对齐的
那我们都知道了哈
导致这个BUG的原因之一就是这个popper
就是这个弹出层啊
被挂在到了这个ESSELECT里面
这个就是这个整个的弹出层
大家看它的父级元素就是这el-select
所以呢这个弹出层的位置
就是相对于这个el-select来说的
我们也可以看出来这个el-select
现在的position是等于relative的
所以呢我们会发现
他现在有个top等于40像素
life他有个5像素
40像素没问题
但他为什么总是会有一个5像素呢
大家看
这个的life就是
好那我们接下来就去深挖一下
到底为什么
这个的弹出层的left的就是5像素
首先呢我们先找到这个组件
在这里我们点进去
打开点进去以后呢
我们往下拉
找到他弹出层的那一块的代码
在这里
el-select-menu
ref=popper 就说明这是一个弹出层
我们继续往里点
然后呢大家看这有一个插槽
说明这是一个相对比较公用的组件
然后呢这有个mixins
他把这个
组合进来了
那我们再来看这个组件里边
这个组件里边呢往下看的话
我们会发现他有一个监听
showPopper 的这个这个变量
这里边呢他会调用updatePopper
所以呢我们再找一下这个updatePopper
在这里
这里边呢
他又调用了这个组件update方法
这个组件在哪呢
就在上面
大家看!他在这导入的
所以我们再去点进去
我们来搜一下update的方法在哪里
大家看 在这
update
然后我们就简单的
大概的先看一下这些代码
offsets看意思就是获取一些尺寸的东西
然后呢
boundaries
看字面也是在获取一些边界的东西
我们先不管他
那我们怎么调呢
我们就在最后啊把这个data打印出来
先看看它的数据结构
在这打印可不可以呢
首先我们试一下
刷新一下
大家看 没有任何输出
我再来一遍
对吧没有输出
那为什么呢
这里边有个技巧啊
我们先来看一下这个文件的路径
大家看他现在是在一个src目录里面
好我们复制一下他的文件名
然后呢我们再去找一下相同文件名
还有一个在lib下边 大家看
好我们去这里边改
还是我们找到 update方法
在这里边
我们在这下边
把这个data先打出来
看一下它的数据结构
大家看,他就打出来了
打出来两个
我们先不管他为什么打出来两个哈
然后呢我们展开后边这个
boundaries
offsets
大家看啊这个boundaries他就有一个left
等于
我们再来看一下上面正常的
清空一下
我们还是展开后面这个
大家看 这个boundaries
它的left就不是5,是-
包括我们再来看一下它的
offsets offsets里边注意看有个popper
popper的left是
然后我们再来看一下
有问题的
同样展开之后还是第二个
然后offsites paper
paper里还是有个left
这个left就是
点offests 然后呢 点popper 然后点
left
我们来看一下
打开5 再看这个
好接下来怎么办呢
我们把这个代码往上放
好我们再展开
还是5 我们再往上放
打开这个时候是0点几几斤
说明这个时候还没问题
再来看上面这个
他也是0点几几几
比如说在下边这个组件里边
走到这一步还是正常的
再往下走
走到这就不正常了
我们在这做一些标记
横线然后呢
加一些0吧
我们测一下
注意看
上面的时候还是
做完这个方法就变成5了
我们再来看正常的
上面是0点几
下面是
所以这个是没问题的
那就说明下面这个select
走到这个方法会对他有影响
那这个方法里面都有什么呢
我先把这个注掉
去看这个方法
这个方法呀就是去循环
执行了一些modifier
那这modifier在哪复的值呢
我们就一层一层找
最终我们就能找到这个
在这从这开始就有很多的modifier
大家看这是 applyStyle
咱们下shift
然后我就一个一个的在里边console.log
试哈就试到这个
大家看
这个modifier
他在这有一个life的输出
我们在这console log一下 left
大家看
这个是
同样是123的没问题的这个组件呢
他展开的时候这块输出的是
有问题
记得那个组件呢他展开的时候
在这输
出的是
所以我们就来看一下他有什么区别
打开
这是我之前写的注释哈 我们把它打开
这就是有一个判断
如果他小于他走这里边
我就把这两个变量都打出来了
好我们再来试一下
好我们展开这个有问题的注意看
0和5,0小于5吗
0当然小于
所以他会走下边
他会让这个left他等于谁啊
等于这两个数里面比较大的那个
因为0小于5等于大的就是谁呢
他就变成5了
我们再来看另一个
0小于248吗
当然不小于
所以他不会走这里边
所以啊问题就集中在了
这个 boundaries.left 的到底是什么
这个boundaries边界到底是什么
那我们来看一下
就是当我们展开这个组件的时候
这个弹出层他不能超出的一个范围
不能超出什么范围呢
就是这个屏幕的边缘
也就是浏览器的四周
但是大家可别忘了
现在这个popper是被挂在到了
这个el-select
里面
所以呢这个popper的布局
是相对于这个el-select的
那么对于这个popper来说
的x轴为0是哪呢
就是这条线
那么它的y轴为0呢
就是这条线
好所以对于这个popper来说
如果我们想把它放到左侧的边缘
他的
x轴坐标应该是多少呢
我们假设
他的offsetLeft
是400PX 那么
他的left应该是多少呢
应该是
0减去400PX
也就是说-400像素
同理呢他的顶部边界值也是这样的
用0减去offsetTop来得到
所以
我们再回去找刚才这个帮坠
式复制的那转代码
我们回到这个update方法
在这里
在这里给boundaries赋值,我们点进去
往下找
大家看
这个boundaries等于left的是0减去这个
再减 scrollLeft
这个scrollLeft可以不管他
但问题就出现在这里
为什么呢
因为下边这个
它取不到 offsetLeft
关于这个啊
我前两期视频已经铺垫过了
大家看一下
我们检查一下这个元素
这个是ears like
但是呢大注意它的父级元素是什么呢
大家看
现在是position:relative
同时呢他有一个margin
所以呢他现在
是获取不到
offsetLeft 我们可以验证一下
大家看是
我们再来试一下正常的这个
选中这个
我们选中这个el-select 在这里
然后呢
点offset left
大概
这个是正确的
所以要想从根源上来解决这问题
我们就要想办法让他能拿到这个
el-select的
他的offsetLeft
怎么处理
这个我
前两期视频都已经详细的讲过了哈
我们来试一下
我先把这个margin-left去掉吧
好我们再来试一下
offsetLeft 大家看 就能取到了
所以呢
最终的解决方法就是我们要在这个
样式里边
写一个这样的样式
然后position等于 initial
或者我们强制让他的margin-left于0