본문 바로가기

기초 문법/HTML&CSS

[CSS] 특정 요소의 모양을 3차원 공간에서 입체적으로 변형하기

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

 

 

# Contents


  • perspective
  • translateZ

 

 

# perspective


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

 

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

 

perspective: 원근감 수치

어떤 물체를 가까이서 바라보면 해당 물체의 왜곡이 커지고 멀리서 바라보면 물체의 왜곡이 적어집니다. 카메라의 광각렌즈와 망원렌즈를 상상하면 쉽게 이해할 수 있을 것입니다.

perspective의 수치가 적을수록 왜곡의 효과가 커지며 수치가 커질수록 왜곡이 줄어듭니다. 

 

먼저 예제코드를 보도록 하겠습니다. 첫번째로 index.html 코드입니다.

 

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
        <link rel="stylesheet" href="./css/reset.css" />
        <link rel="stylesheet" href="./css/style.css" />
    </head>
    <body>
        <div><p></p></div>
        <div><p></p></div>
        <div><p></p></div>
    </body>
</html>

 

다음은 style.css 코드입니다.

 

div {
    width: 200px;
    height: 200px;
    margin: 150px 50px;
    border: 1px solid red;
    margin-top: 20px;

    float: left;
}

div > p {
    width: 100%;
    height: 100%;
    background-color: red;
    opacity: 0.5;

    transform: rotateY(50deg);
}

div:nth-child(1) {
    perspective: 150px;
}

div:nth-child(3) {
    perspective: 800px;
}

 

perspective 는 3d 변형을 한 요소의 부모 태그에 설정하는 것이 일반적입니다. 이렇게 3개의 <p> 태그 모두 y축을 기준으로 회전했지만, 부모 태그인 <div>의 perspective 수치 값에 따라 출력 화면에 많은 차이가 있는 것을 확인할 수 있습니다. perspective의 값이 적어 질 수록 왜곡이 커지며 클수록 왜곡이 작아지는 현상을 파악할 수 있었습니다.

 

 

# translateZ


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

 

transform: translateZ(이동거리)

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

 

먼저 예제코드를 보도록 하겠습니다. 첫번째로 index.html 코드입니다.

 

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
        <link rel="stylesheet" href="./css/reset.css" />
        <link rel="stylesheet" href="./css/style.css" />
    </head>
    <body>
        <div>
            <p>box1</p>
            <p>box2</p>
            <p>box3</p>
        </div>
    </body>
</html>

 

다음은 style.css 코드입니다.

 

div {
    width: 600px;
    height: 400px;
    margin: 200px auto;
    border: 1px solid red;
    position: relative;
    perspective: 1600px;
}

div > p {
    width: 100%;
    height: 100%;
    background-color: blue;
    opacity: 0.2;
    position: absolute;
    top: 0;
    left: 0;
    color: white;
}

p:nth-child(1) {
    transform: translateZ(-500px);
}

p:nth-child(2) {
    transform: translateZ(0px);
}

p:nth-child(3) {
    transform: translateZ(500px);
}

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

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