Giant Danio Fish
본문 바로가기
Javascript_Effect

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

by 코딩왕자 2022. 9. 18.

마우스 효과

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

오늘은 GSAP를 사용해서 마우스 커서를 부드럽게 따라다니는 효과를 만들어보겠습니다.


결과


HTML 작성

원 두개가 따라다니게 만들것이므로 커서1,커서2를 만들어주고 글이 나올 박스를 하나 만들어줍니다.

소스 보기
<main id="main">
    <section id="mouseType">
        <div class="mouse__cursor"></div>
        <div class="mouse__cursor2"></div>
        <div class="mouse__wrap">
            <p>There is no <span>masterpiece</span> made by a lazy artist.</p>
            <p>게으른 예술가가 만든 <span>명작</span>은 없다.</p>
        </div>
  
    </section>
</main>

CSS 작성

커서를 없앤 후 따라다닐 원을 만들어줍니다. 그리고 active1,2,3이 붙었을 때 변하는 모양을 디자인 해줍니다.

소스 보기
/* 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: 10px;
    height: 10px;
    z-index: 10002;
    border-radius: 50%;
    background: rgba(255,255,255,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: 10001;
    border-radius: 50%;
    background: rgba(255,255,255,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(232,146,0,0.6);
}
.mouse__cursor.active {
    transform: scale(0);
}
.mouse__cursor2.active {
    transform: scale(5);
    background: rgba(232,146,0,0.6);
}
.mouse__cursor.active2 {
    transform: scale(0);
}
.mouse__cursor2.active2 {
    transform: scale(6) rotateY(720deg);
    background: rgba(77, 185, 75, 0.6);
}
.mouse__cursor.active3 {
    transform: scale(0);
}
.mouse__cursor2.active3 {
    transform: scale(5) rotate(360deg);
    background: rgba(91, 76, 179, 0.818);
    border-radius: 0;
}

JS 작성

GSAP 스크립트를 다운받고 src로 연동시켜줍니다, 커서1과 커서2를 변수로 만든 후 gsap를 이용해 각 커서에 좌표값을 할당합니다. 마우스를 올려 놨을 때 변할곳을 span,2,3이라는 각각 변수로 만든 후, 마우스가 올라갔을 때와 마우스가 떨어졌을 때 active 클래스를 추가해서 만든 원의 스타일 값이 변하도록 만들어 줍니다.

<script src="../assets/js/gsap.min.js"></script>
<script>
    const cursor = document.querySelector(".mouse__cursor");
    const cursor2 = document.querySelector(".mouse__cursor2");
    const span = document.querySelectorAll(".mouse__wrap span");
    const span2 = document.querySelectorAll("#header ul li");
    const span3 = document.querySelectorAll(".modal__wrap .modal__btn");

    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 / 이벤트 버블링
        // (화살표함수를 쓰면 this 를 사용할수 없다!!)
        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");
            });
        });

        span2.forEach(span2 => {
            span2.addEventListener("mouseenter", ()=>{
                cursor.classList.add("active2");
                cursor2.classList.add("active2");
            });
            span2.addEventListener("mouseleave", ()=>{
                cursor.classList.remove("active2");
                cursor2.classList.remove("active2");
            });
        });

        span3.forEach(span3 => {
            span3.addEventListener("mouseenter", ()=>{
                cursor.classList.add("active3");
                cursor2.classList.add("active3");
            });
            span3.addEventListener("mouseleave", ()=>{
                cursor.classList.remove("active3");
                cursor2.classList.remove("active3");
            });
        });
    });
</script>

댓글


광고 준비중입니다