Introduction

์˜ค๋Š˜์€ ๋ฌดํ•œ ์Šคํฌ๋กค UI๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋ฐฐ์› ๋‹ค.
์–ด๋ ค์šธ ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ๋ฐ”๋‹๋ผ JS๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ์“ฐ๋‹ˆ ํ›จ์”ฌ ๋น ๋ฅด๊ณ  ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค...์ด๊ฒŒ ๋‹ค 3์ฃผ๊ฐ„์˜ ๊ณ ์ƒ์ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.
ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค KDT ์ตœ๊ณ  ><
scroll event ์™€ intersection observer์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์‹ ๊ธฐํ•˜๊ณ  ์žฌ๋ฏธ์žˆ์—ˆ๋‹ค.
๊ทธ์™€ ๋”๋ถˆ์–ด ๋กœํ†  ๊ฐ•์‚ฌ๋‹˜์˜ ๊ณ ์–‘์ด ์‚ฌ์ง„๋“ค์„ ๋ง˜๊ป ๊ฐ์ƒํ•  ์ˆ˜ ์žˆ์–ด์„œ ๋ฐฐ์šฐ๋Š”๋‚ด๋‚ด ํ–‰๋ณตํ–ˆ๋‹ค~๐Ÿฑโค๏ธ ๋‚˜๋งŒ ์—†์–ด ๊ณ ์–‘์ด...


์˜ค๋Š˜ ์ƒˆ๋กญ๊ฒŒ ๋ฐฐ์šด ๊ฒƒ

๋ฌดํ•œ ์Šคํฌ๋กค Ul ๊ตฌํ˜„ํ•˜๊ธฐ
- Scroll Event ๋ฐฉ์‹
- Intersection Observer ๋ฐฉ์‹


๐Ÿ“Œ ๋ฌดํ•œ ์Šคํฌ๋กค UI

๋ฌดํ•œ ์Šคํฌ๋กค์ด๋ž€?

  • ์ปจํ…์ธ ๋ฅผ ํŽ˜์ด์ง•ํ•˜๋Š” ๊ธฐ๋ฒ•์œผ๋กœ, ์•„๋ž˜๋กœ ์Šคํฌ๋กค์„ ๋‚ด๋ฆฌ๋‹ค๊ฐ€ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ฅผ ๋ณผ ๋•Œ์ฏค์— ๋‹ค์Œ ์ปจํ…์ธ ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ์‹์„ ๋งํ•œ๋‹ค.

๋ฌดํ•œ ์Šคํฌ๋กค์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹

  1. Window์˜ Scroll Event๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ์‹
  2. Intersection Observer ๋ฐฉ์‹

Scroll Event

  • window์— scroll event๊ฐ€ ์ผ์–ด๋‚  ๋•Œ๋งˆ๋‹ค ํ™”๋ฉด ์ „์ฒด์˜ height๊ณผ ์Šคํฌ๋กค์˜ ์œ„์น˜๋ฅผ ํ†ตํ•ด ์ปจํ…์ธ ์˜ ๋์— ๋„๋‹ฌํ–ˆ๋Š”์ง€๋ฅผ ์ฒดํฌํ•ด์„œ ์ฒ˜๋ฆฌ
  • scroll event๊ฐ€ ์ผ์–ด๋‚  ๋•Œ๋งˆ๋‹ค ํŠน์ • ํ•จ์ˆ˜๊ฐ€ ๋™์ž‘ํ•˜๋ฏ€๋กœ ์ตœ์ ํ™” ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค
window.addEventListener("scroll", () => {
    if ( window.innerHeight + window.scrollY >= document.body.offsetHeight) {
      // ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ํ•จ์ˆ˜ ๊ตฌํ˜„
    }
  });

Intersection Observer

  • ๋‚ด๊ฐ€ ํƒ€๊ฒŸ์œผ๋กœ ์ง€์ •ํ•œ DOM ๊ฐ์ฒด๊ฐ€ ์ง€๊ธˆ ์‚ฌ์šฉ์ž์˜ ํ™”๋ฉด์— ๋ณด์ด๋Š” ์š”์†Œ์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ๊ตฌ๋ณ„ํ•˜๋Š” ๋ฐฉ์‹
  • ๊ฐ์‹œํ•˜๊ณ  ์žˆ๋Š” ์š”์†Œ๊ฐ€ ๋ทฐํฌํŠธ์— ๋“ค์–ด๊ฐ€๊ฑฐ๋‚˜ ๋‚˜๊ฐˆ ๋•Œ ๋˜๋Š” ์š”์ฒญํ•œ ๋ถ€๋ถ„๋งŒํผ ๋‘ ์š”์†Œ์˜ ๊ต์ฐจ ๋ถ€๋ถ„์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ํŠน์ • ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ๊ตฌํ˜„
  • threshold ๊ฐ’์œผ๋กœ observe ๋Œ€์ƒ์ด ์–ผ๋งˆ๋‚˜ ๋…ธ์ถœ๋˜์–ด์žˆ๋Š”์ง€์— ๋”ฐ๋ผ ๋™์ž‘ ์—ฌ๋ถ€ ์„ค์ • ๊ฐ€๋Šฅ
  • observe๋ฅผ ์ด์šฉํ•ด ํƒ€๊ฒŸ ์š”์†Œ ์ง€์ •์ด ๊ฐ€๋Šฅํ•˜๊ณ , unobserve๋ฅผ ์ด์šฉํ•ด ํƒ€๊ฒŸ ์š”์†Œ ์ง€์ • ํ•ด์ œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค
let options = {
  root: document.querySelector('#scrollArea'),
  rootMargin: '0px',
  threshold: 1.0
}

let observer = new IntersectionObserver(callback, options);

Comment

Scroll Event์™€ Intersection Observer์˜ ์ฐจ์ด๋ฅผ ์ •ํ™•ํžˆ ์•Œ๊ณ 
์ƒํ™ฉ๋งˆ๋‹ค ์œ ์—ฐํ•˜๊ฒŒ ์ ์šฉํ•ด์•ผํ•จ์ด ์ค‘์š”ํ•จ์„ ๋ฐฐ์› ๋‹ค.
๋‚˜์˜ ์‚ฌ์ง„๋“ค์„ ์ด์šฉํ•ด์„œ ํ˜ผ์ž ํž˜์œผ๋กœ ์‹ค์Šต์„ ์ง„ํ–‰ํ•ด๋ด์•ผ๊ฒ ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์˜ค๋Š˜์€ ๊ฐ•์˜๋ฅผ ๋“ค์œผ๋ฉด์„œ ๋†“์นœ ๋ถ€๋ถ„์ด ์—†๋„๋ก ์„ธ์„ธํ•˜๊ฒŒ ๋…ธ์…˜์— ์ •๋ฆฌํ•˜๋ฉด์„œ ๋„˜์–ด๊ฐ”๋‹ค.
์ด์ „์—๋Š” ๊ฐ•์˜๋ฅผ ํ•œ๋ฒˆ ์ญ‰ ๋“ค์€ ๋‹ค์Œ์— ์ดํ•ด๊ฐ€ ๊ฐ€์ง€์•Š๋Š” ๋ถ€๋ถ„์„ ํ•œ๋ฒˆ ๋” ๋ณด๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ณต๋ถ€ํ–ˆ์—ˆ๋Š”๋ฐ ๋‘๊ฐ€์ง€ ๋ฐฉ์‹ ๋ชจ๋‘ ์žฅ๋‹จ์ ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.
์ „์ž์˜ ๊ฒฝ์šฐ ์‹œ๊ฐ„์€ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ์ง€๋งŒ, ๋‚ด๊ฐ€ ํ™•์‹คํžˆ ์ดํ•ดํ•˜์ง€๋ชปํ•œ ๋ถ€๋ถ„์„ ์ •ํ™•ํžˆ ์งš๊ณ  ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.
ํ›„์ž์˜ ๊ฒฝ์šฐ๋Š” ๋ฐ˜๋ณตํ•ด์„œ ๋ณด๋‹ค๋ณด๋‹ˆ ์ดํ•ด๊ฐ€ ์ž˜ ๊ฐ€๊ธดํ•˜์ง€๋งŒ, ์ฒซ๋ฒˆ์งธ ๋ณผ ๋•Œ ์ข€ ์ง‘์ค‘์„ ๋œํ•˜๋Š” ๊ฒƒ ๊ฐ™์€ ๋Š๋‚Œ์ด๋‹ค.
์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ•ด๋ณด๋ฉด์„œ ๋‚˜์—๊ฒŒ ๊ผญ ๋งž๋Š” ๊ณต๋ถ€๋ฒ•์„ ์ฐพ์•„๋ด์•ผ๊ฒ ๋‹ค.

์•„ ๊ทธ๋ฆฌ๊ณ  TMI์ง€๋งŒ ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ  ์†Œํ™”ํ•˜๋Š”๋ฐ ๋ชจ๋“  ์‹œ๊ฐ„์„ ์Ÿ๋‹ค๋ณด๋‹ˆ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด์— ์†Œํ™€ํ•ด์กŒ๋‹คใ… ใ… ใ… 
๊ทธ๋ž˜์„œ, ์นœ๊ตฌ๋ž‘ ๋‚ด์ผ๋ถ€ํ„ฐ 1์ผ 1์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€๊ธฐ๋ฅผ ์‹ค์ฒœํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.
๊ณต๊ฐœ์ ์œผ๋กœ ๋งํ•จ์œผ๋กœ์จ ๋‚˜์˜ ์˜์ง€๋ฅผ ๋ถˆํƒœ์›Œ ๋ณผ ์ƒ๊ฐ์ด๋‹ค!!!!๐Ÿ”ฅ๐Ÿ”ฅ๐Ÿ”ฅ


์ฐธ๊ณ  ์‚ฌ์ดํŠธ

profile
์ธ์ƒ์€ ์šฉ๊ธฐ์˜ ์–‘์— ๋”ฐ๋ผ ์ค„์–ด๋“ค๊ฑฐ๋‚˜, ๋Š˜์–ด๋‚œ๋‹ค

0๊ฐœ์˜ ๋Œ“๊ธ€