Eun_Frontend
  • [CSS] - 3D 애니메이션 구현 (backface-visibility, perspective, rotate)
    2025년 02월 08일 17시 04분 58초에 업로드 된 글입니다.
    작성자: 동혁이

     

    3D 애니메이션 구현 (backface-visibility, perspective)

    완성본

     

    배운점

    요소 회전 시키기 (동전 뒤집기)

    요소를 회전시켰을 때 원근감이 느껴지도록 하려면 rotate와 perspective를 함께 사용해야 합니다.

    스타벅스 배지가 실제로 이미지에 붙어 있는 것 같은 효과를 주기 위해 회전 효과가 필요했는데 rotateX 뿐만 아니라, 다음처럼 스크린을 감싸는 부모 요소에 perspective라는 프로퍼티를 추가해줘야 했습니다.

    그 이유는 perspective가 원근감을 결정하기 때문!

     

    1.  초기 모습, 코드

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <style>
          body {
            background-color: #313b54;
            display: flex;
            align-items: center;
            justify-content: center;
            height: 100vh;
            margin: 0;
          }
          .container {
            width: 100px;
            height: 100px;
          }
          .container .item {
            width: 100px;
            height: 100px;
            background-color: transparent;
            border: 2px solid red;
            color: white;
            font-size: 60px;
          }
          .container .item.front {
            transform: rotateY(0deg);
          }
          .container .item.back {
            transform: rotateY(180deg);
          }
        </style>
        <title>Document</title>
      </head>
      <body>
        <div class="container">
          <div class="item front">앞</div>
          <div class="item back">뒤</div>
        </div>
      </body>
    </html>

     

     

     

     

    2. absolute

    - front에 absolute를 넣어 부모 요소를 기준으로 배치해줍니다.

    .container .item.front {
        transform: rotateY(0deg);
        position: absolute;
    }

     

    그렇다면 요소가 위에서부터 아래로 쌓여져 있는 주변의 형제 요소들과 어떤 상호작용이 무너지면서 요소가 겹쳐지는 것을 확인할 수 있습니다.

     

    여기서 중요한 것은 부모 요소를 기준으로 배치를 하려는 목적이 아니고 요소를 겹치게 하는 용도로 단순히 position absolute를 사용했다는 겁니다!

     

     

     

    3. backface-visibility

    - backface-visibility 속성을 사용해 뒷면이 어떻게 처리될 것인지에 대해서 컨트롤 할 수 있습니다.

    https://developer.mozilla.org/ko/docs/Web/CSS/backface-visibility

     

    backface-visibility - CSS: Cascading Style Sheets | MDN

    CSS backface-visibility 속성은 요소의 뒷면이 사용자를 향할 때 보여야 하는지 지정합니다.

    developer.mozilla.org

     

    item에 backgace-visibility: hidden을 추가해줍니다.

    .container .item {
        width: 100px;
        height: 100px;
        background-color: transparent;
        border: 2px solid red;
        color: white;
        font-size: 60px;
        backface-visibility: hidden;
    }

     

    이제 뒤라는 글자가 안보입니다.

    왜 그러냐면 Y축을 통해서 180도 뒤집었고 뒤집어진 뒷면이 화면에 보이고 있었던 상태였는데

    backface-visibility: hidden; 값을 추가하면서 뒷 면을 화면에서 안보이게 하겠다라고 설정을 했기 때문입니다. 

    (당연히 앞도 뒤집으면 안보이겠죠?!)

     

     

     

     

    4. rotate

     

    - hover 속성을 추가해 container에 마우스를 올렸을때 front를 뒤로 뒤집고 back을 다시 원래 각도 0으로(앞으로) 오게해봤습니다.

     

    .container:hover .item.front {
        transform: rotateY(180deg);
    }
      .container:hover .item.back {
        transform: rotateY(0deg);
    }

     

     

    너무 부자연스럽기 때문에 전환 효과(transition)를 추가해 보겠습니다.

     

    .container .item {
        width: 100px;
        height: 100px;
        background-color: transparent;
        border: 2px solid red;
        color: white;
        font-size: 60px;
        backface-visibility: hidden;
        transition: 1s;
    }

     

     

    한가지 아쉬운 점은 원근법이 적용되어있지 않아서 3차원으로 회전하는지는 모르겠습니다.

     

     

     

     

    5. perspective

    perspective 적용 전 • 후 비교

    요소가 회전한다는 느낌보다는 세로폭이 줄어들었다가 다시 늘어나는 느낌이다.

     

    perspective: 300px;

    perspective가 작을수록 요소가 회전하는 걸 가까이서 보는 느낌이고

     

     

    perspective: 1000px;

    perspective가 클수록 요소가 회전하는 걸 멀리서 보는 느낌이납니다.

     

    댓글