perspective - CSS: Cascading Style Sheets | MDN

원근법을 이용하면 좀 더 다양한 예제를 실행할 수 있습니다. 우선 예제 하나 보고 시작하도록 하겠습니다.

나와 닮은 연예인 찾기!

여기서 카드가 저 멀리서 앞으로 튀어나오는 원근감은 perspective 800px이 들어있기 때문입니다.

perspective 속성은 컨테이너로 하여금 자식들에게 원근감을 부여하는 효과가 있습니다.

.cont-card {
    display: flex;
    align-items: center;
    justify-content: center;
    perspective: 800px;
}

원근감이 있고 없고의 차이를 실습하도록 하겠습니다.

<!DOCTYPE html>
<html lang="ko">
<head>
    <style>
        .container {
            position: relative;
            width: 500px;
            height: 500px;
            margin-top: 500px;
            margin-left: 500px;
        }

        .y {
            position: absolute;
            transform: rotate(270deg);
            top: -300px;
            left: -250px;
            width: 500px;
        }

        .z {
            position: absolute;
            transform: rotate(140deg);
            top: 78px;
            left: -352px;
            width: 400px;
        }

        .line {
            display: flex; 
            gap: 0.5em;
            align-items: center;
            margin: 50px 0;
        }

        .line::before {
            content: ' '; 
            flex-grow: 1;
            height: 3px;
            background-color: black;
        }
        
        .box-container{
            /* 주석을 풀어보세요. */
            /* perspective: 500px; */
            position: relative;
            top: -260px;
            width: 200px;
            height: 200px;
            background-color: darkcyan;
            opacity: 0.3;
        }
        .box {
            position: absolute;
            top: -20px;
            left: 0;
            width: 220px;
            height: 220px;
            background-color: black;
            opacity: 0.7;
            /* Chrome 개발자 도구 열어서 수치를 증가시켜보세요. */
            transform: translate3d(0px, 0px, 0px) rotateX(0deg) rotateY(0deg) rotateZ(0deg);
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="line x">line x</div>
        <div class="line y">line y</div>
        <div class="line z">line z</div>
        <div class="box-container">
            <div class="box"></div>
        </div>
    </div>
</body>
</html>

<aside> 💡 translate3d translate 속성의 3D 버전입니다. 한번에 x, y, z 축을 모두 설정하는 것이 가능하며 3D 환경을 랜더링 하는 성능이 기존의 translate 속성보다 뛰어납니다. 참고로 scale, rotate 속성역시 scale3d, rotate3d 가 존재합니다.

</aside>

간단한 실습을 해보도록 하겠습니다.

<!DOCTYPE html>
<html lang="ko">
<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>perspective</title>
    <style>
        .원본 {
            width: 200px;
            height: 200px;
            border: 1px solid black;
            margin: 100px auto;
            perspective: 400px;
        }

        .회전패널 {
            width: 200px;
            height: 200px;
            background: aqua;
            /* 실습 1 */
            /* transform: rotate(45deg); */

            /* 실습 2 perspective를 준것과 주지 않은것을 비교해보세요. */
            /* transform: rotateX(45deg); */

            /* 실습 3 perspective를 준것과 주지 않은것을 비교해보세요.*/
            /* transform: rotateY(45deg); */
        }
    </style>
</head>
<body>
    <div class="원본">
        <div class="회전패널"></div>
    </div>
</body>
</html>

X축과 Y축, Z축 회전은 아래 그림을 참고해주세요.

7568400748b5b543.png

어때요? 감이 오시나요? perspective는 우리가 대상을 보는 거리입니다. 라이켓이 저 사각형을 보는 거리라고 생각해주세요. 값이 적을수록 더 가까이 보게 되므로, 효과가 더 극적으로 나타나게 됩니다.