Giant Danio Fish
본문 바로가기
Javascript_Effect

마우스 이펙트 - 기울기 효과 글씨 반전 효과

by 코딩왕자 2022. 9. 28.

마우스 효과

마우스 이펙트 - 기울기 효과 글씨 반전 효과

가운데 이미지를 넣어서 이미지와 설명은 기울이면서 3d효과가 나게 만들고 마우스 커서에 글씨를 가져다 대면 반전효과를 만들어보겠습니다.


결과


HTML 작성

가운데 넣을 이미지와, 사용할 커서, 마우스 위치 정보를 알려줄 박스를 만들어줍니다.

소스 보기
<main id="main">
    <section id="mouseType">
        <div class="mouse__cursor"></div>
        <div class="mouse__wrap">
            <div class="mouse__img">
                <figure>
                    <img src="../assets/img/effect_bg14.jpg" alt="이미지">
                </figure>
                <figcaption>
                    <p>Don't cry for the dead Because he is resting.</p>
                    <p>죽은자를 위해 울지 말라. 그는 휴식을 취하고 있기 때문이다.</p>
                </figcaption>
            </div>                    
        </div>
    </section>
    <div class="mouse__info">
        <ul>
            <li>pageX : <span class="mousePageX">0</span>px</li>
            <li>pageY : <span class="mousePageY">0</span>px</li>
            <li>centerPageX : <span class="centerPageX">0</span>px</li>
            <li>centerPageY : <span class="centerPageY">0</span>px</li>
            <li>maxPageX : <span class="maxPageX">0</span>px</li>
            <li>maxPageY : <span class="maxPageY">0</span>px</li>
            <li>anglePageX : <span class="anglePageX">0</span>px</li>
            <li>anglePageY : <span class="anglePageY">0</span>px</li>
        </ul>
    </div>
</main>

CSS 작성

이미지와 글씨에 3D효과를 주고 mix-blend-mode: difference 를 사용해서 마우스 반전 효과를 만들어 줍니다.

소스 보기
/* mouseType */
.mouse__wrap {
    display: flex;
    align-items: center;
    justify-content: center;
    font-display: column;
    color: #fff;
    width: 100%;
    height: 100vh;
    overflow: hidden;
    cursor: none;
}
.mouse__img {
    transform: perspective(600px) rotateX(0deg) rotateY(0deg);
    transform-style: preserve-3d;
    will-change: transform;
}
.mouse__img figcaption {
    position: absolute;
    left: 50%;
    top: 50%;
    font-size: 1vw;
    line-height: 1.6;
    transform: translate3d(-50%, -50%, 100px);
    padding: 1vw;
    white-space: nowrap;
    text-align: center;
    background: rgba(0,0,0,0.4);
}
.mouse__wrap figure {
    width: 40vw;
}
.mouse__wrap figure::before {
    content: '';
    position: absolute;
    left: 5%;
    bottom: -30px;
    width: 90%;
    height: 40px;
    background: url(../assets/img/effect_bg14.jpg) center no-repeat;
    background-size: 100% 40%;
    filter: blur(15px) grayscale(50%);
    z-index: -1;
}
.mouse__cursor {
    position: absolute;
    left: 0;
    top: 0;
    width: 100px;
    height: 100px;
    border-radius: 50%;
    background: #fff;
    z-index: 1000;
    pointer-events: none;
    user-select: none;
    mix-blend-mode: difference;
}
.mouse__info {
    position: absolute;
    left: 20px;
    bottom: 10px;
    font-size: 14px;
    line-height: 1.6;
    color: #fff;
}

JS 작성

마우스 좌표값은 각각 위치에 출력시켜주고, 마우스 커서의 위치에 따라 사진과 글씨가 움직이도록 만들어줍니다. 스크립트는 주석표시로 보셔서 이해하시면 되고 자주쓰는거 설명드리겠습니다. 최소값 최대값 설정하는 식입니다.
ex) let maxPageX = max(4, max(2,3));라면 2와3중 큰값인 3이 출력되고, 4와 3중 큰값인 4가 출력되어서 값이 4가 출력되는것입니다.

<script src="../assets/js/gsap.min.js"></script>
<script>
    const mouseMove = (e) => {
        // 마우스 좌표값
        let mousePageX = e.pageX;
        let mousePageY = e.pageY;

        // 마우스 좌표 기준점을 가운데로 변경
        let centerPageX = window.innerWidth / 2 - mousePageX;
        let centerPageY = window.innerHeight / 2 - mousePageY;

        // 최소값은 -100 최대값은 100 설정
        let maxPageX = Math.max(-200, Math.min(200, centerPageX));
        let maxPageY = Math.max(-200, Math.min(200, centerPageY));

        //각도 줄이는 설정
        let anglePageX = maxPageX * 0.1;
        let anglePageY = maxPageY * 0.1;

        // 부드럽게 설정
        let softPageX = 0, softPageY = 0;
        softPageX += (anglePageX - softPageX) * 0.4;    
        softPageY += (anglePageY - softPageY) * 0.4;

        // 이미지 움직이기
        const imgMove = document.querySelector(".mouse__img");
        imgMove.style.transform = "perspective(600px) rotateX(" + softPageY + "deg) rotateY(" + -softPageX + "deg)";

        //커서
        gsap.to(".mouse__cursor", {duration: .3, left: mousePageX - 50 , top: mousePageY - 50})

        // 마우스 좌표값 출력
        document.querySelector(".mousePageX").textContent = mousePageX;
        document.querySelector(".mousePageY").textContent = mousePageY;
        document.querySelector(".centerPageX").textContent = centerPageX;
        document.querySelector(".centerPageY").textContent = centerPageY;
        document.querySelector(".maxPageX").textContent = maxPageX;
        document.querySelector(".maxPageY").textContent = maxPageY;
        document.querySelector(".anglePageX").textContent = Math.round(anglePageX);
        document.querySelector(".anglePageY").textContent = Math.round(anglePageY);
    }

    window.addEventListener("mousemove", mouseMove);
</script>

댓글


광고 준비중입니다