카드들을 하나의 활성 인덱스를 기준으로 offset(= 카드 인덱스 - 활성 인덱스)을 계산해 배치합니다. offset이 0인 카드는 rotateY(0)·scale(1)로 정면을 보고, offset이 ±1, ±2로 멀어질수록 rotateY(±45~60도)로 기울고 translateX로 옆으로 밀리며 scale이 작아지고 opacity도 옅어집니다. 부모에 perspective를 주는 것이 필수입니다 — 없으면 rotateY가 그냥 좌우로 눌린 사각형으로 보입니다.
핵심은 "겹치는 순서(z-index)"입니다 — 가운데에 가까운 카드가 항상 위에 그려져야 카드가 서로 자연스럽게 겹쳐 보입니다. translateZ(-|offset| × 값)로 깊이를 주면 각 카드가 실제로 카메라에서 멀어지므로 브라우저가 알아서 올바른 순서로 그려줍니다.
인덱스가 바뀔 때 모든 카드의 transform을 한 번에 CSS transition으로 갱신하면 "넘기는" 애니메이션이 저절로 생깁니다 — 개별 카드마다 애니메이션을 따로 걸 필요가 없습니다.
언제 쓰나
앨범·포트폴리오처럼 "지금 보는 것 하나 + 다음/이전을 살짝 보여주는" 갤러리에 씁니다. 항목이 많고 빠르게 훑어봐야 하면 그리드가 더 낫습니다 — 커버플로는 한 번에 하나씩만 진지하게 보여줍니다.