我正在制作一个博客网站,我希望有一个粘性元素,该元素会随着用户滚动而在每个新的一年和月份进行更新。这样标题就会显示列出的博客文章的当前月份和年份。
编码的时候,我尝试用HTML实现效果,如果不行就用CSS,如果还是不行就用JS。我相信这是一个很好的做法,因为它使用内置功能并减少了所需的计算资源,但如果您不同意这个观点,请告诉我。
理想情况下,元素的样式在“卡住”时会发生变化。为此,我查看了David Walsh 的解决方案,该解决方案使用IntersectionObserver
但在添加多个元素时会出现故障。
我面临的主要问题是,当有多个条目时,脚本会将位于窗口底部边框的元素检测为“固定”。
这是一个片段。我还用相同的代码制作了一个jsfiddle 。
//Essentially putting David Walsh's code in a loop
document.querySelectorAll(".myElement").forEach((i) => {
const observer = new IntersectionObserver(([i]) => i.target.classList.toggle("is-pinned", i.intersectionRatio < 1),
{threshold: [1]});
observer.observe(i);
})
#parent {
height: 2000px;
}
.myElement {
position: sticky;
top: -1px;
}
/* styles for when the header is in sticky mode. The transition times accentuate the undesired effect */
.myElement.is-pinned {
color: red;
transition: color 0.3s, background-color 0.3s;
background-color: orange;
}
<div id="parent">
<!-- Adding more than one 'hello' element. The br's are here to add vertical space and be longer than the viewport height -->
<br><br><br><br>
<div class="myElement">Hello!</div>
<br><br><br><br>
<div class="myElement">Hello 2!</div>
<br><br><br><br>
<div class="myElement">Hello 3!</div>
<br><br><br><br>
<div class="myElement">Hello 4!</div>
<br><br><br><br>
<div class="myElement">Hello 5!</div>
<br><br><br><br>
<div class="myElement">Hello 6!</div>
<br><br><br><br>
<div class="myElement">Hello 7!</div>
<br><br><br><br>
<div class="myElement">Hello 8!</div>
</div>
开心每一天1111
MMMHUHU
相关分类