cubic-bezier 이징 편집기
애니메이션 이징 곡선을 드래그로 편집하고 공이 실제로 움직이는 미리보기로 확인합니다. 이징 프리셋 15종.
위에서부터 이동(translate) · 크기(scale) · 투명도(opacity)에 같은 이징을 적용한 모습입니다.
cubic-bezier 이징 편집기란?
CSS 애니메이션에서 "얼마나 빨리 시작해서 어떻게 멈추는가"를 결정하는 것이 이징(easing)입니다. ease, ease-in 같은 기본 키워드는 네 가지뿐이라 대부분의 세련된 모션은 cubic-bezier(x1, y1, x2, y2) 로 직접 곡선을 그려 만듭니다. 숫자 네 개만 봐서는 어떤 움직임인지 절대 알 수 없다는 게 문제인데, 이 편집기는 곡선을 드래그로 조절하면서 같은 화면에서 공이 실제로 그 이징으로 움직이는 것을 바로 확인할 수 있습니다. 곡선이 오른쪽 위로 볼록하면 빠르게 시작해 부드럽게 멈추고, 제어점을 0~1 바깥으로 끌면 목표를 살짝 지나쳤다 돌아오는 탄성(back) 효과가 됩니다. 자주 쓰는 이징 15종을 프리셋으로 넣어 두었습니다.
사용 방법
- 그래프의 파란 점 두 개를 마우스로 끌어 곡선을 만듭니다. 숫자를 직접 입력해도 됩니다.
- 오른쪽 미리보기에서 공이 그 이징으로 움직이는 것을 확인합니다. 지속시간도 조절할 수 있습니다.
- 감이 안 잡히면 프리셋 칩(ease-out, easeOutBack 등)을 눌러 비교해 봅니다.
- 마음에 들면 아래 CSS 코드를 복사해 transition 또는 animation 에 사용합니다.
cubic-bezier 이징 편집기 사용 가이드
실제 작업에서 이 도구를 어떻게 쓰는지, 무엇을 조심해야 하는지 정리했습니다.
ease-out이 거의 항상 정답인 이유
이징을 하나만 외워야 한다면 ease-out입니다. 빠르게 시작해 부드럽게 멈추는 곡선인데, 이유가 있습니다.
사용자가 버튼을 눌렀을 때 화면이 반응하는 속도는 "체감 반응 속도"를 결정합니다. ease-in(느리게 시작)을 쓰면 클릭 후 잠깐 아무 일도 안 일어나는 것처럼 느껴집니다. 실제 지속시간이 같아도 ease-in 애니메이션이 훨씬 굼떠 보입니다. 반대로 ease-out은 즉시 튀어나온 뒤 천천히 자리 잡으므로 즉각 반응한 것처럼 느껴집니다.
| 상황 | 이징 | 이유 |
|---|---|---|
| 요소가 나타남 (모달, 툴팁, 드롭다운) | ease-out | 즉시 반응한 느낌. 대부분의 경우 정답. |
| 요소가 사라짐 (닫기, 삭제) | ease-in | 이미 결과를 알고 있으므로 빨리 치워도 됨. |
| A에서 B로 이동 (탭 전환, 캐러셀) | ease-in-out | 양끝이 부드러워 왕복 움직임이 자연스러움. |
| 진행률·로딩바 | linear | 속도가 정보 그 자체. 이징을 주면 진행 상황을 왜곡함. |
| 강조·주목 (알림 배지) | easeOutBack | 살짝 튀어나왔다 돌아오며 시선을 끔. |
지속시간 — 길수록 고급스럽지 않습니다
이징 곡선만큼 중요한 것이 지속시간입니다. 그리고 대부분의 사람이 너무 길게 줍니다. 미리보기의 기본값 800ms는 곡선 차이를 눈으로 보기 위한 값이지, 실무에 쓸 값이 아닙니다.
실제 UI에서는 200~300ms가 기준선입니다. 100ms 아래면 애니메이션이 있었는지도 모르고, 500ms를 넘으면 사용자가 기다리기 시작합니다. 사용자는 그 화면을 하루에 수십 번 봅니다. 처음엔 우아해 보이던 600ms 전환이 열 번째부터는 방해물이 됩니다.
- 100ms 이하 — 색 변화, 아주 작은 상태 변화(체크박스). 사실상 즉시.
- 150~250ms — hover, 버튼 반응, 작은 요소의 등장. 가장 많이 쓰는 구간.
- 250~350ms — 모달, 드롭다운, 카드 펼침. 중간 크기 요소.
- 350~500ms — 전체 화면 전환, 페이지 이동. 이보다 길면 대개 과합니다.
- 움직이는 거리가 멀수록 조금 더 길게. 화면을 가로지르는 요소는 짧은 이동보다 시간이 더 필요합니다.
오버슈트(탄성)를 언제 쓰고 언제 피하나
제어점을 그래프의 위아래 여백으로 끌면 y가 0~1 범위를 벗어납니다. 그러면 목표 지점을 지나쳤다가 되돌아오는 탄성 효과가 납니다. 이 도구가 그래프 위아래에 여백을 둔 이유입니다.
easeOutBack(.34, 1.56, .64, 1)이 대표적입니다. 살짝 튀어나왔다 제자리로 돌아오며 물리적인 무게감을 줍니다.
- 쓸 곳 — 장바구니 담기 확인, 좋아요 하트, 알림 배지 등 "축하"나 "주목"의 성격이 있는 짧은 순간.
- 피할 곳 — 모달, 드롭다운, 툴팁처럼 자주 반복되는 UI. 매번 통통 튀면 금방 질리고 산만합니다.
- 절대 피할 곳 — 크기가 큰 요소. 화면 절반을 차지하는 패널이 튀어나왔다 들어가면 멀미가 납니다.
- 레이아웃을 밀어내는 애니메이션 — 오버슈트로 넘친 만큼 옆 요소가 밀렸다 돌아오면 화면 전체가 흔들립니다.
이징으로 표현할 수 없는 것
cubic-bezier로는 진짜 튕김(bounce)을 만들 수 없습니다. 공이 바닥에 여러 번 통통 튀는 움직임은 곡선이 위아래로 여러 번 꺾여야 하는데, 이 곡선은 그런 모양을 만들 수 없습니다. 오버슈트는 딱 한 번만 가능합니다.
이런 움직임이 필요하면 다른 방법을 써야 합니다.
/* 여러 번 튕김 — cubic-bezier 로는 불가능, keyframes 로 */
@keyframes bounce-in {
0% { transform: scale(.3); opacity: 0; }
50% { transform: scale(1.08); opacity: 1; }
70% { transform: scale(.96); }
85% { transform: scale(1.02); }
100% { transform: scale(1); }
}
.pop { animation: bounce-in 400ms ease-out both; }
| 필요한 것 | 방법 |
|---|---|
| 여러 번 튕김 | @keyframes 로 중간 지점을 직접 지정 |
| 계단식 (프레임 애니메이션) | steps(n) 타이밍 함수 |
| 진짜 스프링 물리 | JS 애니메이션 라이브러리 |
| 제스처에 따라 속도가 달라짐 | JS 필요. CSS 이징은 고정된 곡선입니다. |
움직임을 원치 않는 사용자가 있습니다
전정기관 장애가 있는 사람에게 화면 움직임은 실제로 어지럼증과 메스꺼움을 일으킵니다. 그래서 운영체제에 "동작 줄이기" 설정이 있고, 브라우저는 이를 prefers-reduced-motion 으로 알려 줍니다.
이 설정을 켠 사용자에게는 애니메이션을 끄거나 아주 짧게 줄여야 합니다. 완전히 없애는 것보다 투명도 변화 정도만 남기는 편이 맥락을 잃지 않아 좋습니다.
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: .01ms !important;
animation-iteration-count: 1 !important;
transition-duration: .01ms !important;
scroll-behavior: auto !important;
}
}
자주 묻는 질문
ease-in과 ease-out 중 무엇을 써야 하나요?
화면에 나타나거나 사용자 조작에 반응하는 움직임은 ease-out(빠르게 시작해 부드럽게 멈춤)이 거의 항상 정답입니다. 반응이 즉각적으로 느껴지기 때문입니다. ease-in은 화면 밖으로 사라질 때만 쓰고, 왕복하는 움직임에는 ease-in-out을 씁니다.
y값이 0보다 작거나 1보다 커도 되나요?
됩니다. y는 0~1 범위를 벗어날 수 있고 그때 목표 지점을 지나쳤다 돌아오는 탄성·오버슈트 효과가 납니다. 반면 x(시간축)는 반드시 0~1 사이여야 하며, 벗어나면 브라우저가 그 값을 무시합니다. 이 도구는 x를 자동으로 0~1로 제한합니다.
transition과 animation 어디에 쓰나요?
둘 다 씁니다. transition-timing-function, animation-timing-function 양쪽에 같은 cubic-bezier 값을 넣을 수 있고, 단축 표기인 transition: all .3s cubic-bezier(...) 형태로도 씁니다. 아래 코드 상자에 두 형태를 모두 만들어 둡니다.
linear는 왜 어색해 보이나요?
현실의 물체는 일정한 속도로 갑자기 출발했다 갑자기 멈추지 않기 때문입니다. linear는 로딩 스피너처럼 계속 도는 회전에만 어울리고, 위치·크기·투명도 변화에 쓰면 기계적으로 느껴집니다.