본문으로 건너뛰기
TDSMoring 디자인 시스템

모션

움직임은 상태가 바뀌었다는 것을 알리는 데만 쓴다. 나타날 때는 빠르게 시작해 부드럽게 멈추고(out), 사라질 때는 천천히 시작해 빠르게 사라진다(in). 시간은 대부분 130~240ms다.

이 페이지의 목차

곡선 2종#

out 나타날 때
in 사라질 때
모션 곡선
이름앱 코드CSS쓰는 때
outEasing.out(Easing.cubic)cubic-bezier(0.33, 1, 0.68, 1)나타날 때. 처음에 빠르고 끝에서 부드럽게 멈춘다.
inEasing.in(Easing.quad)cubic-bezier(0.11, 0, 0.5, 0)사라질 때. 천천히 시작해 빠르게 사라진다.

시간#

모션 시간
움직임시간곡선쓰는 곳
시트 열림240msoutSheet. 어둠막은 투명해졌다 나타나고 시트는 아래에서 올라온다.
시트 닫힘180msinSheet
메뉴 시트 열림220msoutdialog.menu
중앙 대화상자 열림180msoutdialog.alert, dialog.confirm, dialog.choose. 0.96배에서 1배로 커지며 나타난다.
대화상자·메뉴 닫힘130msindialog 전체
끌어내리다 놓음160ms기본Sheet와 메뉴 시트. 닫힐 만큼 끌지 않았을 때 제자리로 돌아온다.
토스트 나타남스프링(damping 18)스프링toast. 아래에서 위로 떠오른다.
토스트 사라짐160ms기본toast
토스트 표시 시간2400ms (되돌리기 버튼이 있으면 6000ms)—toast
로딩 막대 깜빡임700ms씩 반복기본Skeleton. 투명도 0.5와 1 사이를 오간다.
링 차트 채움900ms (150ms 지연)outAnimatedRing
숫자 올라감900ms (150ms 지연)outuseCountUp
문제 진행 칸 채움380msoutSegmentedProgress
밀어서 삭제: 화면 밖으로200ms기본SwipeRow. 110 이상 밀고 놓았을 때.
밀어서 삭제: 제자리로스프링(damping 18)스프링SwipeRow
이미지 확대 되돌리기180~220ms기본ZoomableImage. 더블탭 확대 220ms, 되돌리기 180~200ms.
화면 모드 바뀜: 덮기90ms기본ThemeFade. 새 배경색으로 화면을 덮는다.
화면 모드 바뀜: 걷기300ms (60ms 지연)기본ThemeFade. 새 모드가 그려진 뒤 덮개를 걷는다.
  • 새 움직임의 시간은 120~300ms 안에서 정한다. 나타나는 동작이 사라지는 동작보다 길다(예: 시트 240ms 대 180ms).
  • 움직임은 크기(scale), 투명도(opacity), 위치(translate)만 바꾼다. 레이아웃 크기를 애니메이션하지 않는다.
  • 목록 항목이 차례로 나타나는 효과와 계속 도는 장식 움직임은 쓰지 않는다. 앱에서 계속 반복되는 것은 로딩 막대(Skeleton) 하나뿐이다.
웹에서 쓰기
.sheet { animation: slide-up 240ms var(--tds-ease-out) both; }
.sheet[data-closing] { animation: slide-down 180ms var(--tds-ease-in) both; }

눌림 표현#

눌렀을 때의 반응은 컴포넌트마다 정해져 있다. Android에서는 물결(ripple)이 눌림 표시를 대신하고, 투명도와 배경색 변화는 지워진다(크기 변화는 유지). 자세한 내용은 Pressable 문서에 있다.

눌림 표현
컴포넌트눌렀을 때
PrimaryButton0.985배
CircleButton0.96배
탭 바 가운데 버튼0.95배
SecondaryButton, SmallButton, WellRow, FilterPill투명도 0.8
AmberButton, Card투명도 0.85
OptionRow, ChoiceCard투명도 0.9
TextButton, IconButton투명도 0.6
SettingsRow, 메뉴 행배경이 pressed 색으로 바뀜

진동#

진동은 선택, 눌림, 결과를 손으로 느끼게 하는 보조 수단이다. 진동만으로 정보를 전달하지 않는다. 진동이 꺼진 기기에서는 아무 일도 일어나지 않는다.

진동 종류
함수느낌쓰는 때
haptic.select가벼운 선택 진동탭, 칩, 슬라이더 같은 선택이 바뀔 때
haptic.tap가벼운 눌림PrimaryButton, 대화상자 버튼을 누를 때
haptic.firm중간 세기 눌림길게 눌러 열기·끌기를 시작할 때
haptic.success성공 알림 진동정답을 맞혔을 때, 길게 눌러 확정했을 때
haptic.warning경고 알림 진동문제를 틀렸을 때
haptic.error오류 알림 진동확인 문제를 틀렸을 때, 신고 전송이 실패했을 때

동작 줄이기#

동작 줄이기 대응
@media (prefers-reduced-motion: reduce) {
  .sheet { animation: none; }
}