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

[Mouse Efffect] ๋งˆ์šฐ์Šค ์ดํŽ™ํŠธ 06

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

๋งˆ์šฐ์Šค ์ดํŽ™ํŠธ 06 : ํ…์ŠคํŠธ ํšจ๊ณผ

์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” ๋งˆ์šฐ์Šค ์ดํŽ™ํŠธ - ํ…์ŠคํŠธ ํšจ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


HTML ์†Œ์Šค

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

<body class="img04">
    <header id="header">
        <h1>JAVASCRIPT MOUSE EFFECT 06</h1>
        <p>๋งˆ์šฐ์Šค ์ดํŽ™ํŠธ - ํ…์ŠคํŠธ ํšจ๊ณผ</p>
        <ul>
            <li><a href="mouseEffect01.html">01</a></li>
            <li><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 class="active"><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__wrap">
          <div class="mouse__img">
            <figure>
              <img src="../assets/img/effect_bg01.jpg" alt="์ด๋ฏธ์ง€">
            </figure>
            <div class="mouse__text">
              <div class="line">
                <div class="left">
                  <div class="spanWrap">
                    <span class="spanSlow">Pain Past</span>
                  </div>
                </div>
                <div class="right">
                  <div class="spanWrap">
                    <span class="spanSlow">Pain Past</span>
                  </div>
                </div>
              </div>
              <div class="line">
                <div class="left">
                  <div class="spanWrap">
                    <span class="spanFast">is pleasure.</span>
                  </div>
                </div>
                <div class="right">
                  <div class="spanWrap">
                    <span class="spanFast">is pleasure.</span>
                  </div>
                </div>
              </div>
              <div class="line">
                <div class="left">
                  <div class="spanWrap">
                    <span class="spanSlow">์ง€๋‚˜๊ฐ„ ๊ณ ํ†ต์€</span>
                  </div>
                </div>
                <div class="right">
                  <div class="spanWrap">
                    <span class="spanSlow">์ง€๋‚˜๊ฐ„ ๊ณ ํ†ต์€</span>
                  </div>
                </div>
              </div>
              <div class="line">
                <div class="left">
                  <div class="spanWrap">
                    <span class="spanFast">์พŒ๋ฝ์ด๋‹ค.</span>
                  </div>
                </div>
                <div class="right">
                  <div class="spanWrap">
                    <span class="spanFast">์พŒ๋ฝ์ด๋‹ค.</span>
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </section>
    </main>
    <!-- //main -->
  
    <footer>
        <!-- ๋ชจ๋‹ฌ ๋ฐ•์Šค ๋‚ด์šฉ ๋“ค์–ด๊ฐˆ ๊ณณ. ๊ธธ์–ด์ง€๋ฏ€๋กœ ์ƒ๋žต. -->
    </footer>
    <!-- //footer -->
  </body>

CSS ์†Œ์Šค

.mouse__cursor.active์—์„œ ๋งˆ์šฐ์Šค ์ปค์„œ๊ฐ€ ํ…์ŠคํŠธ ์œ„์— ์˜ฌ๋ผ์™”์„ ๋•Œ ํฌ๊ธฐ๋ฅผ 5๋ฐฐ๋กœ ์„ค์ •ํ•ด์ค€๋‹ค. ๊ณตํ†ต/์ดˆ๊ธฐํ™” CSS ์†Œ์Šค๋Š” ํ•˜๋‹จ์˜ [CSS ์†Œ์Šค ๋ณด๊ธฐ]๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

<style>
  /* mouseType */
  .mouse__wrap {
    color: #fff;
    width: 100%;
    height: 100vh;
    cursor: none;
  }
  .mouse__img {
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%);
    z-index: -1;
  }
  .mouse__text {
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -20%);
    font-size: 3vw;
    line-height: 1.5;
  }
  .mouse__text .line {
    width: 100%;
    display: flex;
  }
  .mouse__text .line .left {
    width: 50vw;
    color: orange;
    overflow: hidden;
    transform: skew(0deg, -15deg);
  }
  .mouse__text .line .left .spanWrap {
    width: 100vw;
    text-align: center;
  }
  .mouse__text .line .right {
    width: 50vw;
    overflow: hidden;
    transform: skew(0deg, 15deg);
  }
  .mouse__text .line .right .spanWrap {
    width: 100vw;
    text-align: center;
    transform: translateX(-50vw);
  }
  .mouse__text span {
    display: inline-block;
  }
  .mouse__cursor {
    position: absolute;
    left: 0;
    top: 0;
    width: 20px;
    height: 20px;
    z-index: 9999;
    border-radius: 50%;
    background-color: rgba(255,255,255,0.9);
    user-select: none;
    pointer-events: none;
    mix-blend-mode: difference;
    transition: transform 0.3s;
  }
  .mouse__cursor.active {
    transform: scale(5);
  }
</style>

JS ์†Œ์Šค

<script>
  const mouseMove = (e) => {
    let positionSlow = (e.pageX - window.innerWidth / 2) * 0.1;
    let positionFast = (e.pageX - window.innerWidth / 2) * 0.2;

    gsap.to(".spanSlow", {duration: 0.4, x: positionSlow});
    gsap.to(".spanFast", {duration: 0.4, x: -positionFast});
    gsap.to(".mouse__cursor", {duration: 0.3, left: e.pageX - 5, top: e.pageY - 5});
  }
  window.addEventListener("mousemove", mouseMove);

  // ํ…์ŠคํŠธ ์œ„์— ๋งˆ์šฐ์Šค ์ปค์„œ ์˜ฌ๋ผ์™”์„ ๋•Œ ์ปค์„œ ํฌ๊ธฐ 5๋ฐฐ๋กœ ํ‚ค์šฐ๊ธฐ
  
  const text = document.querySelectorAll(".spanSlow");
  const text2 = document.querySelectorAll(".spanFast");
  
  text.forEach((e) => {
    e.addEventListener("mouseenter", () => {
      document.querySelector(".mouse__cursor").classList.add("active");
    });
    e.addEventListener("mouseleave", () => {
      document.querySelector(".mouse__cursor").classList.remove("active");
    });
  });
  text2.forEach((e) => {
    e.addEventListener("mouseenter", () => {
      document.querySelector(".mouse__cursor").classList.add("active");
    });
    e.addEventListener("mouseleave", () => {
      document.querySelector(".mouse__cursor").classList.remove("active");
    });
  });
</script>

๊ฒฐ๊ณผ

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€


Reference Book

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