Giant Danio Fish
본문 바로가기
Javascript_Effect

마우스 이펙트 - 마우스 따라다니기

by 코딩왕자 2022. 9. 12.

마우스 효과

마우스 이펙트 - 마우스 따라다니기

마우스 커서를 따라다니는 마우스에 효과주는법을 배워보도록 합시다.


결과


HTML 작성

배경에 사진을 넣도록 배경과, 글씨들 중간중간 중요한 단어들을 span으로 처리했습니다. 좌측 아래에 마우스커서의 위치를 나타내는 메서드들을 작성할 박스를 만들어줍니다.

소스 보기
<main id="main">
    <section id="mouseType">
        <div class="mouse__cursor"></div>
        <div class="mouse__wrap">
            <p>I haven't <span class="style1">failed</span>. I've <span class="style2">discovered</span> 10,000 <span class="style3">ways</span> that don't work.</p>
            <p>나는 <span class="style4">실패</span>한 게 아니다. 나는 잘 되지 않는 <span class="style5">방법</span> 1만 가지를 <span class="style6">발견</span>한 것이다.</p>
        </div>
  
        <div class="mouse__info">
            <ul>
                <li>clientX : <span class="clientX">0</span>px</li>
                <li>clientY : <span class="clientY">0</span>px</li>
                <li>offsetX : <span class="offsetX">0</span>px</li>
                <li>offsetY : <span class="offsetY">0</span>px</li>
                <li>pageX : <span class="pageX">0</span>px</li>
                <li>pageY : <span class="pageY">0</span>px</li>
                <li>screenX : <span class="screenX">0</span>px</li>
                <li>screenY : <span class="screenY">0</span>px</li>
            </ul>
        </div>
    </section>
</main>

CSS 작성

마우스의 커서를 없애고 원모양이 마우스를 따라다니도록 만들었습니다.

소스 보기
/* mouseType */
.mouse__wrap {
    width: 100%;
    height: 100vh;
    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: 300;
}
.mouse__wrap p:last-child {
    font-size: 2.5vw;
    font-weight: 400;
}
.mouse__wrap p span {
    border-bottom: 0.15vw dashed red;
    color: red;
}
@media (max-width: 800px){
    .mouse__wrap p {
        padding: 0 20px;
        font-size: 30px;
        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 {
    position: absolute;
    left: 0;
    top: 0;
    width: 50px;
    height: 50px;
    border-radius: 50%;
    border: 3px solid #fff;
    background-color: rgb(255,255,255,0.1);
    user-select: none;
    pointer-events: none;
    transition:
        background-color 0.3s,
        border-color 0.3s,
        transform 0.6s,
        border-radius 1.3s
    ;
}
.mouse__cursor.style1 {
    background-color: rgba(0, 255, 255, 0.4);
    border-color: aqua;
}
.mouse__cursor.style2 {
    background-color: rgba(173, 255, 47, 0.4);
    border-color: greenyellow;
    transform: scale(2) rotateY(720deg);
}
.mouse__cursor.style3 {
    background-color: rgba(102, 51, 153, 0.4);
    border-color: rebeccapurple;
    transform: scale(2) rotateX(720deg);
}
.mouse__cursor.style4 {
    background-color: rgba(255, 215, 0, 0.4);
    border-color: gold;
    transform: scale(10) rotateX(720deg);
}
.mouse__cursor.style5 {
    background-color: rgba(238, 130, 238, 0.4);
    border-color: violet;
    transform: scale(6) rotateY(720deg);
}
.mouse__cursor.style6 {
    background-color: rgba(0, 0, 255, 0.4);
    border-color: blue;
    transform: scale(2);
    border-radius: 0;
}

.mouse__info {
    position: absolute;
    left: 20px;
    bottom: 10px;
    font-size: 14px;
    line-height: 1.6;
    color: #fff;
}

JS 작성

각각의 X,Y값을 나타내는 메서드들에 그 값을 넣었고, 그 값에 맞춰 만들어놓은 원이 마우스를 따라다니게 커서역할을 하도록 만들었으며, 글씨위에 올렸을 때 마우스 효과를 주었습니다.

window.addEventListener("mousemove", (event) => {
    document.querySelector(".clientX").innerText = event.clientX;
    document.querySelector(".clientY").innerText = event.clientY;
    document.querySelector(".offsetX").innerText = event.offsetX;
    document.querySelector(".offsetY").innerText = event.offsetY;
    document.querySelector(".pageX").innerText = event.pageX;
    document.querySelector(".pageY").innerText = event.pageY;
    document.querySelector(".screenX").innerText = event.screenX;
    document.querySelector(".screenY").innerText = event.screenY;
});

const cursor = document.querySelector(".mouse__cursor");
window.addEventListener("mousemove", (e) => {
  
  
  cursor.style.left = e.clientX - 25 + "px";          /* 단위를 꼭 적어주어야 한다. */
  cursor.style.top = e.clientY - 25 + "px";           /* 단위를 꼭 적어주어야 한다. */
});

// document.querySelector(".style1").addEventListener("mouseover", () => {
//     cursor.classList.add("style1");
// });
// document.querySelector(".style1").addEventListener("mouseout", () => {
//     cursor.classList.remove("style1");
// });
// document.querySelector(".style2").addEventListener("mouseover", () => {
//     cursor.classList.add("style2");
// });
// document.querySelector(".style2").addEventListener("mouseout", () => {
//     cursor.classList.remove("style2");
// });
// document.querySelector(".style3").addEventListener("mouseover", () => {
//     cursor.classList.add("style3");
// });
// document.querySelector(".style3").addEventListener("mouseout", () => {
//     cursor.classList.remove("style3");
// });
// document.querySelector(".style4").addEventListener("mouseover", () => {
//     cursor.classList.add("style4");
// });
// document.querySelector(".style4").addEventListener("mouseout", () => {
//     cursor.classList.remove("style4");
// });
// document.querySelector(".style5").addEventListener("mouseover", () => {
//     cursor.classList.add("style5");
// });
// document.querySelector(".style5").addEventListener("mouseout", () => {
//     cursor.classList.remove("style5");
// });
// document.querySelector(".style6").addEventListener("mouseover", () => {
//     cursor.classList.add("style6");
// });
// document.querySelector(".style6").addEventListener("mouseout", () => {
//     cursor.classList.remove("style6");
// });


// for 문 이용하기
// for (let i = 1; i <= 6; i++) {
  
//     document.querySelector(".style" + i ).addEventListener("mouseover", () => {
//     cursor.classList.add("style" + i );
//     });
//     document.querySelector(".style" + i ).addEventListener("mouseout", () => {
//     cursor.classList.remove("style" + i );
//     });
// }

// forEach 문 이용하기
// document.querySelectorAll(".mouse__wrap span").forEach((span, num) => {
//     span.addEventListener("mouseover", () => {
//         cursor.classList.add("style" + (num + 1));
//     });
//     span.addEventListener("mouseout", () => {
//         cursor.classList.remove("style" + (num + 1));
//     });
// });

// getAttribute 속성값 가져와서 작업하기
document.querySelectorAll(".mouse__wrap span").forEach((span) => {
  let attr = span.getAttribute("class");

  span.addEventListener("mouseover", () => {
      cursor.classList.add(attr);
  });
  span.addEventListener("mouseout", () => {
      cursor.classList.remove(attr);
  });
});

댓글


광고 준비중입니다