마우스 이동에 따라 사진 움직이기(html, css, js)

2021. 3. 14. 17:48재미있는 웹

오늘 해볼 것들

 

마우스를 움직이는 대로 자동차나 배경이 다르게 변하는 화면을 만들어봅시다. 이번에도 html, css, js만을 사용해서 구현할 수 있습니다. 

 

<!DOCTYPE html>
<html>
    <head>
        <title>test</title>
        <meta charset="utf-8"/>
        <meta name="viewport" />
	</head>
    <body>
        <img src="tycan.png" id="car" />
        <img src="bg.png" id="background"/>
        
    </body>
</html>

 

기본적인 html 파일을 만들어 줍니다. 그런 다음 img를 사용해서 src로 이미지를 등록해서 화면을 볼 수 있습니다. 

 

이미지만 설정해주면 차례대로 나오기 때문에 겹치게 만들기 위해서 car의 position을 absolute로 만들어줍니다. 그리고 z-index를 숫자를 지정해서 앞으로 보이게 만들어줍니다. 

 

	body{
                
                background-color: black;
                overflow: hidden;
            }

            #background{
                width: 450px;
                margin-left: 40%;
            }

            #car{
                position: absolute;
                width: 300px;
                z-index: 100;
                left: calc(50% - 150px);
                margin-top: 20%;
            }

 

여기서 중요한 점이 car의 left입니다. left의 50% - 150px의 의미는 차를 가운데 위치로 맞추는 것입니다. 

 


            let car, background;
            let x = 0, y = 0;
            let mx = 0, my = 0;
            const speed = 0.03;

            const loop = () =>{
                mx += (x - mx) * speed;
                my += (y - my) * speed;
                window.requestAnimationFrame(loop);
            }

            const mouseFunc = (e) =>{
                x = (e.clientX-window.innerWidth/2), y = (e.clientY-window.innerHeight/2);
                car.style.transform = `translate(${-(mx/50)}px, ${-(my/50)}px)`;
                background.style.transform = `translate(${(mx/12)}px, ${(my/6)}px)`;
            }

            window.onload = () =>{
                car = document.getElementById("car");
                background = document.getElementById("background");
                loop();
                window.addEventListener("mousemove", mouseFunc);
            }

여기의 js 코드를 보면 이전의 예제와 특별히 다른 것은 없습니다. 하지만 차이점이 있다면 x와 y의 입력 값의 계산이 달라짐을 알 수있습니다. 

 

현재 사진의 위치가 정중앙을 0으로 맞추어 주는 것입니다.

 

e.clientX는 현재 마우스의 위치 값그리고 window.innerWidth는 window의 전체 가로길이의/2면 딱 반사이즈라서 빼주게 되면 가운데 좌표가 0이 되는 것과 같은 효과입니다. 또한 나누어줄 때 50과 12 등으로 다른 값으로 나누어 주었는데 앞에 있는 사진과 뒤의 사진을 다른 가속도로 움직이는 것을 보여주기 위함입니다.