在現在用 css 的 position: sticky 就可以設定當區塊超過可視範圍後就卡在頁面上某處的效果,不過如果除了卡住外還想修改樣式,就還是得用 javascript 來處理。
這邊先把 css sticky 的 top 設定成 -1px,這樣可以讓這區塊超出可視範圍。
.nav {
position: sticky;
top: -1px;
}
/* styles for when the header is in sticky mode */
.nav.active {
background: rgba(0,0,0,.8);
}
接著利用 js 的 IntersectionObserver 來偵測目標區塊後判斷是否要添加 class,會比 scroll 事件效能好很多。
const el = document.querySelector(".nav")
const observer = new IntersectionObserver(
([e]) => e.target.classList.toggle("active", e.intersectionRatio < 1),
{ threshold: [1] }
);
observer.observe(el);
效果可以參考這頁。
參考文章:
position:sticky : Adding style when the element detaches from normal flow