使用相交观察器检测元素是否在视口上方或下方

Detect whether element is above or below the viewport on intersect leave with intersection observer

我目前正在使用 intersection observer 来检测元素何时离开视口。它是这样设置的:

const el = document.querySelector('#el')
const observer = new window.IntersectionObserver(([entry]) => {
  if (entry.isIntersecting) {
    console.log('LEAVE')
    return
  }
  console.log('ENTER')
}, {
  root: null,
  threshold: 0,
})

observer.observe(el)

但我也想知道元素是在视口上方还是下方。有办法实现吗?

似乎(使用您的代码)当元素低于屏幕时 entry.boundingClientRect.top 值为正,当元素位于屏幕上方时值为负

在此处查看: https://codepen.io/gui3/pen/VwwRORL

_编辑_ 经过多次尝试,这绝对有效

const observer = new window.IntersectionObserver(([entry]) => {
  console.log(entry.boundingClientRect.top)
  if (entry.isIntersecting) {
    console.log('Enter')
    position("VISIBLE") // do things if visible
    return
  }
  console.log('Leave')
  if (entry.boundingClientRect.top > 0) {
    position("BELOW") // do things if below
  } else {
    position("ABOVE") // do things if above
  }
}, {
  root: null,
  threshold: 0,
})

仅当您未将 rootMargin 值设置为 IntersectionObserver 中的选项时,检查 entry.boundingClientRect.top 才有效 。您应该改为检查 entry.isIntersecting

如果您需要检查元素是否通过视口并相交,请使用:

isIntersecting || boundingClientRect.top < 0

很简单

let scrollY = window.scrollY;

new IntersectionObserver(([entry]) => {
  if (!entry.isIntersecting) {
    if (window.scrollY > scrollY) {
      // entry is above
    } else {
      // entry is below
    }
  }
  scrollY = window.scrollY;
}, {
  threshold: [0.4]
});