็ก์
perspective ๋ณธ๋ฌธ
๐ข perspective
3D ๊ณต๊ฐ์์ ์นด๋ฉ๋ผ์ ์์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ์ค์ ํ์ฌ ์ ์ฒด๊ฐ(์๊ทผ๊ฐ)์ ๊ฒฐ์ ํ๋ ์์ฑ.
๐น perspective
@keyframes rotate {
0% { transform: perspective(120px) rotateX(0deg) rotateY(0deg); }
50% { transform: perspective(120px) rotateX(-180deg) rotateY(0deg); }
100% { transform: perspective(120px) rotateX(-180deg) rotateY(-180deg); }
}
- perspective(๊ฐ) ์ (๊ฐ)์ ์นด๋ฉ๋ผ์ ๊ฑฐ๋ฆฌ.
- ๊ฐ: ์๋ค (100px) → ์๋ฏธ: ์นด๋ฉ๋ผ๊ฐ ๊ฐ๊น์ → ๊ฒฐ๊ณผ: ์๊ทผ๊ฐ(์๊ณก) ํผ → ๊ฐํ 3D
- ๊ฐ: ํฌ๋ค (1000px) → ์๋ฏธ: ์นด๋ฉ๋ผ๊ฐ ๋ฉ์ → ๊ฒฐ๊ณผ: ์๊ทผ๊ฐ(์๊ณก) ์์ → ํ๋ฉด์ ๊ฐ๊น์
๐ฅ perspective ์ ๋ ๊ฐ์ง ์ฌ์ฉ ๋ฐฉ๋ฒ ๐ฅ
1๏ธโฃ transform ํจ์๋ก์์ perspective()
.box {
transform: perspective(200px) rotateY(45deg);
}
- ํน์ง:
- transform ์์์ ํจ์์ฒ๋ผ ์ฌ์ฉ.
- ํด๋น ์์์๋ง ์ ์ฉ.
- ๋ค๋ฅธ ๋ณํ(rotate, scale ๋ฑ)๊ณผ ํจ๊ป ์ฌ์ฉ.
- ๊ฐ๋จํ 3D ํจ๊ณผ์ ์ ํฉ.
2๏ธโฃ CSS ์์ฑ์ผ๋ก์์ perspective
.container {
perspective: 200px;
}
.box {
transform: rotateY(45deg);
}
- ํน์ง:
- ๋ถ๋ชจ ์์๊ฐ 3D ๊ณต๊ฐ์ ์์ฑ.
- ์์ ์์๋ค์ 3D ๋ณํ์ ์ํฅ.
- ์์ ์์๋ค์ด ๊ฐ์ ๊ณต๊ฐ ๊ธฐ์ค์ผ๋ก ์์ง์.
- ๋ ์์ฐ์ค๋ฝ๊ณ ์ผ๊ด๋ 3D ํจ๊ณผ.
๐ ์ค๋ฌด์์ ๋ ๋ง์ด ์ฌ์ฉ๋จ.
๐ ์ฐจ์ด ๋น๊ต ๐
| ๊ตฌ๋ถ | transform: perspective() | perspective ์์ฑ |
| ์ ์ฉ ๋์ | ์๊ธฐ ์์ | ๋ถ๋ชจ ์์ → ์์ ์์ |
| ์ฌ์ฉ ์์น | transform ์ | ๋ ๋ฆฝ ์์ฑ |
| ํจ๊ณผ | ๊ฐ๋จํ 3D | ์ค์ ๊ณต๊ฐ๊ฐ ์๋ 3D |
| ์ค๋ฌด ์ฌ์ฉ | ๊ฐ๋จ ํจ๊ณผ | ๋ณต์กํ 3D UI |
| ํต์ฌ | “์นด๋ฉ๋ผ๋ฅผ ์์์ ์ง์ ๋ถ์” | “์นด๋ฉ๋ผ๋ฅผ ๋ถ๋ชจ์ ์ค์นํด์ ๊ณต๊ฐ ์์ฑ” |
๐ฏ perspective + 3D ํต์ฌ ์์ฑ๋ค ๐ฏ
๐น transform-style
์์ ์์๋ฅผ 3D ๊ณต๊ฐ์ ์ ์งํ ์ง ๊ฒฐ์ .
.container {
transform-style: preserve-3d;
}
- flat: ์์์ด ํ๋ฉด์ผ๋ก ๋๋ฆผ. (๊ธฐ๋ณธ๊ฐ)
- preserve-3d: ์์ ์์๋ค์ด 3D ์ํ ์ ์ง.
๐น backface-visibility
์์์ ๋ท๋ฉด์ ๋ณด์ด๊ฒ ํ ์ง ์จ๊ธธ์ง ๊ฒฐ์ .
.box {
backface-visibility: hidden;
}
- visible: ๋ค์งํ๋ฉด ๋ท๋ฉด ๋ณด์. (๊ธฐ๋ณธ๊ฐ)
- hidden: ๋ค์งํ๋ฉด ์ ๋ณด์.
๐น perspective-origin
์นด๋ฉ๋ผ ์์น ์กฐ์
.container {
perspective: 500px;
perspective-origin: left;
}
- center: ์ ๋ฉด. (๊ธฐ๋ณธ๊ฐ)
- left: ์ผ์ชฝ ์์ .
- right: ์ค๋ฅธ์ชฝ ์์ .
- top: ์์์ ๋ด๋ ค๋ค๋ด.
- bottom: ์๋์์ ์ฌ๋ ค๋ค๋ด.
๐ ๋๋ ์ขํ๋ก๋ ๊ฐ๋ฅ (%)
๐โ POINT ๐โ
โ๏ธ transform: perspective() ๋ ๊ฐ๋จํ ํ์ ํจ๊ณผ,
perspective ์์ฑ ์ ์นด๋&ํ๋ธ&UI,
perspective + preserve-3d ๋ ์ฌ๋ฌ ์์ 3D โ๏ธ
๐ ์์ฑ๋ณ ์์ธ ์์ฝํ ๐
| ์์ฑ / ํจ์ | ์ ์ฉ ๋์ | ์ญํ | ํต์ฌ ํฌ์ธํธ |
| perspective | ๋ถ๋ชจ | 3D ๊ณต๊ฐ ์์ฑ | ๊ฐ ์์ผ๋ฉด ์ ์ฒด๊ฐ ๊ฐ, ๊ฐ ํฌ๋ฉด ํ๋ฉด ๋๋ |
| perspective() | ์์(transform) | ์นด๋ฉ๋ผ ๊ฑฐ๋ฆฌ ์ ์ฉ | ๋จ์ผ ์์ 3D ํจ๊ณผ, transform ์์์ ์ฌ์ฉ |
| perspective-origin | ๋ถ๋ชจ | ์นด๋ฉ๋ผ ์์น ์ง์ | ๊ธฐ๋ณธ center, left/top ๋ฑ ์กฐ์ ๊ฐ๋ฅ |
| transform-style | ๋ถ๋ชจ/์์ | ์์ 3D ์ ์ง ์ฌ๋ถ | preserve-3d → 3D ์ ์ง, flat → ํ๋ฉด |
| backface-visibility | ์์ | ๋ท๋ฉด ๋ณด์ ์ฌ๋ถ | hidden → ์นด๋ ๋ค์ง๊ธฐ ์ ๋ท๋ฉด ์จ๊น |
| transform (rotateX/Y/Z) | ์์ | ํ์ /3D ์ด๋ | perspective์ ํจ๊ป ์ฌ์ฉํด์ผ ์ ์ฒด๊ฐ |
โ๏ธ ์ค์ ์์ ์ฝ๋ โ๏ธ
.container {
perspective: 800px;
}
.card {
width: 200px;
height: 300px;
transform-style: preserve-3d;
transition: 0.6s;
}
.card:hover {
transform: rotateY(180deg);
}
'<style>' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| CSS์ Animation๊ณผ @keyframes (0) | 2026.03.27 |
|---|---|
| transition ์์ฑ (1) | 2026.03.27 |
| Functions์ filter์์ฑ๊ณผ ํจ์ (0) | 2026.03.27 |
| transform ์์ฑ๊ณผ functions (ํจ์) (0) | 2026.03.26 |
| Pseudo-elements (์์ฌ ์์) (0) | 2026.03.26 |