Study/Javascript, Jquery, CSS

[CSS] 트랜스폼 (transform)

v명월v 2020. 2. 19. 00:16

안녕하세요. 명월입니다.


이 글은 CSS의 트랜스폼 (transform)에 대한 글입니다.


트랜스 폼(transform)은 요소를 3차원적인 회전, 확대, 축소하는 스타일을 뜻합니다.

아래와 같은 형태라고 생각하면 됩니다.

안녕하세요.
명월일지입니다.

트랜스 폼의 속성은 transform, transform-origin, perspective, transform-style, perspective-origin, backface-visibility의 6가지의 속성이 있습니다.

transform의 속성은 변경 스타일을 지정하는 것입니다. 회전(rotate), 이동(translate) 3D 축 이동(translate3d) 옵션이 있습니다. 스크루 옵션(scew), 확대, 축소(scale), 3차원적인 확대, 축소 (scake)도 있습니다.

참조 - https://www.w3schools.com/cssref/css3_pr_transform.asp

참조 - https://www.w3.org/Talks/2012/0416-CSS-WWW2012/Demos/transforms/demo-translate3d-cube.html


transform-origin의 속성은 회전축을 설정하는 것입니다. 기본 값은 "transform-origin: center center"입니다. 옵션은 matrix, transrate, scale, rotate, skew가 있고, 두세 개를 중첩해서 설정할 수 있습니다.

perspective은 투영점울 설정하는 것입니다. perspective-origin은 투영점의 방향(기본값은 100px 100px)입니다. origin의 위치에서 perspective은 투영점입니다.

transform-style은 perspective와 perspective-origin을 사용하려면 설정하는 속성입니다. 값은 "transform-style : preserve-3d;" 뿐입니다.

<!DOCTYPE html>
<html>
<head>
  <style>
    /* div 요소를 설정하는 스타일*/
    .cube {
      /* 투영점은 300px 300px 왼쪽 위쪽에서 오른쪽 아래 방향 */
      perspective-origin: 300px 300px;
      /* 투영점 */
      perspective: 300px;
      /* perspective와 perspective-origin을 사용하려면 설정 */
      transform-style: preserve-3d;
      /* 여백 설정*/
      margin-top: 400px;
      /* 여백 설정*/
      margin-left: 400px;
    }
    /* 큐브의 6개 면 공통 설정 */
    .cube .face {
      display: block;
      /* 위치 설정 */
      position: absolute;
      /* 너비, 높이 100px인 정사각형 */
      width: 100px;
      height: 100px;
      line-height: 100px;
      /* 기본 색은 흰색 */
      color: white;
      /* 글자 가운데 정렬 */
      text-align: center;
    }
    /* 앞 면 */
    .cube .front {
      /* 검정색의 투명도 0.3 */
      background: rgba(0, 0, 0, 0.3);
      /* z축 방향으로 50px 거리 */
      transform: translateZ(50px);
    }
    /* 뒷 면 */
    .cube .back {
      /* 녹색 */
      background: rgba(0, 255, 0, 1);
      /* 글씨 검정색 */
      color: black;
      /* y축으로 180도 회전, z축 방향으로 50px 거리 */
      /* 앞면과 z축이 같기 때문에 사이즈가 같은데, y축을 기준으로 180도 돌린 것*/
      transform: rotateY(180deg) translateZ(50px);
    }
    /* 오른쪽 면 */
    .cube .right {
      /* 약간 빨간색의 투명도 0.7 */
      background: rgba(196, 0, 0, 0.7);
      /* y축으로 90도 회전, z축 방향으로 50px 거리 */
      /* 앞면과 z축이 같기 때문에 사이즈가 같은데, y축을 기준으로 90도 돌린 것*/
      transform: rotateY(90deg) translateZ(50px);
    }
    /* 왼쪽 면*/
    .cube .left {
      /* 약간 파란색의 투명도 0.7 */
      background: rgba(0, 0, 196, 0.7);
      /* y축으로 -90도 회전, z축 방향으로 50px 거리 */
      /* 앞면과 z축이 같기 때문에 사이즈가 같은데, y축을 기준으로 -90도 돌린 것*/
      transform: rotateY(-90deg) translateZ(50px);
    }
    /* 윗 면 */
    .cube .top {
      /* 약간 노란색의 투명도 0.7 */
      background: rgba(196, 196, 0, 0.7);
      /* x축으로 90도 회전, z축 방향으로 50px 거리 */
      /* 앞면과 z축이 같기 때문에 사이즈가 같은데, x축을 기준으로 90도 돌린 것*/
      transform: rotateX(90deg) translateZ(50px);
    }
    /* 바닥 면 */
    .cube .bottom {
      /* 약간 핑크색의 투명도 0.7 */
      background: rgba(196, 0, 196, 0.7);
      /* x축으로 -90도 회전, z축 방향으로 50px 거리 */
      /* 앞면과 z축이 같기 때문에 사이즈가 같은데, x축을 기준으로 -90도 돌린 것*/
      transform: rotateX(-90deg) translateZ(50px);
    }
  </style>
</head>
<body>
  <div class="cube">
    <!-- 앞 면 -->
    <div class="face front">1</div>
    <!-- 뒷 면 -->
    <div class="face back">2</div>
    <!-- 오른쪽 면 -->
    <div class="face right">3</div>
    <!-- 왼쪽 면 -->
    <div class="face left">4</div>
    <!-- 윗 면 -->
    <div class="face top">5</div>
    <!-- 바닥 면 -->
    <div class="face bottom">6</div>
  </div>
</body>
</html>
1
2
3
4
5
6

backface-visibility의 속성은 transform 요소에서 뒷면으로 뒤집힐 때 면이 보이는 것 여부를 설정하는 것이다.

예를 들면 위 rotateX나 rotateY나 rotateZ를 180도(180deg) 설정할 때 보이게 표시하는 여부를 설정합니다.

<!DOCTYPE html>
<html>
<head>
  <style>
    /* 두개의 사각형 item 공통 설정 */
    .item {
      /* 정사각형 */
      display: inline-block;
      width: 100px;
      height: 100px;
      /* 여백 설정 */
      margin: 10px;
      /* 색은 파란색 */
      background-color: blue;
      /* 트랜지션 2초 */
      transition: 2s;
      /* 글씨색 흰색 */
      color:white;
    }
    /* 뒤집힐 때 보이기 설정*/
    .item-1 {
      backface-visibility: visible;
    }
    /* 뒤집힐 때 안 보이기 설정*/
    .item-2 {
      backface-visibility: hidden;
    }
    /* 체크 박스가 체크되면 그 다음 .item들은 Y축으로 180도 뒤집는다. */
    .item-test-checkbox:checked ~ .item {
      transform: rotateY( 180deg );
    }
  </style>
</head>
<body>
  <!-- 체크 박스의 액션 -->
  <input type="checkbox" class="item-test-checkbox">click!<br />
  <div class="item item-1">테스트</div>
  <div class="item item-2">테스트</div>
</body>
</html>
click!
테스트
테스트

이번에는 웹 페이지에서 자주 사용하는 예제입니다.

<!DOCTYPE html>
<html>
<head>
  <style scoped="scoped">
    /* div요소 설정 */
    div#exam1 {
      /* 바탕색은 파란색 */
      background-color: blue;
      /* 너비 100% */
      width: 100%;
      /* 글씨 크기 20px */
      font-size: 20px;
      /* 글씨 색은 흰색 */
      color: white;
      /* 안 여백 100px */
      padding: 100px;
    }
    /* 클래스가 off가 있으면 */
    div#exam1.off {
      /* 트랜지션을 회전으로 설정 */
      transition-property: transform;
      /* 트랜지션 시간은 1초 */
      transition-duration: 1s;
      /* x축 회전 -90이면, 안 보인다. */
      transform: perspective(100px) rotateX(-90deg);
      /* 회전 기준 위쪽. */
      transform-origin: top;
    }
    /* 클래스가 on가 있으면 */
    div#exam1.on {
      /* 트랜지션을 회전으로 설정 */
      transition-property: transform;
      /* 트랜지션 시간은 1초 */
      transition-duration: 1s;
      /* x축 회전 0. 기본 수치 */
      transform: rotateX(0deg);
      /* 회전 기준 위쪽. */
      transform-origin: top;
    }
  </style>
</head>
<body>
  <!-- jquery 라이브러리 -->
  <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
  <script>
    // 버튼을 클릭하면
    function exam1() {
      // exam1 id를 가진 div 요소의 클래스에 on이 있으면
      if ($("div#exam1").hasClass("on")) {
        // 클래스 on을 제거한다.
        $("div#exam1").removeClass("on");
        // 클래스 off를 추가한다.
        $("div#exam1").addClass("off");
        return;
      }
      // 클래스 off을 제거한다.
      $("div#exam1").removeClass("off");
      // 클래스 on을 추가한다.
      $("div#exam1").addClass("on");
      return;
    }
  </script>
  <div id="exam1" class="off">안녕하세요.</div>
  <input type="button" value="눌러보세요." style="width:100%;" onclick="exam1()">
  </div>
</body>
</html>
안녕하세요.

위 버튼을 눌러보시면 사각형 박스가 위에서 열리는 것처럼 보이는 효과입니다. 예전에 Bootstrap의 사용자 메뉴에서 사용자 설정할 때 사용하던 스타일입니다.

요즘에는 이런 스타일의 메뉴는 없지만, 갑자기 생각나서 작성해봤습니다.


여기까지 CSS의 트랜스폼 (transform)에 대한 설명이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.