์๋ฐ์คํฌ๋ฆฝํธ : ๋ง์ฐ์ค ํจ๊ณผ : ์กฐ๋ช ํจ๊ณผ
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ค์ํ ํจ๊ณผ๋ค ์ค, ๋ง์ฐ์ค ํจ๊ณผ์ ๋๋ค. ์ด๋ฒ์๋ ์กฐ๋ช ํจ๊ณผ๋ฅผ ์์ ํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ์กฐ๋ช ํจ๊ณผ๋ ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง ์์ ๋ง์ฐ์ค๋ฅผ ์ฌ๋ฆฌ๋ฉด, ์ด๋ฏธ์ง๊ฐ ์ ๋ช ํ๊ฒ ๋ณด์ด๋๋ก ํ๋ ํจ๊ณผ์ ๋๋ค.
1. CSS ์์ค
1-1) cursor ๋ง๋ค๊ธฐ
.mouse__cursor {
position: absolute;
left: 0;
top: 0;
width: 200px;
height: 200px;
z-index: -1;
border-radius: 50%;
background-image: url(../assets/img/effect_bg15@2x-min.jpg);
background-size: cover;
background-position: center center;
background-attachment: fixed;
border: 5px solid #fff;
}
๋ง์ฐ์ค ์ปค์์ ๋๋น, ๋์ด, ๋ชจ์์ ์ง์ ํด ์ฃผ๊ณ , ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ฐฉ์์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ์ฝ์ ํด ์ค๋๋ค. ๋ฐฐ๊ฒฝ(body)์๋ ๊ฐ์ ์ด๋ฏธ์ง๋ฅผ ์ฝ์ ํด ์ค๋๋ค.
2. JAVASCRIPT ์์ค
2-1) ์ปค์ ์ ํ์ ๋ง๋ค๊ธฐ
const cursor = document.querySelector(".mouse__cursor");
์ปค์์ ๋ํ ์ ํ์๋ฅผ ๋จผ์ ๋ง๋ค์ด ์ค๋๋ค.
2-2) ์ปค์์ ๋๋น, ๋์ด๊ฐ์ ๊ตฌํ๋ ์ ํ์ ๋ง๋ค๊ธฐ : offsetWidth, offsetHeight / clientWidth, clientHeight์ ์ฐจ์ด
// const circle1 = cursor.offsetWidth; // 200
// const circle2 = cursor.clientWidth; // 190
const circleW = cursor.offsetWidth;
const circleH = cursor.offsetHeight;
๋๋น, ๋์ด๊ฐ์ ๊ตฌํ๋ ๋ฐฉ๋ฒ์๋ ๋ ๊ฐ์ง๊ฐ ์์ต๋๋ค. offsetWidth, offsetHeight /
clientWidth, clientHeight๊ฐ ๊ทธ๊ฒ์
๋๋ค. ๊ทธ ์ฐจ์ด๋ ๋ณด๋๊ฐ ํฌํจ ์ ๋ฌด์
์์ต๋๋ค.
console.log๋ฅผ ํตํด ํ์ธํด ๋ณด๋ฉด, ์ ์์ธ offsetWidth์ ๊ฒฝ์ฐ, ๋ณด๋์ ๊ฐ์
ํฌํจํ์ง ์์, ์ปค์์ width๊ฐ์ธ 200์ ๊ทธ๋๋ก ์ถ๋ ฅํฉ๋๋ค. ๋ณด๋๋ฅผ 5px ์ค์ ํด
์ฃผ์๊ธฐ ๋๋ฌธ์, ํ์์ธ clientWidth์ ๊ฒฝ์ฐ, ์ด 10px(5px * 2)์ ๊ฐ์ด
์ค์ด๋ค์ด 190์ ์ถ๋ ฅํ๊ฒ ๋ฉ๋๋ค.
์ฌ๊ธฐ์์๋ ์ปค์์ width๊ฐ์ ๊ทธ๋๋ก ์ฌ์ฉํ
๊ฒ์ด๊ธฐ ๋๋ฌธ์, offset ์์ฑ์ด ๋ ์ ํฉํฉ๋๋ค.
2-3) ์ปค์์ ๋๋น, ๋์ด๊ฐ์ ๊ตฌํ๋ ์ ํ์ ๋ง๋ค๊ธฐ : getBoundingClientRect()
const circle = cursor.getBoundingClientRect();
// DOMRect {x: 0, y: 0, width: 200, height: 200, top: 0, โฆ}
2-2์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์๋ ์์ง๋ง, getBoundingClientRect()์ ์ฌ์ฉํ์ฌ ๋ ๊ฐ๋จํ ์์ ํ ์๋ ์์ต๋๋ค. console.log๋ก ๊ฐ์ ํ์ธํด ๋ณด๋ฉด, cursor์ x, y, width, height ๋ฑ์ ๊ฐ์ด ๊ฐ์ฒด๋ก ํ๋ฒ์ ๋ํ๋๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
2-3) ๋ง์ฐ์ค ์ด๋ฒคํธ ๋ง๋ค์ด ์ฃผ๊ธฐ
window.addEventListener("mousemove", (e) => {
gsap.to(cursor, {
duration: 0.5,
left: e.pageX - circle.width / 2,
top: e.pageY - circle.height / 2,
});
});
์ง๊ธ๊น์ง ์์ ํ ๊ฐ๋ค๋ก ๋ง์ฐ์ค ์ด๋ฒคํธ๋ฅผ ๋ง๋ค์ด ์ฃผ๋ฉด ์์ฑ์ ๋๋ค. ์ด๋ฒ์๋ gsap๋ฅผ ์ด์ฉํด ๋ถ๋๋ฌ์ด ์์ง์ ํจ๊ณผ๋ฅผ ์ฃผ์์ต๋๋ค. getBoundingClientRect()๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ๋ฐฉ์์ผ๋ก ๋๋น, ๋์ด๊ฐ์ ์ ๋ ฅํ๊ณ , ์ค์ ์ปค์๊ฐ ์ค๊ฐ์ ์์นํ ์ ์๊ฒ๋ ๋๋๊ธฐ 2๋ฅผ ํด์ฃผ๋ฉด ๋ฉ๋๋ค.
๊ฒฐ๊ณผ
'Javascript Effect' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์๋ฐ์คํฌ๋ฆฝํธ ๋ง์ฐ์ค ํจ๊ณผ : ๊ธฐ์ธ๊ธฐ ํจ๊ณผ / ๋ฐ์ ํจ๊ณผ (10) | 2022.09.28 |
---|---|
์๋ฐ์คํฌ๋ฆฝํธ ๋ง์ฐ์ค ํจ๊ณผ : ์ด๋ฏธ์ง ํจ๊ณผ (3) | 2022.09.22 |
์๋ฐ์คํฌ๋ฆฝํธ ํจ๋ด๋์ค ํจ๊ณผ : ์ด์ง๊ฐ ํจ๊ณผ (5) | 2022.09.20 |
์๋ฐ์คํฌ๋ฆฝํธ ๋ง์ฐ์ค ํจ๊ณผ : ๋ง์ฐ์ค ๋ฐ๋ผ๋ค๋๊ธฐ(GSAP) (4) | 2022.09.18 |
์๋ฐ์คํฌ๋ฆฝํธ ์ฌ๋ผ์ด๋ ํจ๊ณผ : ๋ฒํผ (3) | 2022.09.18 |
๋๊ธ