Popover气泡卡片在滚动容器内定位偏移怎么办?
在给按钮加Popover气泡卡片时,当父容器有滚动条时,气泡位置总是偏移好几十像素,搞不懂哪里错了…
我按照常规方法获取按钮位置:
function showPopover() {
const btn = document.querySelector('.trigger-btn');
const rect = btn.getBoundingClientRect();
this.popover.style.top = <code>${rect.top + window.scrollY + 20}px</code>;
this.popover.style.left = <code>${rect.left + window.scrollX}px</code>;
}
但发现当页面滚动过或者父元素有overflow:auto时,气泡位置明显偏上偏左。试过改用getClientRects()和offsetTop/Left属性都不行,用devtools检查发现计算坐标始终不包含父容器的滚动距离…
getBoundingClientRect获取的是相对于视口的位置,而父容器如果有滚动条,它的滚动偏移量不会自动计算进去。你得手动把父容器的滚动位置加进去才行。一般这样处理:先找到最近的有滚动行为的父容器(也就是设置了
overflow: auto或overflow: scroll的那个),然后获取它的scrollTop和scrollLeft,再加上按钮的相对位置。下面是一个改好的代码示例:
这里的关键点是用
closest方法找到最近的滚动容器,然后通过scrollTop和scrollLeft获取它的滚动偏移量,最后加到气泡的位置上。如果你不确定哪个父元素是滚动容器,可以用
getComputedStyle检查overflow样式是不是auto或scroll。不过上面的代码已经够用了,只要把.scroll-container替换成你实际的滚动容器选择器就行。我之前也踩过这个坑,调试了半天才发现是滚动偏移没算对,希望这能帮你解决问题。
position: fixed配合getBoundingClientRect(),不用算滚动距离:或者更彻底一点,用
popper.js或tippy.js,一行代码搞定,别自己折腾。