CSS transform-origin —
같은 회전, 다른 4모서리 기준
똑같이 rotateZ(10deg)로 10도 기울어진 같은 그림 4장이지만, 회전의 기준점(축)을 4모서리 각각에 둔 결과를 비교한다. 같은 각도라도 기준점이 어디냐에 따라 회전 후 위치가 완전히 달라진다.
50% 50% = center center30px 50px처럼 정확한 위치도 가능회전은 "한 점을 고정하고 그 주위로 도는 것"이다. 그 고정점이 어디냐에 따라, 같은 각도로 돌아도 도형이 끝나는 위치가 달라진다.
| 클래스 | transform-origin | 의미 (가로 / 세로) | 퍼센트로 |
|---|---|---|---|
.ltop |
left top | 맨 왼쪽 / 맨 위 | 0% 0% |
.rtop |
right top | 맨 오른쪽 / 맨 위 | 100% 0% |
.lbottom |
left bottom | 맨 왼쪽 / 맨 아래 | 0% 100% |
.rbottom |
right bottom | 맨 오른쪽 / 맨 아래 | 100% 100% |
| (생략) | center center | 가운데 / 가운데 (기본) | 50% 50% |
30px 80%처럼 픽셀과 퍼센트를 섞어도 된다.rotate(10deg)와 rotateZ(10deg)는 2D에서는 동일한 결과를 낸다. 평면 회전이기 때문. 차이는:
- 2D 변환 함수
- 표준 가장 짧은 형태
- 일반적인 평면 회전
- 3D 변환 함수 (Z축 명시)
- 다른 3D 함수와 함께 쓸 때 명확
- 의도 표현이 분명함
이 코드처럼 단순 평면 회전만 쓴다면 rotate로도 충분하지만, rotateX·rotateY와 함께 묶어 쓸 때를 위해 rotateZ로 통일하는 코드 스타일이 있다.
HTML 구조를 보면 .origin(액자) → .ltop(회전 위치 클래스) → img.rose(이미지) 3단 중첩이다. .ltop은 img.rose에 어떤 transform-origin을 줄지를 결정하는 셀렉터 역할만 한다.
이 패턴 덕분에 같은 .rose CSS를 4개 다른 위치에 적용할 수 있다. 실무에선 .rose에 직접 클래스를 더 붙여 .rose.ltop으로 줄이는 방법도 있다.
키워드(left/right/top/bottom/center)는 4모서리·중심·변 중간 9곳만 가능. 더 세밀한 위치는 숫자로 줄 수 있다.
transform-origin은 회전뿐만 아니라 scale, skew, perspective 등 모든 transform의 기준점이다.
| 변환 종류 | origin이 left top일 때 |
|---|---|
scale(2) |
왼쪽 위 모서리는 그대로, 오른쪽·아래로만 2배 커짐 |
skewX(20deg) |
왼쪽 위가 고정되고 오른쪽·아래가 비스듬해짐 |
rotateZ(45deg) |
왼쪽 위를 핀으로 시계방향 45도 |
| 실수 | 증상 | 해결 |
|---|---|---|
| transform-origin을 transform 뒤에 작성 | 일부 브라우저에서 무시 (낡은 사양) | transform-origin을 먼저 적기 |
| 키워드 순서 바꿈 (top left) | 사실 가능 — 가독성 떨어짐 | 가로 → 세로 순으로 통일 |
| 회전 기준이 바뀌었는데 위치도 바뀜 | 레이아웃이 의도와 다름 | position/translate으로 보정 |
| img.rose가 인접한 형제와 겹침 | 회전 후 다른 박스 침범 | 부모 .origin에 overflow:hidden |
| 3D에 origin Z값을 0으로 둠 | 예상보다 평평한 회전 | 입체감을 위해 Z값도 조정 |
transform-origin: top center+transform: scaleY(0)→ 1- 위에서 아래로 펼쳐지는 자연스러운 드롭다운
transform-origin: left center+rotateY(0 → -180deg)- 책 페이지가 왼쪽 끝에서 넘어가는 모양
transform-origin: bottom center+scale(0 → 1)- 아래쪽 끈에서 풍선이 위로 부풀어 올라가는 느낌
핵심 한 줄 요약
Tags
'php' 카테고리의 다른 글
| HTML 게이지 — progress · meter 완전 정리 (0) | 2026.06.09 |
|---|---|
| CSS transform: rotate() — 양수 vs 음수 각도, 시계와 반시계 (0) | 2026.06.09 |
| CSS transform-style — flat vs preserve-3d, 자식의 3D를 살릴 것인가 (0) | 2026.06.09 |
| CSS transition 실전 — 색상 전환 + border 둥글게 변신 (0) | 2026.06.09 |
| CSS transition-timing-function — ease · linear · ease-in/out 비교 (0) | 2026.06.09 |
왕진 블로그

댓글