์๋ฐ์คํฌ๋ฆฝํธ : ๋ง์ฐ์ค ํจ๊ณผ : ์ด๋ฏธ์ง ํจ๊ณผ
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ค์ํ ํจ๊ณผ๋ค ์ค, ๋ง์ฐ์ค ํจ๊ณผ์ ๋๋ค. ์ด๋ฒ์๋ ์ด๋ฏธ์ง ์์ ๋ง์ฐ์ค๋ฅผ ์ค๋ฒํ๋ฉด ์ปค์๊ฐ ๋ํ๋๊ณ , ์ปค์์ ์์น์ ๋ฐ๋ผ ์ด๋ฏธ์ง๊ฐ ํ๋๋จ๊ณผ ๋์์ ์ด๋ํ๋ ํจ๊ณผ๋ฅผ ์์ ํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
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์ ํด์ค ์ด์ ๋ ์ด๋ฏธ์ง์ ์์ง์ ์ ๋๋ฅผ ์กฐ์ ํ๊ธฐ ์ํด์์ ๋๋ค.
๊ฒฐ๊ณผ
'Javascript Effect' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์๋ฐ์คํฌ๋ฆฝํธ ๊ฒ์ ํจ๊ณผ : find() (5) | 2022.09.28 |
---|---|
์๋ฐ์คํฌ๋ฆฝํธ ๋ง์ฐ์ค ํจ๊ณผ : ๊ธฐ์ธ๊ธฐ ํจ๊ณผ / ๋ฐ์ ํจ๊ณผ (10) | 2022.09.28 |
์๋ฐ์คํฌ๋ฆฝํธ ๋ง์ฐ์ค ํจ๊ณผ : ์กฐ๋ช ํจ๊ณผ (9) | 2022.09.22 |
์๋ฐ์คํฌ๋ฆฝํธ ํจ๋ด๋์ค ํจ๊ณผ : ์ด์ง๊ฐ ํจ๊ณผ (5) | 2022.09.20 |
์๋ฐ์คํฌ๋ฆฝํธ ๋ง์ฐ์ค ํจ๊ณผ : ๋ง์ฐ์ค ๋ฐ๋ผ๋ค๋๊ธฐ(GSAP) (4) | 2022.09.18 |
๋๊ธ