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

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋งˆ์šฐ์Šค ํšจ๊ณผ : ์กฐ๋ช… ํšจ๊ณผ

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

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ : ๋งˆ์šฐ์Šค ํšจ๊ณผ : ์กฐ๋ช… ํšจ๊ณผ

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


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๋ฅผ ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.


๊ฒฐ๊ณผ

728x90

๋Œ“๊ธ€

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

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