๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Javascript Effect

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋งˆ์šฐ์Šค ํšจ๊ณผ : ์ด๋ฏธ์ง€ ํšจ๊ณผ

by ์ฝ”ํŒŒ์นด 2022. 9. 22.
728x90

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ : ๋งˆ์šฐ์Šค ํšจ๊ณผ : ์ด๋ฏธ์ง€ ํšจ๊ณผ

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


1. ์„ ํƒ์ž ๋งŒ๋“ค๊ธฐ

const cursor = document.querySelector(".mouse__cursor");
const cursorRect = document.querySelector(".mouse__cursor").getBoundingClientRect();

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

2. ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ ๋งŒ๋“ค๊ธฐ

document.querySelector(".mouse__wrap figure").addEventListener("mousemove", (e) => {}

addEventListener๋กœ ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ๋ฅผ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€๋ฅผ ์‚ฝ์ž…ํ•œ figure ํƒœ๊ทธ ๋‚ด์— ์ด๋ฒคํŠธ๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ฏธ์ง€์— ๋งˆ์šฐ์Šค๋ฅผ ์˜ค๋ฒ„ํ•ด์•ผ๋งŒ ์ปค์„œ๊ฐ€ ๋ณ€ํ™”ํ•ฉ๋‹ˆ๋‹ค.
์•„๋ž˜์˜ ๋ชจ๋“  ์†Œ์Šค๋Š” ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ ๋‚ด์—์„œ ์ž‘์—…ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

2-1) ๋ธŒ๋ผ์šฐ์ € ๊ธฐ์ค€ ๋งˆ์šฐ์Šค ์œ„์น˜๊ฐ’ ๊ตฌํ•˜๊ธฐ

let mousePageX = e.pageX;
let mousePageY = e.pageY;
                        
gsap.to(cursor, {
    duration: 0.3,
    left: e.pageX - cursorRect.width / 2,
    top: e.pageY - cursorRect.height / 2,
});

์šฐ์„ , ์‹ค์ œ ๋งˆ์šฐ์Šค์˜ ์œ„์น˜๊ฐ’์„ ๊ตฌํ•ฉ๋‹ˆ๋‹ค. pageX/pageY ์†์„ฑ์€ ๋ฌธ์„œ์˜ ์™ผ์ชฝ/์œ„์ชฝ ๊ธฐ์ค€์œผ๋กœ, ๋งˆ์šฐ์Šค ์ปค์„œ์˜ ์œ„์น˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
GSAP๋กœ ๋งˆ์šฐ์Šค ์œ„์น˜์— ๋”ฐ๋ผ ์ปค์„œ๊ฐ€ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ๋”ฐ๋ผ์˜ค๋„๋ก ์ž‘์—…ํ•ด ์ค๋‹ˆ๋‹ค. ๋งˆ์šฐ์Šค์˜ ์œ„์น˜๋Š” ์‹ค์ œ ์œ„์น˜์—์„œ ๋„ˆ๋น„, ๋†’์ด๊ฐ’์„ 2๋กœ ๋‚˜๋ˆ„์–ด ๋นผ ์คŒ์œผ๋กœ์จ ์ปค์„œ์˜ ํ•œ๊ฐ€์šด๋ฐ์— ์œ„์น˜ํ•˜๋„๋ก ํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

2-2) ๋ธŒ๋ผ์šฐ์ €์˜ ์ค‘์•™ ๊ธฐ์ค€ ๋งˆ์šฐ์Šค ์œ„์น˜๊ฐ’ ๊ตฌํ•˜๊ธฐ

1. window.innerWidth // ์Šคํฌ๋กค๋ฐ” ๋ฏธํฌํ•จ, ์œ ๋™์ (๋ธŒ๋ผ์šฐ์ € ๊ธฐ์ค€)
2. window.outerWidth // ์Šคํฌ๋กค๋ฐ” ํฌํ•จ, ์œ ๋™์ (๋ธŒ๋ผ์šฐ์ € ๊ธฐ์ค€)
3. window.screen.width // ์Šคํฌ๋กค๋ฐ” ํฌํ•จ, ๋ถˆ๋ณ€(๋ชจ๋‹ˆํ„ฐ ๊ธฐ์ค€)

์ด๋ฒˆ์—๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ์ค‘์•™์„ ๊ธฐ์ค€์œผ๋กœ ๋งˆ์šฐ์Šค์˜ ์œ„์น˜๊ฐ’์„ ๊ตฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ™”๋ฉด์— ๋ณด์ด๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ๋„ˆ๋น„, ๋†’์ด๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์˜ ๋„ˆ๋น„๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์œ„ ์„ธ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์ฒซ๋ฒˆ์งธ, innerWidth์˜ ๊ฒฝ์šฐ, ์Šคํฌ๋กค๋ฐ”๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๊ณ , ๋ธŒ๋ผ์šฐ์ €์˜ ํฌ๊ธฐ๋ฅผ ์ค„์ด๋ฉด ์ž‘์•„์ง„ ๋ธŒ๋ผ์šฐ์ € ์ƒํƒœ์˜ ๋„ˆ๋น„๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
๋‘๋ฒˆ์งธ, outerWidth์˜ ๊ฒฝ์šฐ, ์Šคํฌ๋กค๋ฐ”๋ฅผ ํฌํ•จํ•˜๊ณ , ๋ธŒ๋ผ์šฐ์ €์˜ ํฌ๊ธฐ๋ฅผ ์ค„์ด๋ฉด ์ž‘์•„์ง„ ์ƒํƒœ์˜ ๋ธŒ๋ผ์šฐ์ € ๋„ˆ๋น„๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
์„ธ๋ฒˆ์งธ, screen.width์˜ ๊ฒฝ์šฐ, ์Šคํฌ๋กค๋ฐ”๋ฅผ ํฌํ•จํ•˜๊ณ , ๋ธŒ๋ผ์šฐ์ €์˜ ํฌ๊ธฐ๋ฅผ ์ค„์—ฌ๋„ ๋„ˆ๋น„๊ฐ’์ด ๋ณ€ํ™”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋ชจ๋‹ˆํ„ฐ ํ™”๋ฉด์˜ ํฌ๊ธฐ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์‚ฌ์ดํŠธ๋Š” ๋ฐ˜์‘ํ˜•์ด๊ธฐ ๋•Œ๋ฌธ์— innerWidth๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

let centerPageX = window.innerWidth / 2 - mousePageX;
let centerPageY = window.innerHeight / 2 - mousePageY;

๋ธŒ๋ผ์šฐ์ €์˜ ๋„ˆ๋น„, ๋†’์ด๊ฐ’์„ ๊ตฌํ–ˆ๋‹ค๋ฉด, ์ด์ œ ๋ธŒ๋ผ์šฐ์ €์˜ ์ค‘์•™ ๊ธฐ์ค€ ๋งˆ์šฐ์Šค ์œ„์น˜๊ฐ’์„ ๊ตฌํ•ด๋ด…์‹œ๋‹ค.
์ „์ฒด ๊ธธ์ด / 2 - ๋งˆ์šฐ์Šค ์ขŒํ‘œ๊ฐ’์„ ๊ตฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

2-3) Info ๋ฐ•์Šค์— ์ถœ๋ ฅํ•˜๊ธฐ

// ๋ธŒ๋ผ์šฐ์ € ๊ธฐ์ค€
document.querySelector(".mousePageX").textContent = mousePageX;
document.querySelector(".mousePageY").textContent = mousePageY;

// ๊ฐ€์šด๋ฐ ๊ธฐ์ค€
document.querySelector(".centerPageX").textContent = Math.ceil(centerPageX);
document.querySelector(".centerPageY").textContent = Math.ceil(centerPageY);

๋ธŒ๋ผ์šฐ์ € ๊ธฐ์ค€, ๋ธŒ๋ผ์šฐ์ € ์ค‘์•™ ๊ธฐ์ค€ ๋งˆ์šฐ์Šค์˜ ์ขŒํ‘œ๊ฐ’์„ ๊ตฌํ–ˆ๋‹ค๋ฉด, ๋ธŒ๋ผ์šฐ์ € ์ขŒ์ธก ํ•˜๋‹จ์— ์œ„์น˜ํ•œ Info ๋ฐ•์Šค์— ๊ฐ๊ฐ ์นœ์ ˆํ•˜๊ฒŒ ์ถœ๋ ฅํ•ด ์ค๋‹ˆ๋‹ค.

2-4) ์ปค์„œ ์œ„์น˜์— ๋”ฐ๋ผ ์ด๋ฏธ์ง€ ํšจ๊ณผ ์ฃผ๊ธฐ

const imgMove = document.querySelector(".mouse__wrap figure img");
// imgMove.style.transform = "translate(" + centerPageX / 20 + "px, " + centerPageY / 20 + "px)";

gsap.to(imgMove, {
    duration: 0.3,
    x: centerPageX / 20,
    y: centerPageY / 20,
});

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


๊ฒฐ๊ณผ

728x90

๋Œ“๊ธ€

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๐Ÿฆ™

CSS
๊ด‘๊ณ  ์ค€๋น„์ค‘