면 하나는 그냥 정사각형 div 입니다. 이걸 정육면체 한 면으로 만들려면 "먼저 정면을 향하게 두고, 정육면체 반지름(한 변의 절반)만큼 z축으로 밀어낸다"를 6번 반복하면 됩니다 — translateZ(h) 는 그대로 앞면, rotateY(180deg) translateZ(h) 는 뒷면, rotateY(±90deg) translateZ(h) 는 좌우, rotateX(±90deg) translateZ(h) 는 위아래입니다.
핵심은 부모(정육면체 그룹)에 transform-style: preserve-3d 를 주는 것입니다 — 이게 없으면 자식들의 3D 배치가 하나의 평면으로 뭉개져 그냥 겹친 사각형처럼 보입니다. 여기에 조상 어딘가의 perspective 가 더해져야 비로소 원근감 있는 입체로 보입니다.
preserve-3d 는 overflow: hidden, opacity < 1, filter 가 걸린 조상을 지나가면 깨집니다(그 조상이 자신만의 평평한 렌더링 그룹을 만들기 때문). 큐브 구조를 만들었는데 갑자기 평평해 보인다면 그 사이 어딘가에 이 세 가지 중 하나가 있는지부터 의심하세요.
언제 쓰나
제품 쇼케이스, 로딩 인디케이터, 설정 스위처처럼 "회전하는 실물"을 표현할 때. 6면 전부 텍스트/이미지를 채우면 무거워지니 필요한 면만 내용을 채우세요.