웹사이트에서 단순히 2차원적인 요소를 배치하는 것을 넘어, 카드 플립(Card Flip), 큐브 회전(Cube Rotation) 등 3D 효과를 구현하고 싶을 때가 있습니다. 이때 transform 속성(예: rotateY(), translateZ())을 사용하지만, 이들이 진정한 3D 공간 안에서 동작하도록 만들려면 몇 가지 추가 속성이 필요합니다.
erspective 속성: 3D 원근감을 부여하는 마법의 눈
perspective 속성은 3D 변형이 적용된 자식 요소에 원근감을 부여합니다. 마치 카메라 렌즈의 초점 거리처럼, 이 값을 통해 요소가 사용자로부터 얼마나 멀리 또는 가까이 떨어져 있는 것처럼 보이는지 제어할 수 있습니다.
적용 위치: 3D 변형을 포함하는 부모 요소에 적용합니다.
값: 주로 px 단위로 거리를 지정합니다. 값이 작을수록 원근감이 강해지고(가까이서 보는 느낌), 값이 클수록 원근감이 약해집니다(멀리서 보는 느낌).
.container {
width: 300px;
height: 200px;
border: 1px solid #ccc;
perspective: 1000px; /* 이 컨테이너 안의 3D 요소에 원근감을 부여 */
/* ... (다른 스타일) ... */
}
.box {
width: 100%;
height: 100%;
transition: transform 0.5s;
transform: rotateY(0deg);
}
.container:hover .box {
transform: rotateY(45deg); /* 호버 시 3D 회전 */
}
이 상태에서는 box가 회전하기는 하지만, 3D 느낌이 약하고, 만약 box 안에 다른 3D 요소가 있다면 제대로 동작하지 않을 수 있습니다.
transform-style: preserve-3d: 진정한 3D 공간 만들기
perspective가 원근감을 부여한다면, transform-style: preserve-3d는 자식 요소들이 부모의 3D 공간 안에 그대로 존재하도록 만듭니다. 이 속성이 없으면, 자식 요소들은 2차원적으로 평면화되어 버립니다.
적용 위치: 3D 변형을 적용할 요소(주로 transform이 적용될 요소)의 부모 요소에 적용합니다.
값: preserve-3d 고정 값.
.container {
width: 300px;
height: 200px;
border: 1px solid #ccc;
perspective: 1000px;
}
.card {
width: 100%;
height: 100%;
position: relative; /* 자식 요소 포지셔닝을 위해 */
transform-style: preserve-3d; /* 이 카드의 앞/뒷면이 3D 공간에 있도록 설정 */
transition: transform 0.6s;
transform: rotateY(0deg);
}
.front, .back {
position: absolute;
width: 100%;
height: 100%;
backface-visibility: hidden; /* 뒷면이 보이지 않도록 */
}
.back {
transform: rotateY(180deg); /* 뒷면은 180도 회전하여 시작 */
}
.container:hover .card {
transform: rotateY(180deg); /* 호버 시 카드 뒤집기 */
}
실전 예시: 카드 플립(Card Flip) 효과
카드 앞면과 뒷면을 가진 요소를 만들고, 마우스를 올리면 카드가 3D로 회전하며 뒷면이 보이도록 하는 예시입니다.
<div class="flip-container">
<div class="flipper">
<div class="front">
<h3>카드 앞면</h3>
<p>여기에 앞면 내용이 있습니다.</p>
</div>
<div class="back">
<h3>카드 뒷면</h3>
<p>여기에 뒷면 내용이 있습니다.</p>
</div>
</div>
</div>
.flip-container {
width: 200px;
height: 250px;
margin: 50px auto;
perspective: 1000px; /* 3D 효과를 위한 원근감 (부모에 적용) */
}
.flipper {
width: 100%;
height: 100%;
position: relative;
transform-style: preserve-3d; /* 자식(앞/뒷면)이 3D 공간에 있도록 (변형될 요소의 부모에 적용) */
transition: transform 0.8s; /* 부드러운 전환 효과 */
}
/* 마우스 호버 시 카드 뒤집기 */
.flip-container:hover .flipper {
transform: rotateY(180deg);
}
.front, .back {
position: absolute;
width: 100%;
height: 100%;
border-radius: 10px;
display: flex;
justify-content: center;
align-items: center;
backface-visibility: hidden; /* 뒷면이 돌아가기 전에는 보이지 않도록 */
}
.front {
background-color: #f0f8ff; /* 연한 파랑 */
color: #333;
z-index: 2; /* 앞면이 위에 있도록 */
}
.back {
background-color: #333; /* 어두운 배경 */
color: #f0f8ff; /* 밝은 글자 */
transform: rotateY(180deg); /* 뒷면은 180도 돌려놓고 시작 */
}
erspective 속성: 3D 원근감을 부여하는 마법의 눈
perspective 속성은 3D 변형이 적용된 자식 요소에 원근감을 부여합니다. 마치 카메라 렌즈의 초점 거리처럼, 이 값을 통해 요소가 사용자로부터 얼마나 멀리 또는 가까이 떨어져 있는 것처럼 보이는지 제어할 수 있습니다.
적용 위치: 3D 변형을 포함하는 부모 요소에 적용합니다.
값: 주로 px 단위로 거리를 지정합니다. 값이 작을수록 원근감이 강해지고(가까이서 보는 느낌), 값이 클수록 원근감이 약해집니다(멀리서 보는 느낌).
.container {
width: 300px;
height: 200px;
border: 1px solid #ccc;
perspective: 1000px; /* 이 컨테이너 안의 3D 요소에 원근감을 부여 */
/* ... (다른 스타일) ... */
}
.box {
width: 100%;
height: 100%;
transition: transform 0.5s;
transform: rotateY(0deg);
}
.container:hover .box {
transform: rotateY(45deg); /* 호버 시 3D 회전 */
}
이 상태에서는 box가 회전하기는 하지만, 3D 느낌이 약하고, 만약 box 안에 다른 3D 요소가 있다면 제대로 동작하지 않을 수 있습니다.
transform-style: preserve-3d: 진정한 3D 공간 만들기
perspective가 원근감을 부여한다면, transform-style: preserve-3d는 자식 요소들이 부모의 3D 공간 안에 그대로 존재하도록 만듭니다. 이 속성이 없으면, 자식 요소들은 2차원적으로 평면화되어 버립니다.
적용 위치: 3D 변형을 적용할 요소(주로 transform이 적용될 요소)의 부모 요소에 적용합니다.
값: preserve-3d 고정 값.
.container {
width: 300px;
height: 200px;
border: 1px solid #ccc;
perspective: 1000px;
}
.card {
width: 100%;
height: 100%;
position: relative; /* 자식 요소 포지셔닝을 위해 */
transform-style: preserve-3d; /* 이 카드의 앞/뒷면이 3D 공간에 있도록 설정 */
transition: transform 0.6s;
transform: rotateY(0deg);
}
.front, .back {
position: absolute;
width: 100%;
height: 100%;
backface-visibility: hidden; /* 뒷면이 보이지 않도록 */
}
.back {
transform: rotateY(180deg); /* 뒷면은 180도 회전하여 시작 */
}
.container:hover .card {
transform: rotateY(180deg); /* 호버 시 카드 뒤집기 */
}
실전 예시: 카드 플립(Card Flip) 효과
카드 앞면과 뒷면을 가진 요소를 만들고, 마우스를 올리면 카드가 3D로 회전하며 뒷면이 보이도록 하는 예시입니다.
<div class="flip-container">
<div class="flipper">
<div class="front">
<h3>카드 앞면</h3>
<p>여기에 앞면 내용이 있습니다.</p>
</div>
<div class="back">
<h3>카드 뒷면</h3>
<p>여기에 뒷면 내용이 있습니다.</p>
</div>
</div>
</div>
.flip-container {
width: 200px;
height: 250px;
margin: 50px auto;
perspective: 1000px; /* 3D 효과를 위한 원근감 (부모에 적용) */
}
.flipper {
width: 100%;
height: 100%;
position: relative;
transform-style: preserve-3d; /* 자식(앞/뒷면)이 3D 공간에 있도록 (변형될 요소의 부모에 적용) */
transition: transform 0.8s; /* 부드러운 전환 효과 */
}
/* 마우스 호버 시 카드 뒤집기 */
.flip-container:hover .flipper {
transform: rotateY(180deg);
}
.front, .back {
position: absolute;
width: 100%;
height: 100%;
border-radius: 10px;
display: flex;
justify-content: center;
align-items: center;
backface-visibility: hidden; /* 뒷면이 돌아가기 전에는 보이지 않도록 */
}
.front {
background-color: #f0f8ff; /* 연한 파랑 */
color: #333;
z-index: 2; /* 앞면이 위에 있도록 */
}
.back {
background-color: #333; /* 어두운 배경 */
color: #f0f8ff; /* 밝은 글자 */
transform: rotateY(180deg); /* 뒷면은 180도 돌려놓고 시작 */
}
게시글 목록
| 번호 | 제목 |
|---|---|
| 1418 |
부트스트랩
애니메이션 경고
|
| 1417 |
부트스트랩
경고 닫기
|
| 1416 |
부트스트랩
알림 링크
|
| 1414 |
부트스트랩
부트 스트랩 경고
2
|
| 1413 |
부트스트랩
부트 스트랩 웰스
|
| 1412 | |
| 1411 |
부트스트랩
응답 성있는 삽입
|
| 1410 |
부트스트랩
이미지 갤러리
|
| 1409 |
부트스트랩
반응 형 이미지
|
| 1408 |
부트스트랩
부트 스트랩 이미지 - 미리보기 이미지
|
| 1407 |
부트스트랩
부트 스트랩 이미지 - 원
|
| 1406 | |
| 1405 |
부트스트랩
반응 형 테이블
|
| 1404 |
부트스트랩
문맥 분류
|
| 1403 |
부트스트랩
요약 표
|
| 1402 |
부트스트랩
호버 행
|
| 1401 |
부트스트랩
테두리가있는 표
|
| 1400 |
부트스트랩
부트 스트랩 스트라이프 행
|
| 1399 |
부트스트랩
부트 스트랩 기본 테이블
|
| 1398 |
부트스트랩
부트 스트랩은 HTML <pre>요소
|
| 1397 |
부트스트랩
부트 스트랩은 HTML <kbd>요소
|
| 1396 |
부트스트랩
부트 스트랩은 HTML <code>요소
|
| 1395 |
부트스트랩
부트 스트랩은 HTML <dl>요소
|
| 1394 |
부트스트랩
<blockquote>
|
| 1393 |
부트스트랩
<abbr>
|
| 1392 |
부트스트랩
<mark>
|
| 1391 |
부트스트랩
<small>
|
| 1390 |
부트스트랩
부트 스트랩 텍스트 / 타이포그래피
|
| 1389 |
부트스트랩
2 개의 서로 다른 열
|
| 1388 |
부트스트랩
3 개의 동일한 열
|
댓글 작성
댓글을 작성하시려면 로그인이 필요합니다.
로그인하기