๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
EFFECT

[EFFECT] ๋งˆ์šฐ์Šค ํšจ๊ณผ 02 : ์ปค์„œ ๋”ฐ๋ผ๋‹ค๋‹ˆ๊ธฐ

by _ํ† ๋งคํ†  2022. 9. 19.
728x90

๐Ÿ–ฑ ๋งˆ์šฐ์Šค ํšจ๊ณผ : ๋งˆ์šฐ์Šค ์ปค์„œ ๋”ฐ๋ผ๋‹ค๋‹ˆ๊ธฐ ๐Ÿ–ฑ

์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” ํ•ด๋‹น ์˜์—ญ์— ์ปค์„œ๊ฐ€ ๋‹ฟ์•˜์„ ๋•Œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ํšจ๊ณผ์— ์ด์–ด์„œ ์ปค์„œ๋ฅผ ๋”ฐ๋ผ๋‹ค๋‹ˆ๋Š” ์š”์†Œ๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค ๐Ÿ˜†


#1. HTML / CSS ์„ค์ •ํ•˜๊ธฐ

! HTML TIP !
ํŽ˜์ด์ง€ ์„น์…˜๊ณผ ๋งˆ์šฐ์Šค ์ธํฌ(์ปค์„œ ์œ„์น˜๊ฐ’ ๋ฐ•์Šค)๋ฅผ ๊ฐ๊ฐ ๋‚˜๋ˆ„์–ด ๊ตฌ์กฐ์— ๋งž๊ฒŒ ๋ ˆ์ด์•„์›ƒ์„ ์ง  ๋’ค ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์œ„ํ•œ ์„ ํƒ์ž๋ฅผ ๊ฐ๊ฐ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ ํ…์ŠคํŠธ์—์„œ ์Šคํƒ€์ผ ๋ณ€๊ฒฝ ๋ฐ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ  ์‹ถ์€ ๊ณณ์— ๊ฐ๊ฐ ์„ ํƒ์ž๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.

โœ๏ธ HTML ์Šคํฌ๋ฆฝํŠธ ๋ณด๊ธฐ
<header id="header">
    <h1>Javascript Mouse Effect02</h1>
    <p>๋งˆ์šฐ์Šค ์ดํŽ™ํŠธ - ๋งˆ์šฐ์Šค ๋”ฐ๋ผ๋‹ค๋‹ˆ๊ธฐ(GSAP)</p>
    <ul>
      <li><a href="mouseEffect01.html">1</a></li>
      <li class="active"><a href="mouseEffect02.html">2</a></li>
      <li><a href="mouseEffect03.html">3</a></li>
      <li><a href="mouseEffect04.html">4</a></li>
      <li><a href="mouseEffect05.html">5</a></li>
      <li><a href="mouseEffect06.html">6</a></li>
      <li><a href="mouseEffect07.html">7</a></li>
    </ul>
  </header>
  <!-- //header -->

  <main id="main">
      <section id="mouseType01">
          <div class="mouse__cursor"></div>
          <div class="mouse__cursor2"></div>
          <div class="mouse__wrap">
              <p><span class="style1">Energy</span> and <span>persistence</span> conquer all things</p>
              <p><span>๊ธฐ์šด</span>๊ณผ <span>๋ˆ๊ธฐ</span>๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์ด๊ฒจ๋‚ธ๋‹ค.</p>
          </div>
      </section>

  </main>
</div>

! CSS TIP !
1. ๊ทธ ๋’ค ํ…์ŠคํŠธ์—์„œ ์ปค์„œ๊ฐ€ ๋‹ฟ์•˜์„ ๋•Œ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ  ์‹ถ์€ ๊ณณ์— ์• ๋‹ˆ๋ฉ”์ด์…˜ ์†์„ฑ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.
2. ์ปค์„œ์™€ ๋”ฐ๋ผ๋‹ค๋‹ˆ๋Š” ์š”์†Œ์—๊ฒŒ๋„ ์†์„ฑ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

โœ๏ธ CSS ์Šคํฌ๋ฆฝํŠธ ๋ณด๊ธฐ : ๋งˆ์šฐ์Šค ํฌ์ธํ„ฐ / ์ปค์„œ / ์—๋‹ˆ๋ฉ”์ด์…˜ํšจ๊ณผ
/* mouseType */
.mouse__wrap {
    width: 100%;
    height: 100vh;  /* vw๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์Šคํฌ๋กค์ด ์ƒ๊ธฐ๋ฏ€๋กœvh๋กœ ์ž‘์—… */
    display: flex;
    align-items: center;
    justify-content: center;
    flex-direction: column;
    color: #fff;
    overflow: hidden;
    cursor: none;
}
.mouse__wrap p {
    font-size: 2vw;
    line-height: 2;
    font-weight: 200;
}
.mouse__wrap p:last-child {
    font-size: 3vw;
    font-weight: 300;
}
.mouse__wrap p span {
    padding-bottom: 3px;
    border-bottom: 0.1vw solid #e7ad00;
    color: #e7ad00;
}

@media (max-width: 800px) {
    .mouse__wrap p {
        padding: 0 20px;
        font-size: 24px;
        line-height: 1.5;
        text-align: center;
        margin-bottom: 10px;
    }
    .mouse__wrap p:last-child {
        font-size: 40px;
        line-height: 1.5;
        text-align: center;
        word-break: keep-all;
    }
}

/* mouse__cursor */
.mouse__cursor {
    position: absolute;
    left: 0;
    top: 0;
    width: 10px;
    height: 10px;
    z-index: 9999;
    border-radius: 50%;
    background: rgba(79, 42, 225, 0.3);
    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: 9999;
    border-radius: 50%;
    background: rgba(79, 42, 225, 0.5);
    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(79, 42, 225, 0.5);
}

#2. JAVASCRIPT : ์Šคํฌ๋ฆฝํŠธ ์งœ๊ธฐ

์ด๋ฒคํŠธ ๋ฉ”์„œ๋“œ์ธ mousemove(), mouseenter(), mouseleave() ๊ทธ๋ฆฌ๊ณ  GSAP์„ ํ†ตํ•ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์™„์„ฑํ•ด๋ณด์ž!

๐Ÿ’ก ์ „์ฒด ์Šคํฌ๋ฆฝํŠธ ๋ณด๊ธฐ
//์„ ํƒ์ž
const cursor = document.querySelector(".mouse__cursor"); //์ฒซ๋ฒˆ์งธ ์ปค์„œ
const cursor2 = document.querySelector(".mouse__cursor2"); //2๋ฒˆ์งธ ์ปค์„œ
const span = document.querySelectorAll(".mouse__wrap span"); //์˜ค๋ฒ„ ํšจ๊ณผ
const menu = document.querySelectorAll("#header ul li"); // ๋ฉ”๋‰ด ์„ ํƒ
const srcBtn = document.querySelectorAll(".modal__btn"); //์†Œ์Šค๋ณด๊ธฐ ๋ฒ„ํŠผ ์„ ํƒ

//๋งˆ์šฐ์Šค๊ฐ€ ์œˆ๋„์šฐ ๋ธŒ๋ผ์šฐ์ € ๋‚ด์—์„œ ์›€์ง์ผ ๊ฒฝ์šฐ ์ด๋ฒคํŠธ ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ (e๋Š” ๋งˆ์šฐ์Šค ์š”์†Œ๋ฅผ ์˜๋ฏธ)
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(์„ ํƒ์ž, {duration: ์ง€์†์‹œ๊ฐ„, ์™ผ์ชฝ X์ขŒํ‘œ์˜ ์œ„์น˜๊ฐ’, ์œ„์ชฝ Y์ขŒํ‘œ ์œ„์น˜๊ฐ’}); : 2๊ฐœ์˜ ์ปค์„œ์˜ ์ง€์†์‹œ๊ฐ„์™€ ์œ„์น˜์˜ ์ฐจ์ด๋ฅผ ํ†ตํ•œ ๋”œ๋ ˆ์ด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋”ฐ๋ผ์˜ค๋Š” ๋“ฏํ•œ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ตฌํ˜„ํ•œ๋‹ค.
    gsap.to(cursor, {duration: 0.15, left: e.pageX -5, top: e.pageY -5});
    gsap.to(cursor2, {duration: 0.5, left: e.pageX -15, top: e.pageY -15});

    //์˜ค๋ฒ„ํšจ๊ณผ(ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ์‚ฌ์šฉ : ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์—์„œ๋Š” this๊ฐ€ ๋จนํžˆ์ง€ ์•Š๋Š”๋‹ค.)
    // ์ฆ‰ this๋ฅผ ์“ฐ๊ธฐ ์œ„ํ•ด์„  ์˜›๋‚  ๋ฌธ๋ฒ•(function)์œผ๋กœ ์งœ์•ผํ•œ๋‹ค.
    //mouseenter / mouseover => ์ด๋ฒคํŠธ๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ์ž์‹์š”์†Œ์—๊ฒŒ ์˜ํ–ฅ์„ ์ฃผ๋Š”๊ฐ€์˜ ์ฐจ์ด๋กœ ์ฆ‰ ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง์— ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.
    span.forEach(span => {
        //๋งˆ์šฐ์Šค๊ฐ€ ์˜์—ญ ์•ˆ์œผ๋กœ ๋“ค์–ด์˜ฌ ๋•Œ active ๋ถ™์ด๊ธฐ
        span.addEventListener("mouseenter", () => {
            cursor.classList.add("active");
            cursor2.classList.add("active");
        });
        //๋งˆ์šฐ์Šค๊ฐ€ ์˜์—ญ์—์„œ ๋– ๋‚ฌ์„ ๋•Œ
        span.addEventListener("mouseleave", () => {
            cursor.classList.remove("active");
            cursor2.classList.remove("active");
        });   
    });

    //EventTarget์œผ๋กœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”๋‰ด์™€ ์†Œ์Šค๋ณด๊ธฐ์—๋„ ํšจ๊ณผ ์ฃผ๊ธฐ
    menu.forEach(menu => {
        menu.addEventListener("mouseenter", () => {
            cursor.classList.add("active");
            cursor2.classList.add("active");
        });
        menu.addEventListener("mouseleave", () => {
            cursor.classList.remove("active");
            cursor2.classList.remove("active");
        });
    });
    srcBtn.forEach(srcBtn => {
        srcBtn.addEventListener("mouseenter", () => {
            cursor.classList.add("active");
            cursor2.classList.add("active");
        });
        srcBtn.addEventListener("mouseleave", () => {
            cursor.classList.remove("active");
            cursor2.classList.remove("active");
        });
    });

    //2๋ฒˆ์งธ ๋ฐฉ๋ฒ• : EventTarget์œผ๋กœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฌธ์„œ์—์„œ ๋ฐ”๋กœ ์„ ํƒํ•˜๊ธฐ
    // document.querySelector(".modal__btn").addEventListener("mouseenter", () => {
    //     cursor.classList.add("active");
    //     cursor2.classList.add("active");
    // });
    // document.querySelector(".modal__btn").addEventListener("mouseleave", () => {
    //     cursor.classList.remove("active");
    //     cursor2.classList.remove("active");
    // });
});

โœ๏ธ ์Šคํฌ๋ฆฝํŠธ ๋ณด๊ธฐ : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ

! JAVASCRIPT TIP !
1. ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์˜ ๋ฉ”์„œ๋“œ ์ค‘ mousemove๋ฅผ ํ†ตํ•ด ๋งˆ์šฐ์Šค๊ฐ€ ์›€์ง์ผ ๋•Œ ์‹คํ–‰๋˜๋Š” ์ด๋ฒคํŠธ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
2. ํ•จ์ˆ˜ ์•ˆ์— ๊ฐ๊ฐ ๋งˆ์šฐ์Šค ์ปค์„œ2๊ฐœ์˜ ์›€์ง์ž„์˜ ์ฐจ์ด๋ฅผ GSAP์„ ํ†ตํ•ด ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.
3. ๊ทธ ๋‹ค์Œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์˜ mouseenter()์™€ mouseleave() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•˜์—ฌ active๊ฐ€ ๋ถ™์—ˆ์„ ๊ฒฝ์šฐ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์ž‘๋™๋˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
4. ์ด๋ฒคํŠธ๊ฐ€ ๋ฐ˜๋ณต์ด ๊ณ„์† ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ ๊ผญ forEach๋ฌธ์„ ๋จผ์ € ์ž‘์„ฑํ•œ ๋’ค ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋„๋ก ํ•œ๋‹ค.


#3. ๊ฒฐ๊ณผ ๋ณด๊ธฐ ๐ŸŽ‰

์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ ์กฐ๊ธˆ ๊ถ๊ธˆ์ฆ์ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค,, ์†Œ์Šค๋ณด๊ธฐ ๋ฒ„ํŠผ์— ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ด๋ฒคํŠธ๋ฅผ ๊ตฌํ˜„ํ–ˆ์„ ๊ฒฝ์šฐ ์„ ํƒ์ž๋ฅผ querySelector๊ฐ€ ์•„๋‹Œ All๋กœ ํ•ด์ฃผ์–ด์•ผ ์‹คํ–‰์ด ๋˜๋”๋ผ๊ตฌ์š”...
์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ๋ฐ All์„ ๋ถ™์—ฌ์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ์•„๋ฌด๋ฆฌ ๋ด๋„ ๋ชจ๋ฅด๊ฒ ๋„ค์š”ใ… ใ…  ๋ฉ์ฑ™์ด... ์ด์œ ๋ฅผ ์•„์‹ ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ์“ฐ์œผ์œผ์œฝ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค์š”..
์ถ”๊ฐ€๋กœ ์œ„์— ๊ถ๊ธˆ์ฆ ๋•Œ๋ฌธ์— ๊ตฌ๋…ํ•˜์‹  ๋ถ„์„ ์ฐธ๊ณ ํ•˜๋Ÿฌ ๋“ค์–ด๊ฐ”๋Š”๋ฐ ๋ณ€์ˆ˜๋ฅผ ์ฃผ์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ์„ ํƒ์ž๋กœ ๋ฐ˜๋ณต๋ฌธ์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์–ด ์ถ”๊ฐ€ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹น.. ์Šคํฌ๋ฆฝํŠธ ๋„ˆ๋ฌด ์–ด๋ ต๋‹ค... ๐Ÿฅน

728x90

๋Œ“๊ธ€


Lucky Charms Rainbow
js
html
css