프론트엔드/TIL

애니메이션과 3D관련 속성을 이용한 간단한 동작구현

gimeast 2025. 6. 14. 02:42

오늘은 CSS로 3D animation을 구현하는 방법을 공부했다.

transform의 여러 속성들과 animation 관련 속성들로

이런 결과물을 만들어 냈다.

N장의 이미지가 원통 모양으로 배치되어 회전하는 구조 

원의 둘레 = 이미지의 너비 * 이미지 갯수
원의 반지름 = 원의 둘레 / (2 * 3.14)
각 이미지 사이의 각도 =  (360 / 이미지 갯수 ) * N

 

처음에 너무 많은 속성들을 한번에 공부해서 어떤 속성을 배웠는지 가물가물했다.

그래도 각 속성들을 이해하고 도움없이 다시 처음부터 만들어보는 작업을 하고나니 머릿속에 정리가 잘된거같다.

 

일단 위 공식을 이용해야한다.

 

wrapper(할아버지)

    item-container(부모님)
        item1(자식)

            img

        ......

 

html 구조는 이렇게 작성하였다.

 

 

 

 

 

 

 

 

 

 


## 구현 방법(핵심부분 위주로 작성)

1. 일단 부모의 중심점을 잡기위해 display: flex를 주고

justify-content:center로 중심을 잡는다.

중심점을 잡지 않으면 원하는 결과가 나오지 않는다.

 

2. 자식들에 transform의 rotateY와 translateZ에 위에서 본 공식값을 대입한다.

rotateY는 제자리에서 Y축 기준으로 회전을 할 수 있게 해준다.

translateZ는 원근감을 주는 요소인데 Z축으로 이동하게 해준다.

일단 rotateY에 위에서 본 공식을 이용하여 각 이미지 사이의 각도를 구한다.

그리고 translateZ도 위 공식을 이용하면된다.(원의 반지름)

 

3. 정렬된 이미지들을 position:absolute를 이용해서 이미지들을 겹치도록 만든다.

 

4. 그리고 할아버지에 perspective:값을 준다.

이 속성은 할아버지가 3D 공간을 볼수있게 해주면서 3D 공간을 부모에게 전달하는 역할을 한다.

 

5. 부모에 transform-style: preserve-3d를 주어 부모의 3D 공간을 자식에게 그대로 전달하도록 한다.

여기까지 하면 움직이진 않지만 원형으로 자식들이 자리잡은걸 볼 수 있다.

 

6. 요소를 움직이기 위해선 @keyframe을 이용하여 transform:rotateY(360deg)를 설정하고

 

7. container에 animation: rotate 7s linear infinite를 설정하면 된다.

rotate는 정의한 keyframe을 적은거고 linear는 일정한 속도로 진행시키기위한거고 infinite는 계속 돌게하기 위한거다.

 

그리고 위에서 보는 시점과 아래서 보는 시점은 perspective-origin:x y 를 이용하면된다.

 

이해하면 참 쉬운데... 처음에 머릿속에 여러 퍼즐조각들이 있어서 앞이 너무 막막했다 그래도 하나씩 하다보니 이해할 수 있게 된거같다.