html

마우스 이펙트 효과 - 02

grovy 2023. 3. 21. 12:49
728x90

마우스 이펙트 효과를 GSAP를 적용해봤어요 !

body를 먼저 볼게요 ! 

<body class="img02 bg03 font02">
    <header id="header">
        <h1>Javascript Mouse Effect02</h1>
        <p>마우스 이펙트 - 2</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__text">
                <P>Fix you course on a <span>star</span> and you'll <span>navigate any storm</span></P>
                <P>당신의 <span>별</span>을 보고 방향을 정해라. 그러면 <span>폭풍 속에서도 항해</span>를 계속 해 나갈 수 있을것이다</P>
            </div>
        </div>
    </main>
    <!--main-->
    <footer id="footer">
        <a href="mailto:getgrovy@gmail.com">getgrovy@gmail.com</a>
    </footer>

mouse_cursor 가 2개있네요? ? 

왜  ? why ? 2개의 마우스 커서가 마우스포인터를 따라다니게 할거니까요 

각각의 커서가 2가지 이펙트를 보여줄거고 <header>영역  <footer>영역, <span> 태그 부분에 효과를 부여할거에요

<script>안을 살펴 볼게요 ! 

<script>
    //선택자
    const cursor = document.querySelector(".mouse__cursor");
    const cursor2 = document.querySelector(".mouse__cursor2");

    //커서 좌푯값 할당
    window.addEventListener("mousemove", e => {
        //기존방식
        // cursor.style.left= e.pageX+"px";
        // cursor.style.top= e.pageY+"px";
        // cursor2.style.top= e.pageY+"px";
        // cursor2.style.top= e.pageY+"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});

        // 오버효과 노가다 
        // document.querySelector(".mouse__text span").addEventListener("mouseenter",() => {
        //     cursor.classList.add("active");
        //     cursor2.classList.add("active");
        // })

        // document.querySelector(".mouse__text span").addEventListener("mouseleave",() => {
        //     cursor.classList.remove("active");
        //     cursor2.classList.remove("active");
        // })
        
		//오버효과 forEach span
        document.querySelectorAll(".mouse__text span").forEach(el=>{
            el.addEventListener("mouseenter",() => {
                cursor.classList.add("active");
                cursor2.classList.add("active");
            });
            el.addEventListener("mouseleave",() => {
                cursor.classList.remove("active");
                cursor2.classList.remove("active");
            });
        });
        
		//오버효과 forEach header
        document.querySelectorAll("header ul").forEach(el=>{
            el.addEventListener("mouseenter",() => {
                cursor.classList.add("active2");
                cursor2.classList.add("active2");
            });
            el.addEventListener("mouseleave",() => {
                cursor.classList.remove("active2");
                cursor2.classList.remove("active2");
            });
        });
        
		//오버효과 forEach footer
        document.querySelectorAll("footer").forEach(el=>{
            el.addEventListener("mouseenter",() => {
                cursor.classList.add("active3");
                cursor2.classList.add("active3");
            });
            el.addEventListener("mouseleave",() => {
                cursor.classList.remove("active3");
                cursor2.classList.remove("active3");
            });
        });

기존 노가다 방식 & GSAP방식 GSAP ! 

  기존 GSAP : to()
pageX
pageY
 window.addEventListener("mousemove", e => {
            // cursor.style.left= e.pageX+"px";
            // cursor.style.top= e.pageY+"px";
            // cursor2.style.top= e.pageY+"px";
            // cursor2.style.top= e.pageY+"px";

 window.addEventListener("mousemove", e => {
            //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});

 window.addEventListener("mousemove", e => {})를 통해서 마우스가 움직 일때마다 이벤트를 발생시킵니다. 

기존엔 cursor에 스타일을 일일히 작업해야 했다면 

gsap의 to함수를 이용하여 보기 좋게 작업했어요 ! 

기존방식은 프레임 드랍이 생기지만 gsap는 컴퓨터의 그래픽 카드리소스를 써서 좀더 부드럽게 사용이 가능해요 

<script> forEach & getAttribute 2가지 방식을 연습해 볼거에요 ! 

forEach

// 오버효과 노가다 
// document.querySelector(".mouse__text span").addEventListener("mouseenter",() => {
//     cursor.classList.add("active");
//     cursor2.classList.add("active");
// })

// document.querySelector(".mouse__text span").addEventListener("mouseleave",() => {
//     cursor.classList.remove("active");
//     cursor2.classList.remove("active");
// })
        
//오버효과 forEach 
document.querySelectorAll(".mouse__text span").forEach(el=>{
// document.querySelectorAll(".mouse__text span")로  span목록을 뽑아와요!
// why? span 테그 위에서 이벤트를 발생시켜야하거든요 ! 
// forEach((el , i) 구문으로 반복시켜요 !
// el 은 document.querySelectorAll[0~5](".mouse__text span") 까지 반복해서 받는거에요 

    el.addEventListener("mouseenter",() => {
        cursor.classList.add("active");
        cursor2.classList.add("active");
    });
    el.addEventListener("mouseleave",() => {
        cursor.classList.remove("active");
        cursor2.classList.remove("active");
    });
});

forEach()방식 & 화살표 함수를 쓰니 적을게 많이 줄어들어 편해졌어요 ! 

getAttribute()

document.querySelectorAll(".mouse__text span").forEach(span=>{
// document.querySelectorAll(".mouse__text span")로  span목록을 뽑아와요!

    let attr = span.getAttribute("class");
// let attr = span.getAttribute("class"); 구문을통해서 span tag의 class명을 배열에 담아 가져와요 

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

getAttribute방식 & 화살표 함수를 쓰니 적을게 많이 줄어들어 편해졌어요 ! 

CSS효과를 볼게요 

.mouse__cursor {
    position: absolute;
    left: 0;
    top: 0;
    width: 10px;
    height: 10px;
    z-index: 9999;
    border-radius: 50%;
    background-color: rgb(125, 255, 255);
    user-select: none;
    pointer-events: none;
    transition: transform 0.3s;
}
.mouse__cursor2 {
    position: absolute;
    left: 0;
    top: 0;
    width: 30px;
    height: 30px;
    z-index: 9999;
    border-radius: 50%;
    background-color: rgb(0, 255, 255);
    user-select: none;
    pointer-events: none;
    transition: transform 0.3s;
}
.mouse__cursor.active { 
    transform: scale(0);
}
.mouse__cursor2.active {
    transform: scale(5);
    background-color: aquamarine;
}
.mouse__cursor.active2 { 
    background-color: #00ffff80;
    border-color: rgb(179, 255, 0);
    transform: scale(7) ;
    border-radius : 10px;
}
.mouse__cursor2.active2 {
    background-color: #7fffd4a2;
    border-color: rgb(255, 21, 0);
    transform: scale(1) ;
    border-radius : 10px;
}
.mouse__cursor.active3 { 
    background-color: rgba(255, 30, 0, 0.4);
    border-color: rgb(255, 21, 0);
    transform: scale(5) skew(140deg);
}
.mouse__cursor2.active3 {
    background-color: rgba(255, 30, 0, 0.4);
    border-color: rgb(255, 21, 0);
    transform: scale(10) rotateX(720deg);
}

마우스 이펙트 효과 -01

요기서 마우스 이펙트 효과를 확인할수 있어요 !