Fast Blinking Hello Kitty

JAVASCRIPT

Mouse효과 만들기

코른이되고싶은코린이 2023. 3. 20. 19:57

728x90

Mouse Effect

다음 이미지처럼 마우스의 위치정보 불러오기, 선택자별 마우스효과를 만들어 보겠습니다.

코드블럭

<!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>마우스이펙트</title>

    <link rel="stylesheet" href="css/reset.css">
    <link rel="stylesheet" href="css/mouse.css">
    <style>
        .mouse__wrap{
            cursor: none;
        }
        .mouse__cursor{
            position: absolute;
            left: 0;
            top: 0;
            width: 50px;
            height: 50px;
            border-radius: 50%;
            border: 3px solid #fff;
            background-color: rgba(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 0.3s,
                border 0.3s
            ;
        }
        .mouse__cursor.s1{
            background-color: rgba(203, 134, 160, 0.4);
            border-color: #ce7082;
            transform: rotate(360deg);
            border: 5px dotted #f6d2f1;
        }
        .mouse__cursor.s2{
            background-color: rgba(114, 207, 219, 0.4);
            border-color: #ce7082;
            transform: scale(2) rotateY(720deg);
        }
        .mouse__cursor.s3{
            background-color: rgba(177, 219, 166, 0.4);
            border-color: #ce7082;
            transform: scale(1.5) rotateX(545deg);
        }
        .mouse__cursor.s4{
            background-color: rgba(177, 219, 166, 0.4);
            border-color: #ce7082;
            transform: scale(10);
            border-radius: 0;
        }
        .mouse__cursor.s5{
            background-color: rgba(119, 128, 188, 0.4);
            border-color: #ce7082;
            transform: scale(3) skew(150deg);
            /* border-width: 0; */
            /* border-radius: 10px; */
        }
        .mouse__cursor.s6{
            background-color: rgba(177, 219, 166, 0.4);
            border-color: #ce7082;
            transform: scale(0.1);
        }        
        .mouse__text{
            width: 100%;
            height: 100vh;
            display: flex;
            align-items: center;
            justify-content: center;
            flex-direction: column;
        }
        .mouse__text p {
            font-size: 2vw;
            line-height: 2;
        }
        .mouse__text p span {
            color: #ce7082;
            border-bottom: 1px dashed #ce7082;
        }
        .mouse__text p:last-child {
            font-size: 3vw;
        }
        .mouse__info{
            position: absolute;
            left: 0;
            bottom: 0;
            padding: 20px;
            font-size: 16px;
            line-height: 1.6;
        }

    </style>
</head>
<body class="img01 bg01 font02">
    <header id="header">
        <h1>Javascript Mouse Effect01</h1>
        <p>마우스 이펙트 - 마우스 따라다니기</p>
        <ul>
            <li class="active"><a href="mouseEffect01.html">1</a></li>
            <li><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__text">
                <p><span class="s1">Failure</span>is simply the <span class="s2">opportunity</span> to <span class="s3">begin</span>again, this time more intelligently.</p>
                <p><span class="s4">실패</span>는 더 현명하게 다시 <span class="s5">시도</span>할 수 있는 <span class="s6">기회</span>일 뿐이다.</p>
            </div>
        </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>
    </main>
    <!-- main -->

    <footer id="footer">
        <a href="mailto:lee3ll@naver.com">lee3ll@naver.com</a>
    </footer>
    <!--footer  -->
    <script>
        window.addEventListener("mousemove", function(event){
            document.querySelector(".clientX").innerHTML = event.clientX;
            document.querySelector(".clientY").innerHTML = event.clientY;
            document.querySelector(".offsetX").innerHTML = event.offsetX;
            document.querySelector(".offsetY").innerHTML = event.offsetY;
            document.querySelector(".pageX").innerHTML = event.pageX;
            document.querySelector(".pageY").innerHTML = event.pageY;
            document.querySelector(".screenX").innerHTML = event.screenX;
            document.querySelector(".screenY").innerHTML = event.screenY;
        });    

        //선택자
        const cursor = document.querySelector(".mouse__cursor");

        window.addEventListener("mousemove", function(e){
            cursor.style.left = e.clientX -25 + "px";
            cursor.style.top = e.clientY -25 + "px";
        });

        //getttribute(); //속성값을 불러오기
        document.querySelectorAll(".mouse__text span").forEach(function(span){
            let attr = span.getAttribute("class");
            //attr = s1 s2 s3 s4 s5 s6
            span.addEventListener("mouseover", function(){
                cursor.classList.add(attr);
            });
            span.addEventListener("mouseout", function(){
                cursor.classList.remove(attr);
            });
        });


    </script>
</body>
</html>

보충설명

이미지출처

clientX, clientY 브라우저에서 사용자에게 웹페이지가 보여지는 영역을 기준으로 좌표를 표시합니다.
따라서, 스크롤바가 움직이더라도, 특정 지점의 clientX, clientY의 값은 동일합니다.
offsetX, offsetY 표를 출력하도록 하는 이벤트가 걸려있는 DOM node를 기준으로 좌표를 표시합니다.
만약 특정 div 영역에서 offsetX, offsetY를 출력한다면,
div의 왼쪽 상단 모서리 부분의 offsetX, offsetY의 값은 (0, 0)일 것입니다.
pageX, pageY 전체 문서를 기준으로 한 좌표를 표시합니다.
위 그림과 같이, 만약 문서를 표현할 때 스크롤이 생긴다면,
특정 지점의 pageY 좌표값은 페이지가 스크롤 될때마다 변경 될 것입니다.
screenX, screenY 사용자 모니터 화면을 기준으로 한 좌표를 표시합니다.
사용자 모니터의 왼쪽 상단 모서리가 (0, 0)이 됩니다.

✨".clientX"에 선택자를 주어  mousemove/ event.clientX 이벤트를 넣어 clientX좌표값을 불러줍니다.

✨마우스오버 효과를 주기 위해 <p>태그에서 단어별 <span>태그를 줍니다. <span>에는 각각 class이름을 s1~s6으로 만들어줍니다.

 document.querySelectorAll(".mouse__text span").forEach(function(span){
            let attr = span.getAttribute("class");
            //attr = s1 s2 s3 s4 s5 s6
            span.addEventListener("mouseover", function(){
                cursor.classList.add(attr);
            });
            span.addEventListener("mouseout", function(){
                cursor.classList.remove(attr);
            });
        });

✨querySelectorAll 태그와 forEach문으로 span태그를 전부를 선택하여 mouseover와 mouseout이라는 마우스 이벤트효과를 더해줍니다.