๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Effect/Mouse Effect

[Mouse Effect] ๋งˆ์šฐ์Šค ์ดํŽ™ํŠธ 02 - GSAP

by ์ฝ”๋”ฉ๊ณต์ฑ… 2022. 9. 18.
๋ฐ˜์‘ํ˜•

๋งˆ์šฐ์Šค ์ดํŽ™ํŠธ 02 : GSAP

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


HTML ์†Œ์Šค

header, main(๋งˆ์šฐ์Šค ์ปค์„œ 2๊ฐœ & ๋ช…์–ธ), footer(๋ชจ๋‹ฌ ๋ฐ•์Šค) ํฌ๊ฒŒ 3๊ฐ€์ง€๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. footer์˜ ๋ชจ๋‹ฌ ๋ฐ•์Šค ๋‚ด์šฉ์€ ๋„ˆ๋ฌด ๊ธธ์–ด์ง€๋ฏ€๋กœ ์ƒ๋žตํ•œ๋‹ค. ๋ชจ๋‹ฌ ๋ฐ•์Šค๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋Š” ์ด์ „์— ์—…๋กœ๋“œํ•œ ์Šฌ๋ผ์ด๋“œ ์ดํŽ™ํŠธ ๊ฒŒ์‹œ๋ฌผ์„ ์ฐธ์กฐํ•  ๊ฒƒ.

<body class="img04"> <!-- ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ด๋ฏธ์ง€ / CSS๋กœ ์ด๋ฏธ์ง€ ์ถœ๋ ฅ์‹œํ‚ด -->
    <header id="header">
        <h1>JAVASCRIPT MOUSE EFFECT 02</h1>
        <p>๋งˆ์šฐ์Šค ์ดํŽ™ํŠธ - ๋งˆ์šฐ์Šค ๋”ฐ๋ผ๋‹ค๋‹ˆ๊ธฐ(GSAP)</p>
        <ul>
            <li><a href="mouseEffect01.html">01</a></li>
            <li class="active"><a href="mouseEffect02.html">02</a></li>
            <li><a href="mouseEffect03.html">03</a></li>
            <li><a href="mouseEffect04.html">04</a></li>
            <li><a href="mouseEffect05.html">05</a></li>
            <li><a href="mouseEffect06.html">06</a></li>
            <li><a href="mouseEffect07.html">07</a></li>
        </ul>
    </header>
    <!-- //header -->

    <main id="main">
      <section id="mouseType">
        <div class="mouse__cursor"></div>
        <div class="mouse__cursor2"></div>

        <div class="mouse__wrap">
          <p><span class="style1">The future</span> depends on <span class="style2">what we do</span> in the <span class="style3">present</span>.</p>
          <p><span class="style4">๋ฏธ๋ž˜</span>๋Š” <span class="style5">ํ˜„์žฌ</span> ์šฐ๋ฆฌ๊ฐ€ <span class="style6">๋ฌด์—‡์„ ํ•˜๋Š”๊ฐ€</span>์— ๋‹ฌ๋ ค ์žˆ๋‹ค.</p>
        </div>
      </section>
    </main>
    <!-- //main -->

    <footer>
        <!-- ๋ชจ๋‹ฌ ๋ฐ•์Šค ๋‚ด์šฉ ๋“ค์–ด๊ฐˆ ๊ณณ. ๊ธธ์–ด์ง€๋ฏ€๋กœ ์ƒ๋žต. -->
    </footer>
    <!-- //footer -->
</body>

CSS ์†Œ์Šค

๋งˆ์šฐ์Šค ์ปค์„œ ๋‘ ๊ฐœ(mouse__cursor, mouse__cursor2)์˜ ๋ชจ์–‘์„ ๋งŒ๋“ ๋‹ค. ํด๋ž˜์Šค๊ฐ’ active๊ฐ€ ๋ถ™์—ˆ์„ ๋•Œ์˜ ๋ชจ์–‘๋„ ํ•จ๊ป˜ ๊ธฐ์ˆ ํ•œ๋‹ค. ๊ณตํ†ต/์ดˆ๊ธฐํ™” CSS ์†Œ์Šค๋Š” ํ•˜๋‹จ์˜ [CSS ์†Œ์Šค ๋ณด๊ธฐ]๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

.mouse__cursor {
    position: absolute;
    left: 0;
    top: 0;
    width: 10px;
    height: 10px;
    z-index: 9999;
    border-radius: 50%;
    background: rgba(255,255,255,0.1);
    user-select: none;
    pointer-events: none;
    transition: transform 0.3s, opacity 0.2s;
}
.mouse__cursor2 {
    position: absolute;
    left: 0;
    top: 0;
    width: 30px;
    height: 30px;
    z-index: 9998;
    border-radius: 50%;
    background: rgba(255,255,255,0.3);
    user-select: none;
    pointer-events: none;
    transition: transform 0.3s, opacity 0.2s;
}
.mouse__cursor.active {
    transform: scale(0);
}
.mouse__cursor2.active {
    transform: scale(5);
    background: rgba(255,166,0,0.6);
}

JS ์†Œ์Šค

GSAP ๋ฐฉ์‹์„ ์ด์šฉํ•ด์„œ ๋งˆ์šฐ์Šค ์ปค์„œ๊ฐ€ ์›€์ง์˜€์„ ๋•Œ์˜ ์Šคํƒ€์ผ(CSS)์„ ์ž…ํ˜€์ฃผ๋„๋ก ํ•œ๋‹ค. (๊ธฐ์กด ๋ฐฉ์‹๊ณผ ํ•จ๊ป˜ ๊ธฐ์ˆ ํ•˜์˜€์Œ) ๊ทธ๋Ÿฐ ๋‹ค์Œ, ๋งˆ์šฐ์Šค ์ปค์„œ๊ฐ€ ํŠน์ • ๋ฌธ๊ตฌ ์œ„์— ์˜ฌ๋ผ๊ฐ”์„ ๋•Œ(= hover ๋์„ ๋•Œ) active ํšจ๊ณผ๋ฅผ ๋ถ™์—ฌ์ฃผ๊ณ  ์ปค์„œ๊ฐ€ ๋– ๋‚ฌ์„ ๋•Œ๋Š” active ํšจ๊ณผ๋ฅผ ์ œ๊ฑฐํ•ด์ฃผ๋„๋ก ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์งฐ๋‹ค.

const cursor = document.querySelector(".mouse__cursor");
const cursor2 = document.querySelector(".mouse__cursor2");
const span = document.querySelectorAll(".mouse__wrap span")

window.addEventListener("mousemove", e => {
    // ์ปค์„œ ์ขŒํ‘œ๊ฐ’ ํ• ๋‹น
    // cursor.style.left = e.pageX -5+ "px";
    // cursor.style.top = e.pageY -5+ "px";
    // cursor2.style.left = e.pageX -15+ "px";
    // cursor2.style.top = e.pageY -15+ "px";

    // GSAP
    gsap.to(cursor, {duration: 0.3, left: e.pageX -5, top:e.pageY -5});
    gsap.to(cursor2, {duration: 0.8, left: e.pageX -15, top:e.pageY -15});

    // ์˜ค๋ฒ„ ํšจ๊ณผ
    // mouseenter / mouseover / ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง
    span.forEach(span => {
        span.addEventListener("mouseenter", () => {
            cursor.classList.add("active");
            cursor2.classList.add("active");
        });
        span.addEventListener("mouseleave", () => {
            cursor.classList.remove("active");
            cursor2.classList.remove("active");
        });
    });
});

๊ฒฐ๊ณผ

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€


Reference Book

JavaScript
HTML
CSS
๊ด‘๊ณ  ์ค€๋น„์ค‘์ž…๋‹ˆ๋‹ค.