ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๋ฌธ์ œ

 

offsetTop, scrollTop, clientHeight์˜ ์ƒ๊ด€๊ด€๊ณ„๋ฅผ ํ†ตํ•ด ์Šคํฌ๋กค์„ ๋‚ด๋ฆฌ๋ฉด์„œ ๋‚˜์˜ค๋Š” ์ˆซ์ž๊ฐ€ ์ƒ๋‹จ ๋ฉ”๋‰ด์— ํ™œ์„ฑํ™”๋œ ์ˆซ์ž์™€ ์ผ์น˜ํ•˜๋„๋ก ๊ตฌํ˜„

 

๋ฌธ์ œํ•ด๊ฒฐ

const navElem = document.querySelector("#nav");
const navItems = Array.from(navElem.children);
const contentsElem = document.querySelector("#contents");
const contentItems = Array.from(contentsElem.children);
const offsetTops = contentItems.map((elem) => {
  const [ofs, clh] = [elem.offsetTop, elem.clientHeight];
  return [ofs - clh / 2, ofs + clh / 2];
  // return [ofs, ofs + clh]
});
window.addEventListener("scroll", (e) => {
  const { scrollTop } = e.target.scrollingElement;
  const targetIndex = offsetTops.findIndex(([from, to]) => (
    scrollTop >= from && scrollTop < to
  ))
  navItems.forEach((item, index) => {
    if(index !== targetIndex) {
      item.classList.remove('on');
    } 
    else item.classList.add('on');
  })
});

 

Issue

  1. ๋ฐ˜๋ณต๋˜๋Š” ์š”์†Œ ๋…ธ๋“œ๋ฅผ ์ทจ๋“ํ•  ๋•Œ, ๋ถ€๋ชจ ์š”์†Œ ๋…ธ๋“œ.children์„ ํ†ตํ•ด ๋ชจ๋“  ์ž์‹ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์ด๋ฅผ Array.from() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด 

      ๋ฐฐ์—ด ์ง‘ํ•ฉ์— ์ ์žฌํ•˜์˜€๋‹ค.

      ์ดํ›„ ์ฝ”๋“œ ์ƒ์—์„œ map(), forEach() ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋™์  ์ฒ˜๋ฆฌ๋ฅผ ์œ ๋™์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

   2. ํŽ˜์ด์ง€์™€ ํŽ˜์ด์ง€ ์‚ฌ์ด ๊ฐ„์— ๋ฒ”์œ„ ๋™์•ˆ ์ƒ๋‹จ ๋ฉ”๋‰ด์˜ ์ˆซ์ž๋ฅผ ํ™œ์„ฑํ™”์‹œ์ผœ ์ฃผ๊ธฐ ์œ„ํ•ด offsetTop๊ณผ clientHeight์˜ ์ƒ๊ด€ ๊ด€๊ณ„๋ฅผ ์ด์šฉ

       ํ•˜์—ฌ ๊ทธ ๋ฒ”์œ„์˜ ๊ฐ’์„ ์ถ”๋ ค ๋ƒˆ๋‹ค. 

 

  • offsetTop: ์ƒ๋Œ€์ ์œผ๋กœ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์œ„์น˜์— ์žˆ๋Š” ์ƒ์œ„ ์š”์†Œ์˜ ๋งจ ์œ„์—์„œ๋ถ€ํ„ฐ์˜ ํ”ฝ์…€ ์ˆ˜
  • clientHeight: ๋‚ด๋ถ€ ์—ฌ๋ฐฑ(padding)์„ ํฌํ•จ ํ•œ ์—˜๋ฆฌ๋จผํŠธ์˜ ๋‚ด๋ถ€ ๋†’์ด๋ฅผ ํ”ฝ์…€๋กœ ๋ฐ˜ํ™˜

    3. ํ˜„์žฌ ์Šคํฌ๋กค ๋ฐ”์˜ ์œ„์น˜๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด element.scrollingElement์˜ ํ”„๋กœํผํ‹ฐ scrollTop์„ ๋””์ŠคํŠธ๋Ÿญ์ณ๋ง 

 

    4. ํ˜„์žฌ ์Šคํฌ๋กค ๋ฐ”์˜ ์œ„์น˜์™€ ํ•ด๋‹น ๋™์  ํšจ๊ณผ๊ฐ€ ์ ์šฉ ๋  ๋ฒ”์œ„๋ฅผ ๋น„๊ต ๋ฐ ์ธ๋ฑ์Šค๋ฅผ ์‹๋ณ„ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด Array.findIndex() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉ

        ํ•˜์—ฌ ์‹œ์ž‘๊ณผ ๋์˜ ๋ฒ”์œ„ ๊ฐ’ ๋‚ด์— ์Šคํฌ๋กค ๋ฐ”์˜ ํ˜„์žฌ ์œ„์น˜๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด ํ•ด๋‹น ํŽ˜์ด์ง€์˜ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜

๋Œ“๊ธ€
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
TAG
more
ยซ   2025/02   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
๊ธ€ ๋ณด๊ด€ํ•จ