Giant Danio Fish
본문 바로가기
Javascript_Effect

마우스 이펙트 - 이미지 효과

by 코딩왕자 2022. 9. 22.

마우스 효과

마우스 이펙트 - 이미지 효과

가운데 이미지를 하나 더 넣어서 마우스 움직일때 가운데 이미지만 조금 움직여 이질감(?)이 느껴지는 효과를 넣어보겠습니다.


결과


HTML 작성

커서 한개와, 가운데 이미지를 넣을것이므로 figure태그를 만들어줍니다.

소스 보기
<main id="main">
    <section id="mouseType">
        <div class="mouse__cursor"></div>
        <div class="mouse__wrap">
            <figure>
                <img src="../assets/img/effect_bg14.jpg" alt="이미지">
                <figcaption>
                    <p>The present and the future are somehow connected.</p>
                    <p>현재와 미래는 어떻게든 연결되어 있다.</p>
                </figcaption>
            </figure>
        </div>
    </section>
</main>

CSS 작성

이미지를 정가운데에 만들어줍니다.

소스 보기
/* mouseType */
.mouse__wrap {
    width: 100%;
    height: 100vh;
    display: flex;
    align-items: center;
    justify-content: center;
    flex-direction: column;
    color: #fff;
    overflow: hidden;
}
.mouse__wrap figure {
    width: 50vw;
    height: 50vh;
    position: relative;
    overflow: hidden;
    transition: transform 500ms ease;
    cursor: none;
}
.mouse__wrap figure:hover {
    transform: scale(1.025);
}
.mouse__wrap figure img {
    position: absolute;
    left: -5%;
    top: -5%;
    width: 110%;
    height: 110%;
    object-fit: cover;
}
.mouse__wrap figure figcaption {
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%);
    text-align: center;
    font-size: 20px;
    white-space: nowrap;
    line-height: 1.4;
    font-weight: 300;
}
.mouse__cursor {
    position: absolute;
    left: 0;
    top: 0;
    width: 20px;
    height: 20px;
    background: #fff;
    border-radius: 50%;
    z-index: 1000;
    user-select: none;
    pointer-events: none;
}
.mouse__info {
    position: absolute;
    left: 20px;
    bottom: 10px;
    font-size: 14px;
    line-height: 1.6;
    color: #fff;
}

JS 작성

원을 마우스커서에 따라다니게 만들고 커서의 기준을 화면의 정가운데로 잡아줍니다. 만든 원 커서는 안쪽 사진에서만 움직이도록 만들고 바깥쪽에선 원래 커서가 보이도록 만듭니다. js를 이용해 만들어주니 부드러움이 덜 한거같아서 gsap로 작업하였습니다. 자세한 설명은 주석표시를 확인해주시기 바랍니다.

<script src="../assets/js/gsap.min.js"></script>
<script>
    document.querySelector(".mouse__wrap figure").addEventListener("mousemove", (e)=>{
        //커서
        gsap.to(cursor, {
            duration: .2,
            left: e.pageX - cursorRect.width/2,
            top: e.pageY - cursorRect.height/2,
        });

        // 마우스 좌표 값
        let mousePageX = e.pageX;
        let mousePageY = e.pageY;

        // 전체 가로값 구하기
        // window.innerWidth            //1920  브라우저 크기가 줄어들면 줄어든다. : 브라우저 크기
        // window.outerWidth            //1920 : 브라우저 크기(스크롤바 포함)
        // window.window.screen.width    //1920 브라우저 크기가 줄어들어도 감소X : 화면 크기

        // 마우스 좌표 값 가운데로 초기화

        // 전체 길이/2 - 마우스 좌표값 == 0
        let centerPageX = window.innerWidth/2 - mousePageX;         //좌표값 X축 기준을 0으로 만들기 위해서 (전체길이/2 - 마우스좌표값) == 0 을 기준으로 만들었습니다.
        let centerPageY = window.innerHeight/2 - mousePageY;

        // 이미지 움직이기
        const imgMove = document.querySelector(".mouse__wrap figure img");
        // imgMove.style.transform = "translate("+ centerPageX/20 +"px, "+ centerPageY/20 +"px)";        //가운데 0,0를 기준으로 이미지가 마우스값만큼 움직이도록 설정

        // js사용하면 부드러움이 부족해서 gsap 사용!!
        gsap.to(imgMove, {
            duration: 0.3,
            x: centerPageX/20,
            y: centerPageY/20
        })

        // 출력
        document.querySelector(".mousePageX").textContent = mousePageX;
        document.querySelector(".mousePageY").textContent = mousePageY;
        document.querySelector(".centerPageX").textContent = centerPageX;
        document.querySelector(".centerPageY").textContent = centerPageY;
    });
</script>

댓글


광고 준비중입니다