Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

Leeyanggoo

[JS] 마우스 이펙트 만들기3!! 조명처럼 빛나는 내 마우스! 본문

2023/JavaScript

[JS] 마우스 이펙트 만들기3!! 조명처럼 빛나는 내 마우스!

Leeyanggoo 2023. 3. 21. 19:32


이전의 마우스 이펙트는 자바스크립트의 라이브러리 "GSAP"를 이용해서 좀 더 커서가 부드러운 효과를 만들었습니다.

이제는 쭉 "GSAP"를 적용하는 방향으로 이펙트를 만드려 합니다!

이번에 만들 마우스 이펙트는 조명 효과를 낼 수 있는 기능입니다.

 

//CSS에 저장된 img03
body.img03 {
    background-image: url(../img/mouseEffect03-min.jpg);
}
body.bg03::after {
    background-color: rgba(245, 177, 121, 0.7);
}

<body class="img03 bg03 font03">
    <main id="main">
        <div class="mouse__wrap">
            <div class="mouse__cursor"></div>
            <div class="mouse__text">
                <p>I've never loved myself</p>
                <p>단 한번도 스스로를 사랑하지 않았노라</p>
            </div>
        </div>
    </main>
</body>

CSS를 적용해서 조명효과를 만들어보자!!

 

#header {
    z-index: 100;
    }
    #footer {
        z-index: 10;
    }
    .mouse__wrap {
        cursor: none;
    }
    .mouse__text {
        width: 100%;
        height: 100vh;
        display: flex;
        align-items: center;
        justify-content: center;
        flex-direction: column;
        overflow: hidden;
        position: relative;
        z-index: 10;
    }
    .mouse__text p {
        font-size: 3vw;
        line-height: 2;
    }
    .mouse__text p:last-child {
        font-size: 4vw;
    }
    .mouse__cursor {
        position: absolute;
        left: 0;
        top: 0;
        width: 200px;
        height: 200px;
        border-radius: 50%;
        border: 5px solid #fff;
        background-color: rgba(255,255,255,0.4);
        background-image: url(img/mouseEffect03-min.jpg);
        background-size: cover;
        background-position: center center;
        background-attachment: fixed;
    }

 

마우스 커서에 마치 조명처럼 뒷 배경을 비춰주는 이펙트를 만들기 위해선 배경 이미지에 대한 이해가 필요합니다.

위의 HTML의 body를 보시면 이미 배경 이미지가 CSS 속성으로 저장된 걸 알 수 있습니다.

하지만 ".mouse__cursor"의 background-image의 url에도 같은 이미지가 들어갈 걸 볼 수 있죠?

여기서 background-attachment에 대한 속성을 보고 가겠습니다!

 

background-attachment : 배경 이미지가 요소와 상대적으로 고정되는지 여부를 지정하는 속성입니다.

 

scroll 배경 이미지가 요소와 함께 스크롤됩니다.
fixed 배경 이미지가 뷰포트(viewport)에 고정됩니다. 요소와 함께 스크롤되지 않습니다.
local 배경 이미지가 요소와 함께 스크롤됩니다. 다만, 요소의 내부 스크롤 영역에서 스크롤되지 않습니다.
initial 기본값으로 설정합니다.
inherit 부모 요소로부터 값을 상속받습니다.

 

우리는 background-attachment의 "fixed"라는 속성을 이용해서 다른 하나의 원본 배경 이미지를 뷰포트에 고정시킬 수 있습니다.

이렇게 하면 이미지 2개가 겹쳐있는 것과 같은 상태가 되겠죠?

 

메서드 "getBoundingClientRect()"를 이용해보자!!

 

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

console.log(cursor.getBoundingClientRect());
//getBoundingClientRect()가 반환하는 DOMRect
const DOMRect = {
    bottom: 200,
    height: 200,
    left: 0,
    right: 200, 
    top: 0,
    width: 200, 
    x: 0,
    y: 0
}

 

getBoundingClientRect() : 요소(element)의 위치와 크기 정보를 반환하는 메서드입니다. 이 메서드를 호출하면 요소의 위치와 크기 정보가 포함된 DOMRect 객체를 반환합니다. DOMRect 객체는 left, top, right, bottom, width, height 속성을 가지고 있으며, 이를 통해 요소의 위치와 크기를 파악할 수 있습니다.

 

getBoundingClientRect()는 요소의 여러 위치와 크기 정보를 반환하는 메서드입니다.

따라서 커서의 위치와 크기 정보를 반환해서 ".mouse__cursor"의 배경 이미지만 비추게 한다면 마치 조명을 킨 것 같은 효과가 나게 할 수 있습니다!

 

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

const circle = cursor.getBoundingClientRect();

window.addEventListener("mousemove", e => {
    gsap.to(cursor, {
        duration: 0.5,
        left: e.pageX - circle.width/2,
        top: e.pageY - circle.height/2
    });
});

 

getBoundingClientRect()로 반환받을 커서의 위치와 크기 정보를 "circle"이라는 변수에 담습니다.

window.addEventListener()로 커서의 효과를 선택합니다.

GSAP를 이용해 추가적인 효과를 설정하면 조명 효과를 가진 커서가 완성됩니다!!


😮‍💨 이번 예제 보러 가기

😮‍💨 더 다양한 마우스 이펙트 보러 가기

😮‍💨 이전 마우스 이펙트 포스팅 보러 가기