cubic-bezier 이징 편집기

애니메이션 이징 곡선을 드래그로 편집하고 공이 실제로 움직이는 미리보기로 확인합니다. 이징 프리셋 15종.

그래프의 점 두 개를 끌어 곡선을 만드세요. 세로축(y)은 0~1을 벗어나도 됩니다 — 탄성 효과가 납니다.
0 시간 0 1
애니메이션 미리보기
FADE IN

위에서부터 이동(translate) · 크기(scale) · 투명도(opacity)에 같은 이징을 적용한 모습입니다.

프리셋

cubic-bezier 이징 편집기란?

CSS 애니메이션에서 "얼마나 빨리 시작해서 어떻게 멈추는가"를 결정하는 것이 이징(easing)입니다. ease, ease-in 같은 기본 키워드는 네 가지뿐이라 대부분의 세련된 모션은 cubic-bezier(x1, y1, x2, y2) 로 직접 곡선을 그려 만듭니다. 숫자 네 개만 봐서는 어떤 움직임인지 절대 알 수 없다는 게 문제인데, 이 편집기는 곡선을 드래그로 조절하면서 같은 화면에서 공이 실제로 그 이징으로 움직이는 것을 바로 확인할 수 있습니다. 곡선이 오른쪽 위로 볼록하면 빠르게 시작해 부드럽게 멈추고, 제어점을 0~1 바깥으로 끌면 목표를 살짝 지나쳤다 돌아오는 탄성(back) 효과가 됩니다. 자주 쓰는 이징 15종을 프리셋으로 넣어 두었습니다.

사용 방법

  1. 그래프의 파란 점 두 개를 마우스로 끌어 곡선을 만듭니다. 숫자를 직접 입력해도 됩니다.
  2. 오른쪽 미리보기에서 공이 그 이징으로 움직이는 것을 확인합니다. 지속시간도 조절할 수 있습니다.
  3. 감이 안 잡히면 프리셋 칩(ease-out, easeOutBack 등)을 눌러 비교해 봅니다.
  4. 마음에 들면 아래 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살짝 튀어나왔다 돌아오며 시선을 끔.
프리셋에서 ease-in과 ease-out을 번갈아 눌러 보세요. 지속시간을 똑같이 800ms로 두고 봐도 ease-in 쪽이 훨씬 느리게 느껴집니다. 이게 이징이 UX에 미치는 영향의 핵심입니다.

지속시간 — 길수록 고급스럽지 않습니다

이징 곡선만큼 중요한 것이 지속시간입니다. 그리고 대부분의 사람이 너무 길게 줍니다. 미리보기의 기본값 800ms는 곡선 차이를 눈으로 보기 위한 값이지, 실무에 쓸 값이 아닙니다.

실제 UI에서는 200~300ms가 기준선입니다. 100ms 아래면 애니메이션이 있었는지도 모르고, 500ms를 넘으면 사용자가 기다리기 시작합니다. 사용자는 그 화면을 하루에 수십 번 봅니다. 처음엔 우아해 보이던 600ms 전환이 열 번째부터는 방해물이 됩니다.

  • 100ms 이하 — 색 변화, 아주 작은 상태 변화(체크박스). 사실상 즉시.
  • 150~250ms — hover, 버튼 반응, 작은 요소의 등장. 가장 많이 쓰는 구간.
  • 250~350ms — 모달, 드롭다운, 카드 펼침. 중간 크기 요소.
  • 350~500ms — 전체 화면 전환, 페이지 이동. 이보다 길면 대개 과합니다.
  • 움직이는 거리가 멀수록 조금 더 길게. 화면을 가로지르는 요소는 짧은 이동보다 시간이 더 필요합니다.
미리보기의 지속시간 슬라이더를 250ms로 낮춰 보세요. 800ms에서 뚜렷하게 달라 보이던 이징들이 250ms에서는 구분이 거의 안 갑니다. 짧은 애니메이션에서는 곡선을 정교하게 다듬는 것보다 그냥 ease-out을 쓰는 게 낫다는 뜻이기도 합니다.

오버슈트(탄성)를 언제 쓰고 언제 피하나

제어점을 그래프의 위아래 여백으로 끌면 y가 0~1 범위를 벗어납니다. 그러면 목표 지점을 지나쳤다가 되돌아오는 탄성 효과가 납니다. 이 도구가 그래프 위아래에 여백을 둔 이유입니다.

easeOutBack(.34, 1.56, .64, 1)이 대표적입니다. 살짝 튀어나왔다 제자리로 돌아오며 물리적인 무게감을 줍니다.

  • 쓸 곳 — 장바구니 담기 확인, 좋아요 하트, 알림 배지 등 "축하"나 "주목"의 성격이 있는 짧은 순간.
  • 피할 곳 — 모달, 드롭다운, 툴팁처럼 자주 반복되는 UI. 매번 통통 튀면 금방 질리고 산만합니다.
  • 절대 피할 곳 — 크기가 큰 요소. 화면 절반을 차지하는 패널이 튀어나왔다 들어가면 멀미가 납니다.
  • 레이아웃을 밀어내는 애니메이션 — 오버슈트로 넘친 만큼 옆 요소가 밀렸다 돌아오면 화면 전체가 흔들립니다.
x(가로축)는 시간이라 반드시 0~1이어야 합니다. 시간은 거꾸로 흐를 수 없기 때문입니다. 이 도구는 x를 자동으로 0~1로 제한하지만, 손으로 cubic-bezier를 쓸 때 x에 1을 넘는 값을 넣으면 브라우저가 그 선언을 통째로 무시하고 기본값으로 동작합니다 — 오류도 안 나므로 알아채기 어렵습니다.

이징으로 표현할 수 없는 것

cubic-bezier로는 진짜 튕김(bounce)을 만들 수 없습니다. 공이 바닥에 여러 번 통통 튀는 움직임은 곡선이 위아래로 여러 번 꺾여야 하는데, 이 곡선은 그런 모양을 만들 수 없습니다. 오버슈트는 딱 한 번만 가능합니다.

이런 움직임이 필요하면 다른 방법을 써야 합니다.

css
/* 여러 번 튕김 — 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 이징은 고정된 곡선입니다.
이 도구가 만든 cubic-bezier 값은 @keyframes 의 animation-timing-function 에도 그대로 쓸 수 있습니다. 아래 CSS 코드에 transition용과 animation용이 함께 나오는 이유입니다.

움직임을 원치 않는 사용자가 있습니다

전정기관 장애가 있는 사람에게 화면 움직임은 실제로 어지럼증과 메스꺼움을 일으킵니다. 그래서 운영체제에 "동작 줄이기" 설정이 있고, 브라우저는 이를 prefers-reduced-motion 으로 알려 줍니다.

이 설정을 켠 사용자에게는 애니메이션을 끄거나 아주 짧게 줄여야 합니다. 완전히 없애는 것보다 투명도 변화 정도만 남기는 편이 맥락을 잃지 않아 좋습니다.

css
@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는 로딩 스피너처럼 계속 도는 회전에만 어울리고, 위치·크기·투명도 변화에 쓰면 기계적으로 느껴집니다.