본문 바로가기

웹언어/CSS3

[CSS3강좌] 23강 transform(변형속성) - 3D변형 - OSSAM강좌

728x90
반응형

 

 

 

 

 

 

 

 

 

** 영상으로 보고 싶은 분은 아래 주소를 클릭해주세요.

https://www.youtube.com/watch?v=DVvXE4uN1oA 

 

 

 

 

 

 

 

 

 

 

 

 

 

1. 3D transform의 함수값

함수 값 설명
rotate3d(x, y, z, angle) 3D회전을 한번에 정의
rotateX() X축을 중심으로 3D회전을 정의
rotateY() Y축을 중심으로 3D회전을 정의
rotateZ() Z축을 중심으로 3D회전을 정의
scale3d(x, y, z) 3D스케일(크기) 변화를 한번에 정의
scaleX() X축을 중심으로 3D크기를 정의
scaleY() Y축을 중심으로 3D크기를 정의
scaleZ() Z축을 중심으로 3D크기를 정의
translate3d(x, y, z) 3D적 요소 이동을 한번에 정의
translateX() X축을 중심으로 3D이동을 정의
translateY() Y축을 중심으로 3D이동을 정의
translateZ() Z축을 중심으로 3D이동을 정의
matrix3d
(n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n)
16개값으로 구성되어 4X4행렬로 모든 3Dtransform값을 정의
perspective(n) 3D 변형 요소의 투시도를 지정

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2. 3D transform과 함께 사용되어야 할 속성

속성 설명
transform-origin 변형의 중심점을 바꿀 수 있는 속성
transform-style 3D공간에서 그 속성을 하위요소에 전달할지의 여부를 지정한다.
preserve-3d : 하위요소에 3D속성을 그대로 전달

기본값은 flat으로 3D속성을 하위요소에게 전달하지 않도록 처리
perspective 3D요소를 보는 관점을 소실점방식으로 처리함
perspective-origin 3D요소의 하단 위치를 지정
backface-visibility 3D적 관점으로 화면의 뒷면으로 갈때 보이게 할지 안보이게 할지를 지정하는 속성

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3. 3D를 보여주기 위한 perspective

- 기본적으로 transform에서 3D적 transform만 사용한다고 해서 3D로 보이진 않는다. 

  컴퓨터는 2차원인 x축과 y축으로 이루어진 평면이기 때문이다.

- perspective를 사용하여 투시도를 설정해야 3D적 입체감을 줄 수 있다.

 

perspective: 숫자px;

- 여기서 말하는 숫자는 Z축을 기준으로 관찰자가 요소로 부터 얼마나 떨어져서 관찰하는가를 명시하는 숫자

- 간략하게 설명하면 숫자가 커질수록 멀리 떨어져서 보이게 된다는 것

- 기본적으로 멀리 떨어져 있어야 하는 사물은 작게 만들고 가까운 곳에 있어야 하는 사물은 크게 만들어서 원근감을 부여하는 것으로 이해해도 무방

 

 

 

1) 회전 rotateX()를 이용한 코드

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>transform</title>
        <style>
            *{ padding: 0; margin: 0; }
            
            section{
                width: 100px; height: 100px;
                background-color: #ededed;
                margin: 50px;
            }
            div{
                width: 100px; height: 100px;
                background-color: orange;
                transform: rotateX(50deg);
            }
            
            .box01{ perspective: none; }
            .box02{ perspective: 100px; }
            .box03{ perspective: 200px; }
        </style>
    </head>
    <body>
        <section class="box01">
            <div>none</div>
        </section>
        <section class="box02">
            <div>100px</div>
        </section>
        <section class="box03">
            <div>200px</div>
        </section>
    </body>
</html>

- section을 부모로 설정하고 각각의 클래스를 적용

- section에 배경색을 넣은 것은 자손인 div가 회전되는 상태를 보기 위해 사용

- 모든 div는 X축을 기준으로 회전을 50도 하도록 설정

- 첫번째 section인 .box01인 요소에 perspective: none;으로 설정 - 기본값

- 두번째 section인 .box02인 요소에 perspective: 100px;으로 설정

- 세번째 section인 .box03인 요소에 perspective: 200px;으로 설정

 

 

 

 

 

 

2) 코드 완성 뷰

- 첫번째 오렌지 박스는 rotateX(50deg)를 받았지만 perspective효과를 받지 못해 3D적 느낌을 받을 수가 없다.

- 두번째 오렌지 박스는 perspective: 100px; 처리하여 관찰자가 가깝게 있다고 느끼기 때문에 사물이 더 크게 보여 더 기울어진 것 처럼 보인다.

- 세번째 오렌지 박스는 perspective효과는 들어가서 3D적 느낌을 받을 수는 있으나, 200px로 관찰자의 거리가 멀어져서 사물의 회전폭이 더 작아진 것을 확인할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4. 3D transform을 이용한 회전 처리

- 각각의 rotateX, rotateY, rotateZ를 처리 

 

 

 

1) 코드 

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>transform</title>
        <style>
            *{ padding: 0; margin: 0; }
            
            section{
                width: 100px; height: 100px;
                background-color: #ededed;
                margin: 50px;
                
                perspective: 150px;
            }
            div{
                width: 100px; height: 100px;
                background-color: orange;
                
                transition: 0.5s;
            }
            
            .box01:hover{ transform: rotateX(70deg); }
            .box02:hover{ transform: rotateY(70deg); }
            .box03:hover{ transform: rotateZ(70deg); }
        </style>
    </head>
    <body>
        <section>
            <div class="box01">X축 회전</div>
        </section>
        <section>
            <div class="box02">Y축 회전</div>
        </section>
        <section>
            <div class="box03">Z축 회전</div>
        </section>
    </body>
</html>

- section인 부모에 배경생을 회색으로 처리하고 perspective를 150px로 처리

- div인 자손 요소에 각각 클래스를 지정, 마우스를 올리면 회전되도록 처리

- .box01에는 rotateX(70deg)를 지정

- .box02에는 rotateY(70deg)를 지정

- .box03에는 rotateZ(70deg)를 지정

 

 

 

 

 

 

2) 코드 완성 뷰

 

- 첫번째 오렌지 박스는 x축을 기준으로 3D적으로 회전하는 것을 확인할 수 있다.

- 두번째 오렌지 박스는 y축을 기준으로 3D적으로 회전하는 것을 확인할 수 있다.

- 세번째 오렌지 박스는 z축을 기준으로 처리되다보니 3D적이기보단 2D적으로 보인다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5. 3D transform을 이용한 이동처리

- 각각의 translateX(), translateY(), translateZ() 함수를 통한 이동 처리

 

 

 

1) 코드

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>transform</title>
        <style>
            *{ padding: 0; margin: 0; }
            
            section{
                width: 100px; height: 100px;
                background-color: #ededed;
                margin: 50px;
                
                perspective: 150px;
            }
            div{
                width: 100px; height: 100px;
                background-color: orange;
                
                transition: 0.5s;
            }
            
            .box01:hover{ transform: translateX(-50px); }
            .box02:hover{ transform: translateY(-50px); }
            .box03:hover{ transform: translateZ(-50px); }
        </style>
    </head>
    <body>
        <section>
            <div class="box01">X축 이동</div>
        </section>
        <section>
            <div class="box02">Y축 이동</div>
        </section>
        <section>
            <div class="box03">Z축 이동</div>
        </section>
    </body>
</html>

- section은 부모로 처리하고 배경색을 회색으로 처리

- div는 자손으로 처리하고 각각 클래스를 배정하고 배경색을 오렌지 색으로 처리

- .box01에 마우스를 올리면 transform: translateX(-50px);으로 처리

- .box02에 마우스를 올리면 transform: translateY(-50px);으로 처리

- .box03에 마우스를 올리면 transform: translateZ(-50px);으로 처리

- section에 perspective속성을 주지 않으면 .box03은 아무런 효과가 나지 않으므로 반드시 설정

 

 

 

 

 

 

 

 

2) 코드 완성뷰

- 첫번째 오렌지 박스는 왼쪽으로 -50px만큼 이동 처리

- 두번째 오렌지 박스는 위쪽으로 -50px만큼 이동 처리

- 세번째 오렌지 박스는 뒤로 이동하는 느낌을 줄수 있다.

  부모인 section에 perspective속성을 주지 않으면 효과를 볼수 없다.

  음수로 처리하면 뒤로 이동하는 느낌을 주고 양수로 처리하면 앞으로 이동하는 느낌을 준다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6. transform-origin을 통한 변형점 이동

- 2D transform에서도 변형점을 이동시켜 변형을 다르게 해봤듯이, 3D transform도 변형점 이동이 가능하다.

- transform-origin의 기본값은 center로 가로 세로 가운데 중점이다.

 

transform-origin: x축중점 y축중점;

 

 

 

 

1) 코드 

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>transform</title>
        <style>
            *{ padding: 0; margin: 0; }
            
            section{
                width: 100px; height: 100px;
                background-color: #ededed;
                margin: 50px;
                
                perspective: 150px;
            }
            div{
                width: 100px; height: 100px;
                background-color: orange;
                
                transition: 1s;
            }
            
            .box01{ transform-origin: center; }
            .box02{ transform-origin: center top; }
            .box03{ transform-origin: center bottom; }
            
            div:hover{ transform: rotateX(180deg); }
        </style>
    </head>
    <body>
        <section>
            <div class="box01">가운데기준</div>
        </section>
        <section>
            <div class="box02">상단기준</div>
        </section>
        <section>
            <div class="box03">하단기준</div>
        </section>
    </body>
</html>

- section을 부모로 설정하고 배경색을 회색으로 설정

- section에 perspective를 줌으로써, 원근감 효과를 주었다.

- div는 자손 요소로 설정하고 배경색을 오렌지색으로 설정

- div는 마우스올릴시 X축을 기준으로 회전하는 3D적 회전을 설정

- .box01에는 변형점의 기본은 center로 처리

- .box02에는 상단으로 처리

- .box03에는 하단으로 처리하였다.

 

 

 

 

 

 

2) 코드 완성뷰

 

- 첫번째 박스는 가운데를 기준으로 회전

- 두번째 박스는 상단을 기준으로 회전

- 세번째 박스는 하단을 기준으로 회전하는 것을 확인할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

7. backbackface-visibility속성

- backface-visibility는 3D관점으로 화면 뒷면을 보이게 할지 숨길지를 정하는 속성

- 기본값은 visible이어서 보이고, hidden으로 처리하면 보이지 않는다.

 

backface-visibility: hidden;

 

 

 

 

 

 

1) 코드 

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>transform</title>
        <style>
            *{ padding: 0; margin: 0; }
            
            section{
                width: 100px; height: 100px;
                background-color: #ededed;
                margin: 50px;
                
                perspective: 150px;
            }
            div{
                width: 100px; height: 100px;
                background-color: orange;
                
                transition: 2s;
            }
            
            .box01{ backface-visibility: visible; }
            .box02{ backface-visibility: hidden; }
            
            div:hover{ transform: rotateX(360deg); }
        </style>
    </head>
    <body>
        <section>
            <div class="box01">visible</div>
        </section>
        <section>
            <div class="box02">hidden</div>
        </section>
    </body>
</html>

- section과 div를 각각 2개로 처리한 후 div에 클래스를 각각 적용하였다.

- div에 마우스를 올리면 X축을 중심으로 한 회전을 하도록 처리했다.

- .box01은 backface-visibility의 기본값은 visible로 처리하면 회전하더라도 뒷면이 보이도록 처리했다.

- .box02는 backface-visibility를 hidden으로 처리하여 회전할때 뒷면이 안보이도록 처리했다.

 

 

 

 

 

 

2) 코드 완성 뷰

- 첫번째 div는 마우스를 올릴때 돌아가는 뒷면도 보인다.

- 두번째 div는 마우스를 올릴때 돌아가는 뒷면이 보이지 않는다.

 

 

 

 

 

 

 

 

 

728x90
반응형