Animated Turtle

Javascript

마우스를 따라다니는 효과 만들기2(gsap)

훙구 2023. 3. 21. 13:12

...

728x90
반응형

마우스 위치를 따라다니는 효과 만들기 (gsap 사용)

페이지 미리보기

HTML 작성하기

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>02. 마우스 이펙트</title>

    <link rel="stylesheet" href="css/reset.css">
    <link rel="stylesheet" href="css/mouse.css">
</head>
<body class="img02 bg02 danjunghae">
    <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>
        </ul>
    </header>
    <!-- header -->

    <main id="main">
        <div class="mouse__wrap">
            <div class="mouse__cursor"></div>
            <div class="mouse__cursor2"></div>
            <div class="mouse__cursor3"></div>
            <div class="mouse__text">
                <p>Age is no guarantee of <span>maturity</span>.</p>
                <p>나이가 <span>성숙</span>을 보장하지는 않는다.</p>
            </div>
        </div>
    </main>
    <!-- main -->

    <footer id="footer">
        <a href="mailto:gnsrbdi@naver.com">gnsrdbi@naver.com</a>
    </footer>
    <!-- footer -->
</body>
</html>

HTML 정리해보기

  • 1번페이지와 거의 동일하게 만들었지만 마우스를 따라다니는 "mouse__cursor" 박스를 2개 더 만들어 총 세개를 만들어 주었습니다.
  • 2번 페이지에서는 2번 이미지와 2번의 배경색을 사용하기 위해 class에 img02와 bg02를 추가했습니다.

CSS 작성하기

.mouse__wrap {
    cursor: none;
}
.mouse__text {
    width: 100%;
    height: 100vh;
    display: flex;
    align-items: center;
    justify-content: center;
    flex-direction: column;
    overflow: hidden;
}
.mouse__text p {
    font-size: 2vw;
    line-height: 1.5;
}
.mouse__text p:last-child {
    font-size: 4vw;
}
.mouse__text p span {
    color: rgb(243, 223, 136);
}
.mouse__cursor {
    position: absolute;
    left: 0;
    top: 0;
    width: 10px;
    height: 10px;
    z-index: 9999;
    border-radius: 50%;
    background-color: rgba(255, 255, 255, 0.3);
    user-select: none;
    pointer-events: none;
    transition: transform 0.3s;
}
.mouse__cursor2 {
    position: absolute;
    left: 0;
    top: 0;
    width: 30px;
    height: 30px;
    z-index: 9998;
    border-radius: 50%;
    background-color: rgba(255, 255, 255, 0.3);
    user-select: none;
    pointer-events: none;
    transition: transform 0.3s;
}
.mouse__cursor3 {
    position: absolute;
    left: 0;
    top: 0;
    width: 40px;
    height: 40px;
    z-index: 9997;
    border-radius: 50%;
    background-color: rgba(255, 255, 255, 0.3);
    user-select: none;
    pointer-events: none;
    transition: transform 0.3s, border 0.3s;
}
.mouse__cursor.active {
    transform: scale(0);
}
.mouse__cursor2.active {
    transform: scale(5);
    background-color: #ffd380a6;
}
.mouse__cursor3.active {
    transform: scale(5);
    background-color: #ffd380a6;
}

.mouse__cursor.active2 {
    transform: scale(0);
}
.mouse__cursor2.active2 {
    transform: scale(3) rotateY(540deg);
    background-color: #dfff4ea6;
}
.mouse__cursor3.active2 {
    transform: scale(3);
    background-color: #fcb74f;
}

.mouse__cursor.active3 {
    transform: scale(2);
    background-color: #da6e6e;
    border-radius: 20%;
}
.mouse__cursor2.active3 {
    transform: scale(3) rotateY(540deg);
    border: 2px dotted #cfc750;
    background-color: #9fb639a6;
}
.mouse__cursor3.active3 {
    transform: scale(3) rotateX(540deg);
    border: 2px dotted #bbe966;
    background-color: #74c952;
}

CSS 정리해보기

  • 1번 페이지와 reset.css / mouse.css 를 사용하는 것은 동일합니다.
  • "mouse__cursor" 세 부분에 같은 모양에 크기만 다르게 설정해 주었습니다.
  • 1번 페이지에는 본문의 span 태그에만 효과를 주었는데 2번 페이지에는 제목부분과 하단 메일부분에도 효과를 주기위해 active 또한 번호를 붙여 세 개를 미리 작업해 주었습니다.

Javascript 작성하기

// 선택자
const cursor = document.querySelector(".mouse__cursor");
const cursor2 = document.querySelector(".mouse__cursor2");
const cursor3 = document.querySelector(".mouse__cursor3");
const cursors = document.querySelectorAll(".mouse__text span");

window.addEventListener("mousemove", e => {
    gsap.to(cursor, {duration: 0.2, left: e.pageX -5, top: e.pageY -5});
    gsap.to(cursor2, {duration: 0.4, left: e.pageX -15, top: e.pageY -15});
    gsap.to(cursor3, {duration: 0.6, left: e.pageX -20, top: e.pageY -20});
    
    cursors.forEach(function (el){
        el.addEventListener("mouseenter", () => {
            cursor.classList.add("active");
            cursor2.classList.add("active");
            cursor3.classList.add("active");
    	});
        el.addEventListener("mouseleave", () => {
            cursor.classList.remove("active");
            cursor2.classList.remove("active");
            cursor3.classList.remove("active");
        });
    });
    // 제목 부분
    document.querySelector("#header h1").addEventListener("mouseenter", () => {
        cursor.classList.add("active2");
        cursor2.classList.add("active2");
        cursor3.classList.add("active2");
    });
    document.querySelector("#header h1").addEventListener("mouseleave", () => {
        cursor.classList.remove("active2");
        cursor2.classList.remove("active2");
        cursor3.classList.remove("active2");
    });
    // 메일 부분
    document.querySelector("#footer a").addEventListener("mouseenter", () => {
        cursor.classList.add("active3");
        cursor2.classList.add("active3");
        cursor3.classList.add("active3");
    });
    document.querySelector("#footer a").addEventListener("mouseleave", () => {
        cursor.classList.remove("active3");
        cursor2.classList.remove("active3");
        cursor3.classList.remove("active3");
    });
});

Javascript 정리해보기

  • 1번 페이지와 마찬가지로 마우스의 좌표 값을 받아오기 위해 window.addEventListener("mousemove", e => {})로 작업해주었습니다.
  • 2번 페이지에는 함수를 화살표 함수로 사용하였습니다.
  • 1번 페이지와 달리 gsap를 사용해 마우스의 좌표를 각각의 cursor들에게 넣어주었습니다.
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.11.5/gsap.min.js"></script>
  • gsap를 사용하기 위해 gsap 사이트에서 링크를 받아왔습니다.
  • gsap 기본문 : gsap.to(선택자, {});
  • 그 외 에는 각각의 선택자에게 addEventListener(mouseenter) // (mouseleave) 를 사용해 각각의 cursor에게 "active" class를 추가해 주었습니다.
  • mouseenter : 마우스가 요소에 들어갔을 시 // mouseleave : 마우스가 요소에서 나왔을 시
  • 본문의 span은 한 개가 아니기 때문에 querySelectorAll과 forEach를 사용하였고
  • 제목과 메일부분은 querySelector를 사용해 각각의 선택자를 만들어 적용하였습니다.

 

 

이상으로 마우스 효과를 적용한 페이지(gsap 사용)를 만들어 보았습니다 !

728x90
반응형