虽然我不能完全重现问题中描述的问题,但我可以看到,观察和切换同一个元素可能会产生闪烁,元素会稍微上下移动。
为了解决这个问题,这个代码段添加了一个“传感器”像素元素,即被观察到的元素,而不是粘性元素。当它移出视口时,固定的类被添加到粘滞元素中,当它返回视口时固定的类会被删除。这样,交叉观察和粘性就分开了。没有闪烁。
<style>
#sensor {
position: absolute;
width: 1px;
height: 1px;
}
#sticky {
position: sticky;
top: 0px;
background-color: khaki;
}
.pinned {
filter: drop-shadow(0px 3px 3px red);
/* this is fine: */
/* box-shadow: 0px 3px 3px red; */
}
body {
/* just for demo to make sure we can scroll */
min-height: 200vh;
}
</style>
<body>
<div>line<br>line<br>line<br>line<br>line<br>line<br>line<br></div>
<div id="sensor"></div>
<div id="sticky">
I am sticky
</div>
<script>
const ob = new IntersectionObserver(
(entries) => {
for (const entry of entries) {
if (entry.isIntersecting) {
document.querySelector('#sticky').classList.remove('pinned');
} else {
document.querySelector('#sticky').classList.add('pinned');
}
}
});
ob.observe(document.querySelector('#sensor'));
</script>
</body>