๐Ÿ’์ž๋‘ ์บ˜๋ฆฐ๋” ํ”„๋กœ์ ํŠธ ํ›„๊ธฐ

Kyung yup Leeยท2021๋…„ 6์›” 28์ผ
2

์‹œ์—ฐ์˜์ƒ : https://www.youtube.com/watch?v=tlWO8ZRHJQw

๊ธฐํš

๋๋‚œ์ง€ 1์ฃผ์ผ๋„ ์•ˆ์ง€๋‚ฌ๋Š”๋ฐ ๋ฒŒ์จ ๊ธฐ์–ต์ด ์ž˜ ์•ˆ๋‚œ๋‹ค. ์–ผ๋ฅธ ์ •๋ฆฌ๋ฅผ ํ•ด๋‘ฌ์•ผ ๋  ๊ฒƒ ๊ฐ™๋‹ค. ์ข‹์€ ํ”„๋กœ์ ํŠธ๋ผ๋Š” ํ‰์„ ๋ฐ›์•„์„œ ๊ธฐ์–ต์— ๋‚จ๋Š” ํ”„๋กœ์ ํŠธ๊ธฐ๋„ ํ–ˆ๊ณ , ์ค‘๊ฐ„์— ๊ฝค ๋‚ด ๊ฐœ๋ฐœ์ž์ƒ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ๋งŒํ•œ ๋ง๋„ ๋“ค์—ˆ๋˜ ํ”„๋กœ์ ํŠธ๋ผ ๊ผญ ์ •๋ฆฌ๋ฅผ ํ•ด์•ผ๋œ๋‹ค.

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

๋ฌธ์ œ ํ™•์ธ

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

๋˜ํ•œ ๋ฌธ์ œ๋Š” ์•„๋‹ˆ์ง€๋งŒ ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ ์—†์ด ์ˆœ์ˆ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ web api ๋กœ๋งŒ ๊ตฌ์„ฑํ•ด์•ผํ•˜๋Š” ์ œํ•œ์ด ์žˆ์—ˆ๋‹ค.

์—ญํ•  ํ™•์ธ ๋ฐ ๋ถ„๋ฐฐ

๊ธฐํšํ•œ ์บ˜๋ฆฐ๋”๋Š” ์ฃผ์š”ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•ด์•ผ ํ—€๋˜ ๊ธฐ๋Šฅ๋“ค์ด ์žˆ์—ˆ๋‹ค.
1. ๋ฌดํ•œ์Šคํฌ๋กค & ํ˜„์žฌ active ํ•œ ์›” ๊ฐ์ง€
2. ์š”์†Œ ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ์œผ๋กœ ์ด๋™
3. ์š”์†Œ ์ถ”๊ฐ€ ์ œ๊ฑฐ ๋ฐ DOM ์กฐ์ž‘

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๋ฌดํ•œ์Šคํฌ๋กค๊ณผ ํ˜„์žฌ ์•กํ‹ฐ๋ธŒ ์›” ๊ฐ์ง€ ๊ธฐ๋Šฅ์„ ๋งก์•„์„œ ๊ตฌํ˜„ํ–ˆ๋‹ค. ๋˜ํ•œ ๊ฒธ์‚ฌ๊ฒธ์‚ฌ ๋‹ฌ๋ ฅ์˜ DOM ์„ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๋ถ€๋ถ„๋„ ๊ฐ™์ด ๋งก์•˜๋‹ค.
๋ถ€์ฐจ์ ์ธ ๊ธฐ๋Šฅ์œผ๋กœ ์ƒ๊ฐํ•ด์„œ ๊ธˆ๋ฐฉ ๋๋‚  ์ค„ ์•Œ์•˜๋Š”๋ฐ ๋‹ฌ๋ ฅ์„ ๋งŒ๋“ค ๋•Œ ๋ฉ˜ํƒˆ์ด ๋” ํ„ฐ์กŒ๋‹ค.

๋ฌดํ•œ์Šคํฌ๋กค

๋ฌดํ•œ์Šคํฌ๋กค์„ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ์ฒ˜์Œ์œผ๋กœ ํ•œ ๊ณ ๋ฏผ์€ ๊ณผ์—ฐ ์ด ๋งค์›” ๋งค์›”์„ ์ƒํƒœ๋กœ ๊ด€๋ฆฌํ•˜์—ฌ, ์ƒˆ๋กœ์šด ์›”์ด ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค ์žฌ๋ Œ๋”๋ง์„ ํ•ด์ค„ ๊ฒƒ์ธ๊ฐ€, ์•„๋‹ˆ๋ฉด DOM ํŠธ๋ฆฌ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์ƒˆ๋กœ์šด ์›”์„ ์ด์–ด ๋ถ™์ผ ๊ฒƒ์ธ๊ฐ€์˜€๋‹ค. ๋ฆฌ์•กํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค๋ฉด ๊ณ ๋ฏผ๋„ ํ•˜์ง€ ์•Š๊ณ , ์ „์ž๋ฅผ ์„ ํƒํ–ˆ์„ ๊ฒƒ์ด๋‹ค. ํ”„๋กœ๊ทธ๋žจ์˜ ๋ณต์žก๋„๋ฅผ ๋Œ€ํญ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฐ”๋‹๋ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋งŒ์„ ์‚ฌ์šฉํ•ด์•ผ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณ ๋ฏผ์ด ๋˜์—ˆ๋‹ค.

์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์ด ์ƒํƒœ๋ฅผ ํ†ตํ•ด ์ƒํƒœ ๋ณ€๊ฒฝ์ด ์žˆ์„ ๋•Œ๋งˆ๋‹ค ์žฌ๋ Œ๋”๋ง์„ ํ•ด์ฃผ๋ฉด ์ฝ”๋“œ๋ฅผ ๊ฐ„๋žตํ•˜๊ฒŒ ์งค ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ํ”„๋กœ๊ทธ๋žจ์˜ ๋ณต์žก๋„ ๋˜ํ•œ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ, ์žฌ๋ Œ๋”๋ง์ด๋ผ๋Š” ๊ฒƒ์€ ํ™”๋ฉด์˜ ๋ชจ๋“  DOM ํŠธ๋ฆฌ๋ฅผ ๋‹ค์‹œ ๊ทธ๋ฆฐ๋‹ค๋Š” ๋œป์ด๊ณ , ์ด ๊ณผ์ •์€ ํ”„๋กœ๊ทธ๋žจ์— ๋ถ€ํ•˜๋ฅผ ๋งŽ์ด ์ฃผ๋Š” ์ž‘์—…์ด๋‹ค. ๋•Œ๋ฌธ์—, ์ด ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•ด ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•  ๋•Œ๋Š” ์‹ ์ค‘ํ•˜๊ฒŒ ํ•ด์•ผํ•œ๋‹ค.

ํ™•์‹คํžˆ DOM ์š”์†Œ์— ์ด์–ด ๋ถ™์ด๋Š” ๋ฐฉ์‹์€ ์ฝ”๋“œ์˜ ๋ณต์žก๋„๋ฅผ ์—„์ฒญ๋‚˜๊ฒŒ ๋†’ํžˆ๊ณ , ์ดํ•ด๋ฅผ ํž˜๋“ค๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค. ๋˜ํ•œ ์œ ์ง€๋ณด์ˆ˜์—๋„ ๋ถˆ๋ฆฌํ•ด ๋ณด์˜€๋‹ค.

ํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ DOM ์„ ๋งŒ๋“ค์–ด๋‚ผ์ง€ ๋ชจ๋ฅด๋Š” ์ƒํƒœ์—์„œ ๋ฌด์ž‘์ • ๋ชจ๋“  ๋งŒ๋“ค์–ด์ง€๋Š” DOMํŠธ๋ฆฌ๋ฅผ ์žฌ๋ Œ๋”๋ง ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์‚ฌ์šฉ์„ฑ์„ ์ €ํ•˜์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

์ƒํƒœ๋ฅผ ํ†ตํ•œ ๋ฆฌ๋ Œ๋”๋ง

// theudo code
renderedCalendar.map(month => render(month));

DOM ํŠธ๋ฆฌ ์œ ์ง€ ์ฝ”๋“œ

// theudo code
const $calendar = document.querySelector('.calendar');
const todayMonth = () => {
  $calendar.innerHTML = `์ด๋ฒˆ ์›” DOM ํŠธ๋ฆฌ`
}
  
const prevMonth = () =>{
  $calendar.insertAdjacentHTML('afterbegin', `์ด์ „ ๋‹ฌ DOM ํŠธ๋ฆฌ`)
}

const nextMonth = () => {
  $calendar.insertAdjacentHTML('beforeend', `๋‹ค์Œ ๋‹ฌ DOM ํŠธ๋ฆฌ`)
}

๊ฐ„๋‹จํ•˜๊ฒŒ๋งŒ ๋ด๋„ DOM ํŠธ๋ฆฌ์— ์œ„ ์•„๋ž˜๋กœ ์ด์–ด ๋ถ™์ด๋Š” ์ฝ”๋“œ๋Š” ์ˆ˜๋„ ์ฝ”๋“œ์ธ๋ฐ๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ณต์žกํ•ด ๋ณด์ธ๋‹ค.

๊ฒฐ๋ก 

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

์ด๋ฅผ ํ†ตํ•ด ์žฌ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚  ๊ฒฝ์šฐ์—๋„ ์ด์ „ ์ƒํƒœ๋ฅผ ๊ธฐ์–ตํ•ด, ํ™”๋ฉด์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค.

์‹œ์•ˆ์ 

์บ˜๋ฆฐ๋”๋ฅผ DOM ํŠธ๋ฆฌ๋กœ ๊ตฌ์„ฑํ•˜๋‹ˆ ์ฝ”๋“œ๊ฐ€ ์–ด๋งˆ์–ด๋งˆํ•˜๊ฒŒ ์ปค์ง€๊ณ  ๋ณต์žกํ•ด์กŒ๋‹ค. ์ค‘๋ณต์„ ์ค„์ธ๋‹ค๊ณ  ์ค„์˜€์ง€๋งŒ, ๋‚ด๊ฐ€ ์ž‘์„ฑํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ for๋ฌธ์„ ์‚ฌ์šฉํ•ด์•ผ๋งŒ ํ•˜๊ณ , ๋˜ํ•œ ์ด for๋ฌธ ๋งˆ๋‹ค ์กฐ๊ธˆ ์กฐ๊ธˆ์”ฉ ์ฐจ์ด๊ฐ€ ์žˆ์–ด, ์ค‘๋ณต์„ ์ค„์ด๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š์•˜๋‹ค. DOM ํŠธ๋ฆฌ๋กœ๋งŒ ํ™”๋ฉด ์กฐ์ž‘์„ ํ•˜๋ ค๊ณ  ํ•˜๋‹ˆ ์‰ฌ์šด ์ผ์ด ์•„๋‹ˆ์—ˆ๋‹ค.

๋˜ํ•œ ์บ˜๋ฆฐ๋”๊ฐ€ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ๋งŽ์€ ์Šคํฌ๋กค์„ ์˜ฌ๋ฆฌ๊ฑฐ๋‚˜ ๋‚ด๋ฆฐ ํ›„ ํ˜„์žฌ ์ž‘์—…์ค‘์ธ ์›”์„ ๊ธฐ์–ตํ•ด์„œ ์žฌ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚˜๋„ ๊ทธ ์ž๋ฆฌ์—์„œ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ–ˆ๋‹ค. ์ด๋Š” ์‚ฌ์šฉ์„ฑ์„ ๋–จ์–ด๋œจ๋ฆฌ๋Š” ๋ฌธ์ œ์˜€๋‹ค.

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

์‹ค์ œ ๊ตฌํ˜„

์˜ˆ์ œ ์ฝ”๋“œ (๋ฌดํ•œ ์Šคํฌ๋กค)

ํŠน์ • ์›”์˜ ๋งˆ์ง€๋ง‰์ผ ๊ฒฝ์šฐ ๋‹ค์Œ ์›”์„ ์ถ”๊ฐ€ํ•ด์ฃผ๋Š” ์ฝ”๋“œ

document.addEventListener('scroll', () =>{
    if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight) {
	// ํŠน์ • ์ž‘์—…
      } 
})

๋ฌธ์ œ์ 

  1. ์Šคํฌ๋กค ์ด๋ฒคํŠธ๊ฐ€ ์—„์ฒญ๋‚˜๊ฒŒ ๋ฐœ์ƒ
  2. ์˜ˆ์ œ๋Š” ์ „์ฒด ํ™”๋ฉด์„ ๊ธฐ์ค€์œผ๋กœ ํ•˜์ง€๋งŒ, ๋‚˜์˜ ๊ฒฝ์šฐ๋Š” ํŠน์ • DOM ์š”์†Œ ์•ˆ์—์„œ๋งŒ ์ž‘๋™ํ•ด์•ผ ํ•จ.

ํ•ด๊ฒฐ

  1. ์Šคํฌ๋กค ์ด๋ฒคํŠธ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์€ ์Šค๋กœํ‹€์„ ์ด์šฉํ•ด์„œ ํ•ด๊ฒฐํ–ˆ๋‹ค.
  const throttling = (() => {
    let throttleCheck;
    return {
      throttle(callback, milliseconds) {
        if (!throttleCheck) {
          throttleCheck = setTimeout(() => {
            callback();
            throttleCheck = false;
          }, milliseconds);
        }
      }
    };
  })();
  1. ์บ˜๋ฆฐ๋” ์•ˆ์—์„œ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ๋˜๋Š” ๋ฌธ์ œ๋Š” DOM ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๊ธฐ์ค€์„ ์ด์šฉํ•ด์„œ ํ•ด๊ฒฐ

scroll ์ด๋ฒคํŠธ๋ฅผ ์•ˆ์—์„œ ์‚ฌ์šฉํ•ด์•ผ๋˜์„œ window.innerHeight, scrollY ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•จ

$calendarGrid.onscroll = () =>{
    if($calendarGrid.scrollTop < 1){
        changePrevMonth();
    if ($calendarGrid.scrollHeight - Math.ceil($calendarGrid.scrollTop) 
        === $calendarGrid.clientHeight) {
        changeNextMonth();
    }
}

์œ„์™€ ๊ฐ™์ด ๋ณ€ํ˜•ํ•ด์„œ ์‚ฌ์šฉํ–ˆ๋‹ค.

์•„๋ž˜๋กœ๋Š” ๋ฌดํ•œ์Šคํฌ๋กค์ด ๋˜๋Š”๋ฐ, ์œ„๋กœ ์•ˆ๋˜๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ
-> ์Šคํฌ๋กคTop์„ 1๋ฏธ๋งŒ์œผ๋กœ ๋ฐ”๊พธ๊ณ , ์œ„์— ๋ถ€๋”ชํž๋•Œ๋งˆ๋‹ค top=1 ๋กœ ๋ฐ”๊ฟ”์ฃผ์–ด์„œ ๋ฆฌํ”„๋ ˆ์‹œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋ณ€๊ฒฝ
-> top ์ด 1์ผ ๊ฒฝ์šฐ ์—ฐ์†์œผ๋กœ ์Šคํฌ๋กค๋ง ํ•˜๋ฉด ์ ์šฉ์•ˆ๋˜๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ
-> top์„ 300 ์œผ๋กœ ๋ณ€๊ฒฝ

$calendar.onscroll = () =>{
    throttling.throttle(()=>{
        if($calendar.scrollTop < 200){
            changePrevMonth();
            $calendar.scrollTop = 500;
            const $standards = document.querySelectorAll('.standard');
            [...$standards].forEach($standard => {
                io.observe($standard);
            })
        }
        if ($calendar.scrollHeight - Math.ceil($calendar.scrollTop) <= $calendar.clientHeight) {
            changeNextMonth();
            const $standards = document.querySelectorAll('.standard');
            [...$standards].forEach($standard => {
                io.observe($standard);
            })
        }
    }, 500);
};

์ธํ„ฐ์„น์…˜ ์˜ต์ €๋ฒ„

ํŠน์ • ์ผ์ž๊ฐ€ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚˜๋Š”์ง€ ๊ฐ์ง€ํ•ด์„œ, ๋‹ค๋ฅธ ๋”์š”์†Œ์˜ ํ…์ŠคํŠธ ๊ฐ’์„ ๋ฐ”๊ฟ”์ฃผ์–ด์•ผ ํ–ˆ๋‹ค.

์ด ๋ถ€๋ถ„์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ธํ„ฐ์„น์…˜ ์˜ต์ €๋ฒ„๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

const io = new IntersectionObserver(entries =>{
    entries.forEach(entry => {
        if(entry.isIntersecting){
            $calendarYear.textContent = entry.target.children[0].children[0].textContent + ".";
            $calendarMonth.textContent = entry.target.children[0].children[1].textContent + ".";
        }
    } );
}, {
    root:$calendar,
    rootMargin: '0px 0px -50% 0px'
});

$calendar.onscroll = () =>{
        if($calendar.scrollTop < 1){
            changePrevMonth();
            $calendar.scrollTop = 640;
            const $standards = document.querySelectorAll('.standard');
            [...$standards].forEach($standard => {
                io.observe($standard);
            })
        }
        if ($calendar.scrollHeight - Math.ceil($calendar.scrollTop) <= $calendar.clientHeight) {
            changeNextMonth();
            const $standards = document.querySelectorAll('.standard');
            [...$standards].forEach($standard => {
                io.observe($standard);
            })
        }
    }, 500);
};

์ธํ„ฐ์„น์…˜ ์˜ต์ €๋ฒ„๋Š” ํŠน์ • ์š”์†Œ๊ฐ€ ๊ธฐ์ค€์ ์œผ๋กœ ์žก๋Š” ์š”์†Œ์˜ ์™ธ๊ณฝ์„ ๊ต์ฐจํ•จ์œผ๋กœ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚  ๋•Œ๋ฅผ ๊ฐ์ง€ํ•ด์ฃผ๋Š” ๊ฐ์ฒด์ด๋‹ค.

์ด ๊ธฐ๋Šฅ์„ ์ด์šฉํ•ด ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ๋ฉ”์ธ์˜ ๋…„์›”์„ ๋ Œ๋”๋งํ•ด์ฃผ๋Š” ๊ฒƒ๊ณผ, ํ˜„์žฌ ๋ณด์—ฌ์ง€๋Š” ์›”๋งŒ activeํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

๋‹ฌ๋ ฅ์—์„œ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ์š”๊ตฌ์‚ฌํ•ญ ์ค‘ ํ•˜๋‚˜๊ฐ€ ํ˜„์žฌ ๋…„์›”์— ํ•ด๋‹น ํ•˜๋Š” ๋‹ฌ๋งŒ ACTIVE ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ์ƒ‰๊น”์„ ๋‹ค๋ฅด๊ฒŒ ํ•ด์„œ ๊ตฌ๋ถ„ํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.

์ด ๋ถ€๋ถ„์„ ๊ฐ„๋‹จํ•˜๊ฒŒ, standard ํด๋ž˜์Šค๋ฅผ ๋งค์›” 1์ผ์— ์ฃผ๊ณ  ์ธํ„ฐ์„น์…˜ ์˜ต์ €๋ฒ„์˜ ๊ฐ์ง€ ๋ถ€๋ถ„์„ ์ง€๋‚˜๊ฐˆ ๋•Œ ๋งˆ๋‹ค ๋…„์›”์„ ๋ฐ”๊พธ๋Š” ๋™์‹œ์— ํ•ด๋‹น ์›” ๋ถ€๋ถ„๋งŒ active ํ•˜๊ฒŒ ๋งŒ๋“ค๋ ค๊ณ  ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋งค์›” 1์ผ์„ ๊ธฐ์ค€์œผ๋กœ ํ•ด์„œ ์ธํ„ฐ์„น์…˜ ์˜ต์ €๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด, ๊ต์ฐจํ•˜๋Š” ์‹œ์ ์—์„œ ์›”์ด ๋ฐ”๋€Œ๊ธฐ ๋•Œ๋ฌธ์—, ํ™”๋ฉด์—์„œ ๋ณด์ด๊ณ  ์žˆ๋Š” ์‹ค์งˆ์ ์ธ ์›”๊ณผ ๋ Œ๋”๋ง๋˜๋Š” ์›”์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ 15์ผ์— ์ฃผ๊ณ  ์•ž ๋’ค๋กœ unactive๋ฅผ ์ฃผ์—ˆ๋Š”๋ฐ, ์ด ๋•Œ๋Š” todo๋‚˜ ์š”์†Œ๊ฐ€ ๊ณผํ•˜๊ฒŒ ๋“ค์–ด๊ฐ€์„œ ํ™”๋ฉด์— ํ•œ ์ฃผ๋งŒ ํ‘œ์‹œ๋  ๊ฒฝ์šฐ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ชจ๋“  ์ฃผ์— standard ํด๋ž˜์Šค๋ฅผ ์ฃผ๊ณ  ๋ฐ˜๋“œ์‹œ ํ•œ ์ฃผ๋Š” intersection observer์— ๊ฐ์ง€๋˜๋„๋ก ๋งŒ๋“ค์–ด์•ผ ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด intersection observer์— ๊ฐ์ง€๋˜๋Š” ํƒ€๊ฒŸ์ด ์›”์— 1ํšŒ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ณ„์‚ฐ์ด ๋งค์šฐ ๋ณต์žกํ•ด์ง„๋‹ค. ๋งค์ฃผ ๊ฐ์ง€๋˜๋Š” ์ผ์ž์˜ 1์ผ๊นŒ์ง€ ๋‚จ์€ ์ˆ˜์™€, ๋ง์ผ ๊นŒ์ง€ ๋‚จ์€ ์ผ์ž์˜ ์ˆซ์ž๋ฅผ ๊ณ„์‚ฐํ•ด ์•กํ‹ฐ๋ธŒ๋กœ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค.

์ฐ ํ›„๊ธฐ

๋‚˜๋Š” ๊ฑฐ์˜ ํ•ญ์ƒ ์ฝ”๋“œ๋ฅผ ํ˜ผ์ž์„œ๋งŒ ์งฐ์—ˆ๊ณ , ํŒ€ํ”Œ์„ ํ•ด๋„ ํ”„๋ก ํŠธ, ๋ฐฑ ์ด๋ ‡๊ฒŒ ๋‚˜๋ˆ ์„œ ์ž‘์—…์„ ํ–ˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋‚ด ์ฝ”๋“œ๋ฅผ ๋ˆ„๊ตฐ๊ฐ€ ์“ด๋‹ค๋Š” ๊ฑด ์ƒ๊ฐ๋„ ํ•ด๋ณธ ์ ์ด ์—†์—ˆ๋‹ค.

์ˆ˜์š”์ผ ์˜คํ›„์— ํŒ€์› ํ•œ ๋ช…์ด ๋‚ด ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ํ–ˆ๋‹ค. ๋‚ด๊ฐ€ ๋‹ฌ๋ ฅ์„ ๊ตฌํ˜„ํ•œ ๋ถ€๋ถ„์—์„œ ๋‹ฌ๋ ฅ ์ „์ฒด๋ฅผ ๋ Œ๋”๋ง ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ, ์ด ๋ถ€๋ถ„์ด ํ•„์š”ํ–ˆ๋˜ ๊ฒƒ์ด๋‹ค. ๋‹น์—ฐํžˆ ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„์˜€๊ณ , ๋‚˜๋„ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์“ธ ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ๋ง‰์—ฐํ•˜๊ฒŒ๋งŒ ์ƒ๊ฐํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ ๋ง์„ ๋“ฃ๊ณ , ๊ทธ ์‚ฌ๋žŒ์ด ๋‚ด ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ๋‹ค ์“ฐ๋Š” ๊ฒƒ์ด ํ˜„์‹ค์ด ๋˜์—ˆ์„ ๋• ๊ทธ ๋ฌด๊ฒŒ๊ฐ€ ๋‹ฌ๋ž๋‹ค.

๋‚ด ์ฝ”๋“œ๋Š” 1000์ค„์ด ๋„˜์–ด๊ฐ”๊ณ , ๋ณ€์ˆ˜๋ช…์— ๋Œ€ํ•œ ์˜๋ฏธ๋„ ์ œ๋Œ€๋กœ ์„ค์ •ํ•ด๋†“์ง€ ๋ชปํ•œ ์ƒํƒœ์˜€๋‹ค. ์•„๋‹ˆ, ๊ธฐ์–ต์ด ์ •ํ™•ํ•˜๊ฒŒ ์•ˆ ๋‚ฌ๋‹ค๋Š” ๊ฒŒ ์ •ํ™•ํ•˜๊ฒ ๋‹ค. ๋ง‰๋ง๋กœ ์ฝ”๋“œ๋ฅผ ์‹ธ์งˆ๋Ÿฌ๋†“์€ ์ƒํƒœ์˜€๋‹ค.

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

์ตœ๋Œ€ํ•œ ์˜๋ฏธ์ ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ํ•จ์ˆ˜๋ฅผ ์—ฐ์‡„ํ˜ธ์ถœํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋„๋ก ํ–ˆ๋‹ค. ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์€ ์ตœ๋Œ€ํ•œ ์ž์ œํ–ˆ๋‹ค. ๋‚˜๋„ ์ด ์ธ์ˆ˜๊ฐ€ ๋ญ”์ง€ ๋‚˜์ค‘์— ๋ชจ๋ฅผ ๊ฒƒ ๊ฐ™์•˜๋‹ค.

์ฒ˜์Œ์œผ๋กœ ์ฑ…์ž„๊ฐ์žˆ๊ฒŒ ์ฝ”๋“œ๋ฅผ ์งœ์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์‹ค๊ฐํ–ˆ๋‹ค.

profile
์„ฑ์žฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž

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