8. ์บ”๋ฒ„์Šค ๐ŸŽจ

EEuglenaยท2023๋…„ 8์›” 2์ผ
0

JavaScript30

๋ชฉ๋ก ๋ณด๊ธฐ
9/27
post-thumbnail

๋ชฉํ‘œ

์บ”๋ฒ„์Šค๋ฅผ ๋งŒ๋“ค์–ด ๊ทธ๋ฆผ์„ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๊ฒŒ ํ•ด๋ณด์ž.

๋ ˆ์ด์•„์›ƒ ๋งŒ๋“ค๊ธฐ

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

์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ

์บ”๋ฒ„์Šค๋Š” ๋‹ค๋ค„๋ณธ ์ ์ด ์—†์–ด์„œ ๊ฐ•์˜ ์ฝ”๋“œ๋ฅผ ๊ฑฐ์˜ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ผ ์ž‘์„ฑํ•˜๊ณ  ํ•˜๋‚˜์”ฉ ์ˆ˜์ •ํ•ด๊ฐ”๋‹ค.

์บ”๋ฒ„์Šค์˜ ํฌ๊ธฐ์™€ ๋ผ์ธ์˜ ์†์„ฑ์„ ์„ค์ •ํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค. ํ™”๋ฉด ํฌ๊ธฐ๊ฐ€ ๋ณ€ํ•  ๋•Œ ์บ”๋ฒ„์Šค ํฌ๊ธฐ๋„ ๋ฐ”๋€Œ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌํ–ˆ๋‹ค.

๋งˆ์šฐ์Šค๊ฐ€ ์›€์ง์ด๋ฉด mousemove ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋•Œ ๋งˆ์šฐ์Šค๊ฐ€ ํด๋ฆญ๋œ ์ƒํƒœ๋ผ๋ฉด context๋ฅผ ์ด์šฉํ•ด ์บ”๋ฒ„์Šค์— ๊ทธ๋ฆผ์„ ๊ทธ๋ฆฐ๋‹ค. moveTo๋Š” ์ด์ „์— ์ €์žฅ๋œ ๋งˆ์šฐ์Šค์˜ ์œ„์น˜๋กœ ์‹œ์ž‘์ ์„ ๋‚˜ํƒ€๋‚ด๊ณ , lineTo๋Š” ์ƒˆ๋กœ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ์˜ ๋งˆ์šฐ์Šค ์œ„์น˜๋กœ ๋„์ฐฉ์ ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

์บ”๋ฒ„์Šค์—๋Š” mousedown, mouseup, mouseout, mousemove ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋“ฑ๋กํ–ˆ๋‹ค. ํด๋ฆญํ–ˆ์„ ๋•Œ ๊ทธ๋ฆฌ๊ธฐ๋ฅผ ์‹œ์ž‘ํ•˜๊ณ , ์›€์ง์ด๋Š” ๋™์•ˆ ๋ผ์ธ์„ ๊ทธ๋ฆฌ๋‹ค๊ฐ€ ํด๋ฆญ์ด ๋๋‚˜๊ฑฐ๋‚˜ ๋งˆ์šฐ์Šค๊ฐ€ ์บ”๋ฒ„์Šค๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ๊ทธ๋ฆฌ๊ธฐ๋ฅผ ์ข…๋ฃŒํ•œ๋‹ค.

window์—๋Š” resize์™€ mousemove ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋“ฑ๋กํ–ˆ๋‹ค. ํ™”๋ฉด ํฌ๊ธฐ๊ฐ€ ์กฐ์ •๋˜๋Š” ๊ฒƒ์— ๋งž์ถฐ ์บ”๋ฒ„์Šค์˜ ํฌ๊ธฐ๋ฅผ ์กฐ์ ˆํ•˜๋Š” ๊ธฐ๋Šฅ๊ณผ ๋งˆ์šฐ์Šค๊ฐ€ ํ™”๋ฉด ์•„๋ž˜๋กœ ์ด๋™ํ•˜๋ฉด ํˆด๋ฐ”๋ฅผ ๋„์›Œ์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

ํˆด๋ฐ”์—๋Š” ์„ ์˜ ์ƒ‰๊ณผ ๋‘๊ป˜๋ฅผ ๋ฐ”๊พธ๋Š” ๊ธฐ๋Šฅ, ํ™”๋ฉด์„ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค. ํ™”๋ฉด ์ดˆ๊ธฐํ™”๋Š” ์ด์ „์— ๋งŒ๋“  ๋ฆฌ์‚ฌ์ด์ฆˆ ํ•จ์ˆ˜๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์˜€๋‹ค.

CSS ์ž‘์„ฑ

์บ”๋ฒ„์Šค๋Š” ํ™”๋ฉด ์ค‘์•™์— ๊ณ ์ •ํ–ˆ๊ณ  ๊ทธ๋ฆผ์ž๋ฅผ ์ด์šฉํ•ด ๋ฐฐ๊ฒฝ๊ณผ ๋ถ„๋ฆฌํ•˜์˜€๋‹ค.

ํˆด๋ฐ”๋Š” ํ™”๋ฉด ์•„๋ž˜์ชฝ์— ๊ณ ์ •ํ–ˆ๋Š”๋ฐ, ํ‰์†Œ์—๋Š” ์œ—๋ถ€๋ถ„๋งŒ ์‚ด์ง ๋“œ๋Ÿฌ๋‚˜ ์žˆ๋‹ค๊ฐ€ ๋งˆ์šฐ์Šค๊ฐ€ ๊ฐ€๊นŒ์ด ์™€์„œ ํ™œ์„ฑํ™”๋˜๋ฉด ์™„์ „ํžˆ ๋ณด์ด๋„๋ก ํ•˜์˜€๋‹ค.

์ƒˆ๋กœ ์•Œ๊ฒŒ ๋œ ์ 

์บ”๋ฒ„์Šค๋ฅผ ์ด๋ฒˆ ๊ณผ์ œ์—์„œ ์ฒ˜์Œ ์‚ฌ์šฉํ•ด ๋ดค๋Š”๋ฐ, ์ž‘๋™ ๋ฐฉ์‹์ด ์ด์ƒํ•ด๋„ ๋„ˆ๋ฌด ์ด์ƒํ–ˆ๋‹ค...

MDN page \<canvas>

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

๋งˆ์šฐ์Šค ์œ„์น˜์— ๊ทธ๋ฆผ์„ ๊ทธ๋ฆฌ๊ธฐ ์œ„ํ•ด ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ์—์„œ ์ „๋‹ฌํ•˜๋Š” ์ขŒํ‘œ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ขŒํ‘œ๋Š” ์ด 4๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. ์ด๋ฒˆ์— ์‚ฌ์šฉํ•œ offset ์™ธ์—๋„ screen, page, client๊ฐ€ ์žˆ์œผ๋ฉฐ ๊ฐ๊ฐ์˜ ์ฐจ์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์†์„ฑ ๊ธฐ์ค€์  ํŠน์ง•
screen ์‚ฌ์šฉ์ž์˜ ๋ชจ๋‹ˆํ„ฐ ๋ชจ๋‹ˆํ„ฐ ์™ผ์ชฝ ์œ„๊ฐ€ (0, 0)
page ์ „์ฒด ํŽ˜์ด์ง€ ๋งˆ์šฐ์Šค๋ฅผ ๊ฐ€๋งŒํžˆ ๋‘๊ณ  ์Šคํฌ๋กคํ–ˆ์„ ๋•Œ ๊ฐ’์ด ๋ณ€ํ•จ
client ์‚ฌ์šฉ์ž์—๊ฒŒ ํ‘œ์‹œ๋˜๋Š” ํŽ˜์ด์ง€ ๋งˆ์šฐ์Šค๋ฅผ ๊ฐ€๋งŒํžˆ ๋‘๊ณ  ์Šคํฌ๋กคํ–ˆ์„ ๋•Œ ๊ฐ’์ด ๊ณ ์ •
offset event.target ํƒ€๊ฒŸ ์˜์—ญ์˜ ์™ผ์ชฝ ์œ„๊ฐ€ (0, 0)

์ด๋ฒˆ ๊ฒฝ์šฐ์—๋Š” canvas ์˜์—ญ์— ๋Œ€ํ•œ ์œ„์น˜๋ฅผ ๊ตฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— offset์„ ์‚ฌ์šฉํ•œ ๊ฒƒ์ด๋‹ค. ๊ธฐ์ค€์ ์„ ์ •ํ™•ํžˆ ์•Œ๊ณ  ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฒฐ๊ณผ๊ฐ€ ์ด์ƒํ•˜๊ฒŒ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ํˆด๋ฐ”๋ฅผ ์ˆจ๊ฒผ๋‹ค๊ฐ€ ๋งˆ์šฐ์Šค๊ฐ€ ๊ฐ€๊นŒ์ด ์™”์„ ๋•Œ ๋ณด์—ฌ์ฃผ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด window์˜ ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•˜์˜€๋Š”๋ฐ, canvas์™€ ๋™์ผํ•˜๊ฒŒ offset์„ ์‚ฌ์šฉํ•˜์˜€์„ ๋•Œ ์ด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

window.addEventListener("mousemove", (event) => {
	if (event.offsetY > window.innerHeight * 0.9) {
		toolbar.classList.add("active");
	} else {
		toolbar.classList.remove("active");
	}
});

offsetY๋Š” ํ˜„์žฌ ์˜์—ญ์„ ๊ธฐ์ค€์œผ๋กœ ํ•œ Y ์ขŒํ‘œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ ๋งˆ์šฐ์Šค๊ฐ€ body์— ์žˆ์„ ๋•Œ๋Š” ์›ํ•˜๋Š”๋Œ€๋กœ ์ž‘๋™ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํˆด๋ฐ”๊ฐ€ ๋“œ๋Ÿฌ๋‚œ ์ƒํƒœ์—์„œ ๋งˆ์šฐ์Šค๊ฐ€ ํˆด๋ฐ” ์œ„๋กœ ์˜ฌ๋ผ๊ฐˆ ๊ฒฝ์šฐ body๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•œ ์ขŒํ‘œ๊ฐ€ ์•„๋‹Œ ํˆด๋ฐ”๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•œ ์ขŒํ‘œ๋กœ ๋ฐ”๋€Œ๊ธฐ ๋•Œ๋ฌธ์— ์กฐ๊ฑด์ด ๋งŒ์กฑ๋˜์ง€ ์•Š์•„ ๋‹ค์‹œ ํˆด๋ฐ”๊ฐ€ ์ˆจ๊ฒจ์ง€๊ฒŒ ๋œ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ํˆด๋ฐ”๊ฐ€ ์ˆจ๊ฒจ์ง€๋Š” ์ˆœ๊ฐ„ ๋‹ค์‹œ body๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•œ ์ขŒํ‘œ๋กœ ๋ฐ”๋€Œ๊ธฐ ๋•Œ๋ฌธ์— ์กฐ๊ฑด์ด ๋งŒ์กฑ๋˜์–ด ๊ฒฐ๊ณผ์ ์œผ๋กœ ํˆด๋ฐ”๊ฐ€ ๊นœ๋นก์ด๊ฒŒ ๋œ๋‹ค.

window.addEventListener("mousemove", (event) => {
	if (event.clientY > window.innerHeight * 0.9) {
		toolbar.classList.add("active");
	} else {
		toolbar.classList.remove("active");
	}
});

offsetY ๋Œ€์‹  clientY๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์ง€๊ธˆ์€ ํŽ˜์ด์ง€ ์Šคํฌ๋กค์ด ์—†๋Š” ๊ตฌ์„ฑ์ด๊ธฐ ๋•Œ๋ฌธ์— screen, page, client ์ค‘ ์–ด๋–ค ๊ฒƒ์„ ์‚ฌ์šฉํ•ด๋„ ๋ฌธ์ œ๊ฐ€ ์—†๊ฒ ์ง€๋งŒ, ์Šคํฌ๋กค์ด ์žˆ๋Š” ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ ์Šคํฌ๋กค๊นŒ์ง€ ๊ณ ๋ คํ•ด์„œ page๋‚˜ client ์ค‘ ์•Œ๋งž๋Š” ๊ฒƒ์„ ๊ณจ๋ผ์•ผ ํ•œ๋‹ค.

ํ‘œ๋ฅผ ์ •๋ ฌํ•˜๋ ค๊ณ  ๊ฒ€์ƒ‰์„ ํ•˜๋‹ค๊ฐ€ velog์— ํ‘œ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฌธ๋ฒ•์ด ์žˆ๋‹ค๋Š” ๊ฑธ ๋’ค๋Šฆ๊ฒŒ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ๋ญ๋“  ๊ฒ€์ƒ‰๋ถ€ํ„ฐ ํ•ด๋ณด๊ณ  ๋งŒ๋“ค ์ƒ๊ฐ์„ ํ•ด์•ผ ํ•˜๋Š”๋ฐ ์Šต๊ด€์ด ์‰ฝ๊ฒŒ ๊ณ ์ณ์ง€์ง„ ์•Š๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

์†Œ์Šค ์ฝ”๋“œ

Visit Github Repository

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

comment-user-thumbnail
2023๋…„ 8์›” 2์ผ

์ข‹์€ ์ •๋ณด ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ