💕IT 공부하기/CSS3

[CSS3] transform(3d변형) : 특정 요소의 모양을 3차원 공간에서 입체적으로 변형하기

수리즘 2023. 4. 29. 09:00
반응형

바로 전 단계에서 transform의 다양한 속성들을 활용하여 평면상에서의 모양을 변형하는 법을 배웠습니다. 이번에는 평면이 아닌 입체적인 공간에서의 요소 변형법을 알아보겠습니다. 기존의 transform 속성들 중 3d로의 변형이 가능한 속성은 translaterotate입니다.


(1) perspective : 원근감 설정하기

흔히 2d라고 하는 평면공간을 입체적인 3d 공간으로 바꾸는 제일 중요한 요소가 무엇일까요? 기존 x축, y축에 z축을 추가했을 시에 비로소 평면에서 입체적인 공간으로 바뀝니다. 지금부터 우리가 다뤄볼 속성이 바로 이 z축에 해당합니다.

사람의 눈에 더욱 자연스러운 입체공간을 구현하기 위해서는 원근감이라는 요소를 추가해야 하는데 브라우저상에 원근감을 설정해주는 요소가 바로 perspective입니다.


perspective : 원근감 수치;

어떤 물체를 가까이서 바라보면 해당 물체의 왜곡이 커지고 멀리서 바라보면 물체의 왜곡이 적어집니다. 카메라의 광각렌즈와 망원렌즈를 상상하면 쉽게 이해할 수 있을 것입니다. perspective의 수치가 적을수록 광각렌즈로 촬영한 것과 같이 왜곡의 효과가 커지며 수치가 커질수록 왜곡이 줄어듭니다. 만약 잘 이해되지 않는다면 다음 예제를 통해서 perspective의 유무와 수치 변화를 통한 변화의 차이점을 살펴보겠습니다.

※ perspective의 수치가 작아질수록 왜곡이 커지며, 수치가 커질수록 왜곡은 적어집니다.


다음의 예제를 통해 perspective의 기본 개념을 숙지해 보겠습니다.

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>perspective</title>
    <style>
        div {
            width: 200px;
            height: 200px;
            margin: 150px 50px;
            border: 1px solid #000;
            float: left;
        }
       div p { 
            width: 100%;
            height: 100%;
            background: palevioletred;
            opacity: 0.3;
            margin: 0;
            transform: rotateY(50deg);
        }
        div:nth-child(1) { perspective:150px; }
        div:nth-child(3) { perspective:800px; }
    </style>
</head>
<body>
        <div><p></p></div>
        <div><p></p></div>
        <div><p></p></div>
</body>
</html>

3개의 <div>태그를 생성한 후 자식 요소로 <p>태그를 각각 생성합니다. <div>와 자식인 <p>태그에 공통으로 모양을 잡아준 뒤, <p>태그에 y축을 기준으로 50도만큼 회전시킵니다. 이후 원근감을 설정하기 위해 각각의 <p>태그의 부모인 <div>에 perspective를 각기 다르게 설정합니다. 첫 번째 <div>에는 perspective의 수치를 150px만큼, 두 번째 <div>에는 perspective 미적용, 세 번째 <div>에는 800px만큼 설정해줍니다.

※ perspective는 3d 변형을 한 요소의 부모 태그에 설정해주는 것이 일반적입니다.

3개의 <p>태그 모두 y축을 기준으로 50도만큼 회전했지만, 부모 태그인 <div>의 perspective 수치 값에 따라 출력 화면에 많은 차이가 있는 것을 확인할 수 있습니다. 일단 가운데 <div>의 경우 perspective 설정을 아예 하지 않았기 때문에 단지 좌우가 줄어든 것만 같은 평면적인 느낌인데 비해 왼쪽인 첫 번째 <div>는 perspective 값을 150px로 작게 설정하여 회전한 형태의 왜곡률이 심하게 적용된 것을 확인할 수 있습니다. 반면, 세 번째 <div>에는 perspective 값을 800px만큼 크게 설정하였기에 회전된 모습의 왜곡이 완만하게 출력된 것을 확인할 수 있습니다.

 

 

 


(2) translateZ : z축으로 이동하기

transform (2d) 에서 배웠던 translate는 x축, y축 즉, 위나 아래로 평면상에서 움직였다면 z축으로의 이동은 브라우저를 바라보는 사용자 시점에서 앞, 뒤로 움직인다고 이해하면 편할 것 같습니다. 사용 구문은 다음과 같습니다.


transform : translateZ(이동거리);

사용법은 기존의 translate와 동일합니다.

※ translateZ는 3d공간에서의 z축, 즉, 사용자가 브라우저를 바라보는 시점을 기준으로 앞 또는 뒤로 움직입니다.


다음의 예제를 통해 translateZ의 개념을 잡아보겠습니다.

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>translateZ</title>
    <style>
        div {
            width: 600px;
            height: 400px;
            margin: 100px auto;
            border: 1px solid #000;
            position: relative;
            perspective: 1600px;
        }
       div p { 
            width: 100%;
            height: 100%;
            background: dodgerblue;
            opacity: 0.3;
            margin: 0;
            position: absolute;
            top: 0;
            left: 0;
            font: bold 60px arial;
            color: #fff;
        }
        div p:nth-child(1) { transform: translateZ(-500px); }
        div p:nth-child(2) { transform: translateZ(0px); }
        div p:nth-child(3) { transform: translateZ(500px); }
    </style>
</head>
<body>
        <div>
            <p>box1</p>
            <p>box2</p>
            <p>box3</p>
        </div>
</body>
</html>

<div>안에 3개의 <p>태그를 생성합니다. <div>에 넓이와 높이를 설정한 후 자식인 3개의 <p>태그가 <div>안에서 같은 위치에 겹쳐있도록 position:absolute로 위치를 잡습니다. <p>태그를 3d 공간상에서 z축으로 이동할것이므로 부모인 <div>에 perspective를 이용하여 원근감을 설정합니다. 첫 번째 <p>태그는 z축상에서 -500px만큼, 두 번째는 0px, 세 번째는 500px만큼 이동시킵니다.

결과 화면을 보면 translateZ (0px)의 box2를 기준으로 translate (-500px)의 box1은 사용자 시점 기준에서 뒤쪽으로 500px만큼 멀리 이동하고  translate (500px)의 box3은 사용자 쪽으로 500px만큼 가까이 이동한 것을 확인할 수 있습니다.

translateZ에서 마이너스 값은 사용자 시점을 기준으로 뒤쪽으로 멀리 이동하며, 플러스 값은 사용자 쪽으로 가깝게 이동합니다.

 

 

 

반응형

 


(3) rotateX, rotateY : 3d 공간상에서 z축과 y축 기준으로 회전하기

transform (2d) 에서의 rotate는 단지 평면상에서 시계 방향 혹은 반시계 방향으로 회전할 뿐이었습니다. 이번에는 rotateX와 rotateY를 활용하여 3d공간에서 각각 x축과 y축으로 회전시켜 보겠습니다.


transform : rotateX(x축 회전각도);
transform : rotateY(y축 회전각도);

사용법은 기존의 rotate와 동일합니다.


다음의 예제를 통해 rotateX, rotateY의 개념을 잡아보겠습니다.

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>rotateX, rotateY</title>
    <style>
        div {
            width: 300px;
            height: 300px;
            margin: 100px;
            border: 1px solid #000;
            float: left;
            perspective: 700px;
        }
       div p { 
            width: 100%;
            height: 100%;
            background: green;
            opacity: 0.3;
            margin: 0;
        }
        div:nth-child(1) p { transform: rotateX(45deg);}
        div:nth-child(2) p { transform: rotateY(45deg);}
    </style>
</head>
<body>
    <div><p></p></div>
    <div><p></p></div>
</body>
</html>

2개의 <div>를 생성하 후 각각 자식 요소로 <p>태그를 생성합니다. <p>태그의 부모 요소인 <div>에 perspective를 700px만큼 설정하고 각각의 <p>태그에 차례로 rotateX와 rotateY를 적용합니다.

각각 x축과 y축으로 <p>태그들이 입체적으로 회전된 것을 확인할 수 있습니다.

 

 

 

 

 

 

 

 

 

 

 

 

[IT 공부하기/CSS3] - [CSS3] transform(2d변형) : 특정 요소의 모양을 평면상에서 자유롭게 변형하기

 

[CSS3] transform(2d변형) : 특정 요소의 모양을 평면상에서 자유롭게 변형하기

기존 웹 표준에서 모든 HTML 요소의 모양은 사각형이었으며 해당 모양을 변형할 수 있는 방법이 없었지만 CSS3으로 넘어오면서 포토샵의 기능과 비슷한 변형 속성이 대거 추가되었습니다. 따라서

soonirism.tistory.com

 

반응형