CSS transition-delay —
같은 3초인데 한 박스만 1초 늦게 출발하는 이유
같은 컨테이너 안에 박스 두 개를 넣는다. 둘 다 transition 시간은 3초로 동일한데, 한 박스에만 transition-delay: 1s를 추가했다. #ex에 hover 하면 두 박스가 동시에 회전+이동을 시작해야 할 것 같지만, 실제로는 한 박스가 1초 늦게 출발해서 끝나는 시점도 1초 차이가 난다.
걸 수는 있지만 동작이 달라진다. 이번 코드의 핵심은 "부모 위에 마우스가 올라간 그 순간"에 두 박스가 동시에 반응하도록 만드는 것이다. 박스 각각에 hover를 걸면, 박스 위에 정확히 올라가야만 발동하므로 두 개를 같이 움직이게 할 수 없다.
- 카드 위에 마우스 → 안의 caption이 슬라이드 업
- 메뉴 위에 마우스 → 하위 메뉴가 펼쳐짐
- 이미지 위에 마우스 → 위에 덮인 텍스트가 페이드인
transition-duration: 3s는 "지정된 속성이 바뀔 때 그 변화를 3초에 걸쳐 부드럽게 보여달라"는 뜻이다. 이 값이 없으면 hover 즉시 끝 상태로 점프해버린다.
- hover 즉시 끝 상태로 점프
- 딸깍 — 변화가 안 보임
- 회전·이동이 무시되는 게 아니라 0초 만에 끝남
- 3초 동안 천천히 회전+이동
- 중간 단계가 모두 보임
- 마우스를 떼면 다시 3초에 걸쳐 원위치
#delay박스는 duration: 3s 외에 delay: 1s가 추가됐다. delay는 변화 시간을 늘리지 않는다. 출발 직전에 1초 동안 가만히 있다가, 그 후 3초에 걸쳐 변화한다는 뜻이다. 즉 끝나는 시점이 1초 더 늦어진다.
delay
360도면 한 바퀴, 720도는 두 바퀴다. 시각적으로 한 바퀴는 "끝났는지 모르게" 자연스러워 보이지만, 두 바퀴는 "의도적으로 빙글빙글 돌고 있다"는 인상을 준다. 박스가 단순히 옆으로 미끄러지는 게 아니라 회전하면서 이동하므로 시선이 자연스럽게 따라간다.
- 이번 코드는
transform: rotate(...)와margin-left를 따로 줬다 - 최신 방식:
transform: translateX(420px) rotate(720deg)— 한 속성으로 묶기 - transform으로 묶으면 GPU 가속을 받아 더 부드럽고, margin 변화로 인한 레이아웃 재계산도 피함
코드 안에 -webkit-transition-duration, -moz-transition-duration, -o-transition-duration 같은 줄이 반복된다. 이건 같은 속성을 4번 쓴 게 아니라, 옛날 브라우저들이 transition을 실험적으로 지원하던 시절의 호환 코드다.
| 접두어 | 대상 브라우저 | 현재 필요? |
|---|---|---|
-webkit- |
구버전 Safari, Chrome | 거의 불필요 (일부 transform 잔존) |
-moz- |
구버전 Firefox | 불필요 |
-o- |
구버전 Opera | 불필요 (Opera는 webkit 엔진으로 전환) |
-ms- |
IE / Edge legacy | 거의 불필요 |
| 접두어 없음 | 모든 최신 브라우저 | 이것만 쓰면 충분 |
| 실수 | 증상 | 해결 |
|---|---|---|
transition을 hover 쪽에 쓰기 |
hover로 들어갈 때만 부드럽고, 나갈 때는 점프 | transition은 원래 상태(.box)에 정의 — 양방향 모두 적용 |
delay를 duration에 더하면 된다고 착각 |
"4초로 합치자"고 duration을 늘려버림 | delay는 출발 지연, duration은 변화 시간 — 별개 |
</scirpt> 오타 |
html5shiv가 안 닫혀서 페이지가 깨짐 | </script>로 정확히 (이번 원본 코드에 오타 있음) |
| 자식 박스 각각에 hover | 한 박스만 발동, 나머지는 가만히 | 부모(#ex:hover .box)에 걸어 동시 발동 |
| vendor prefix만 쓰고 표준 속성 빠뜨림 | 최신 브라우저에서 작동 안 함 | 표준 속성(transition-duration)을 맨 마지막에 한 줄 추가 |
margin-left 변화로 이동 |
레이아웃 재계산이 일어나 끊겨 보임 | transform: translateX()로 대체 — GPU 가속 |
최신 코드는 prefix를 모두 빼고, transition 단축 속성으로 한 줄에 정리한다. "속성 duration timing-function delay" 순서다.
-webkit-transition-duration: 3s;
-moz-transition-duration: 3s;
-o-transition-duration: 3s;
transition-duration: 3s;
-webkit-transition-delay: 1s;
-moz-transition-delay: 1s;
-o-transition-delay: 1s;
transition-delay: 1s;transition: all 3s ease 1s;all = 모든 속성
3s = duration
ease = timing
1s = delay
핵심 한 줄 요약
Tags
'php' 카테고리의 다른 글
| 이미지 hover 시 확대 + 그림자 — transform-origin · scale · box-shadow 완전 정리 (0) | 2026.06.20 |
|---|---|
| 상품 카드 hover 시 caption 슬라이드 업 — translateY · opacity · overflow:hidden 완전 정리 (0) | 2026.06.20 |
| 실습 2 — 호버 시 사진을 회전시키며 둥근 테두리로 (0) | 2026.06.20 |
| 실습 1 — 호버 시 초록 → 노랑 박스 색상 전환 (0) | 2026.06.20 |
| CSS transform: translate() — X축·Y축·동시 이동의 차이 (0) | 2026.06.19 |
왕진 블로그

댓글