Intersection Observer

νƒ€κ²Ÿ μš”μ†Œμ™€ μƒμœ„ μš”μ†Œ λ˜λŠ” μ΅œμƒμ˜ document 의 viewport μ‚¬μ΄μ˜ intersection λ‚΄μ˜ λ³€ν™”λ₯Ό λΉ„λ™κΈ°μ μœΌλ‘œ κ΄€μ°°ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

  • νŽ˜μ΄μ§€κ°€ 슀크둀 λ˜λŠ” 도쀑에 λ°œμƒν•˜λŠ” μ΄λ―Έμ§€λ‚˜ λ‹€λ₯Έ μ»¨ν…μΈ μ˜ 지연 λ‘œλ”©
  • 슀크둀 μ‹œμ—, 더 λ§Žμ€ 컨텐츠가 λ‘œλ“œ 및 λžœλ”λ§ λ˜μ–΄ μ‚¬μš©μžκ°€ νŽ˜μ΄μ§€λ₯Ό μ΄λ™ν•˜μ§€ μ•Šμ•„λ„ 되게 ν•˜λŠ” infinite-scroll κ΅¬ν˜„
  • μ‚¬μš©μžμ—κ²Œ κ²°κ³Όκ°€ ν‘œμ‹œλ˜λŠ” 여뢀에 따라 μž‘μ—…μ΄λ‚˜ μ• λ‹ˆλ©”μ΄μ…˜μ„ μˆ˜ν–‰ν•  지 μ—¬λΆ€λ₯Ό κ²°μ •

전톡적인 슀크둀 방식

κ³Όκ±°μ—λŠ” intersection 감지λ₯Ό κ΅¬ν˜„ν•˜λ©΄ 영ν–₯λ°›λŠ” μš”μ†Œλ₯Ό μ•ŒκΈ° μœ„ν•΄ Element.getBoundingClientRect() 와 같은 λ©”μ„œλ“œλ₯Ό 호좜

이 μ½”λ“œλŠ” 메인 μŠ€λ ˆλ“œμ—μ„œ μ‹€ν–‰λ˜κΈ° λ•Œλ¬Έμ— λ‹€λ₯Έ μ½”λ“œμ™€ μ–½νžˆκ²Œ 되면 μ„±λŠ₯이 맀우 λ–¨μ–΄μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€

function setWindowScroll() {
  document.addEventListener('scroll', () => {
    boxs.forEach(box => {
      if (isShowElement(box)) {
        box.classList.add('show')
      } else {
        box.classList.remove('show')
      }

      console.count('Window Scroll')
    })
  })

  function isShowElement(target) {
    var rect = target.getBoundingClientRect()

    return (
      rect.top >= 0 &&
      rect.left >= 0 &&
      rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
      rect.right <= (window.innerWidth || document.documentElement.clientWidth)
    )
  }
}

μΈν„°μ„Ήμ…˜ μ˜΅μ €λ²„

function setIntersectionObserver() {
  const options = { }

  const callback = (entries, observer) => {
    entries.forEach(entry => {
      
      const { isIntersecting, target } = entry

      if (isIntersecting) {
        target.classList.add('show')
      } else {
        target.classList.remove('show')
      }

      console.count('Intersection Observer')
    })
  }

  const io = new IntersectionObserver(callback, options)

  boxs.forEach(box => {
    io.observe(box)
  })
}

Performance

Window Scroll

Intersection Observer

Parameter

const instance = new IntersectionObserver(callback [, options])

instance.observe(domElement)

Callback

  • entries
    • μΈν„°μ„Ήμ…˜ μ˜΅μ €λ²„ μ—”νŠΈλ¦¬λ₯Ό λ°°μ—΄ν˜•νƒœλ‘œ λ°˜ν™˜
  • observer
    • μΈν„°μ„Ήμ…˜ μ˜΅μ €λ²„ μΈμŠ€ν„΄μŠ€ 객체

Options

μ˜΅μ €λ²„κ°€ μ‹œμž‘λ˜λŠ” μ‹œμ μ—μ„œ μ„€μ •ν•˜λŠ” μ˜΅μ…˜ ν•„μˆ˜κ°’μ€ μ•„λ‹ˆλ‹€.

  • root
    • λŒ€μƒ 객체의 κ°€μ‹œμ„±μ„ 확인할 λ•Œ μ‚¬μš©λ˜λŠ” 뷰포트 μš”μ†Œμž…λ‹ˆλ‹€
  • rootMargin
    • root κ°€ 가진 μ—¬λ°±μž…λ‹ˆλ‹€. 이 μ†μ„±μ˜ 값은 CSS의 margin 속성과 μœ μ‚¬ν•©λ‹ˆλ‹€.
  • threshold
    • observer의 콜백이 싀행될 λŒ€μƒ μš”μ†Œμ˜ κ°€μ‹œμ„± 퍼센티지λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 단일 숫자 ν˜Ήμ€ 숫자 λ°°μ—΄μž…λ‹ˆλ‹€

Method

observe

κ΄€μ°° μ‹œμž‘

unobserve

κ΄€μ°° μ’…λ£Œ

disconnect

κ΄€μ°° μΌμ‹œ 쀑지

Polyfill

@@TODO