브라우저의 재발견 · 로딩·상태

기다림을 견디게 하는 움직임

데이터를 불러오는 동안, 성공했을 때, 실패했을 때 — 시스템의 상태를 몸짓으로 알려주는 9가지. UI의 신뢰감은 화려함이 아니라 이 상태 피드백에서 나온다. 카드의 ‘?’에 준비물·AI 지시문·핵심 코드.

↻ 전부 자동 반복 재생 · 대부분 순수 CSS

01코닉 스피너spinner
conic-gradient + mask 도넛 + rotate

코닉 그라디언트 스피너

필요한 것

div 하나. conic-gradient로 꼬리가 흐려지는 링을 만들고 mask로 가운데를 뚫은 뒤 돌린다. 이미지·SVG 없이 CSS 3줄.

AI에게 이렇게

“conic-gradient와 mask로 꼬리가 사라지는 도넛형 로딩 스피너 만들어줘.”

핵심 코드
background:conic-gradient(transparent 8%,#54c7ff); mask:radial-gradient(farthest-side, transparent calc(100% - 7px),#000 0);
02도트 바운스bouncing dots
animation-delay 0 / .12s / .24s

도트 바운스 로더

필요한 것

점 3개에 같은 keyframes, 다른 delay. 파도처럼 통통. 스피너보다 부드러운 인상이라 챗·검색 UI에 잘 맞는다.

AI에게 이렇게

“점 세 개가 파도 타듯 순서대로 통통 튀는 로딩 인디케이터 만들어줘.”

핵심 코드
i:nth-child(2){animation-delay:.12s} i:nth-child(3){animation-delay:.24s}
03스켈레톤 시머skeleton shimmer
background-position이 광택을 쓸고 감

스켈레톤 시머 (콘텐츠 뼈대)

필요한 것

진짜 콘텐츠 모양대로 회색 블록을 깔고 밝은 광택이 지나가게 한다. 스피너보다 체감 대기시간이 짧다 — 유튜브·페북이 쓰는 이유.

AI에게 이렇게

“카드 로딩 중에 유튜브처럼 회색 뼈대에 광택이 흐르는 스켈레톤 UI 보여줘.”

핵심 코드
background:linear-gradient(90deg, #222b3a 25%,#31405a 42%,#222b3a 60%); background-size:220% 100%; /* position 이동 */
04확정 프로그레스determinate
0%
width % + 숫자 동기화

확정 프로그레스 바

필요한 것

진행률을 아는 작업(업로드·다운로드)엔 반드시 % 숫자와 함께. 바 width와 숫자를 같은 값으로 묶는다.

AI에게 이렇게

“업로드 진행률을 바와 퍼센트 숫자로 같이 보여주는 프로그레스 바 만들어줘.”

핵심 코드
bar.style.width = p+"%"; num.textContent = Math.round(p)+"%";
05무한 프로그레스indeterminate
left −40% → 110% 무한 왕복

무한(불확정) 프로그레스

필요한 것

진행률을 모르는 작업엔 토막 바가 좌→우로 계속 흐른다. 유튜브 상단 빨간 바가 이것. 확정/불확정을 구분해 쓰는 게 UX의 기본.

AI에게 이렇게

“진행률을 모르는 작업용으로, 토막 바가 계속 흐르는 무한 프로그레스 바 만들어줘.”

핵심 코드
@keyframes ind{0%{left:-40%}100%{left:110%}} /* width 36% 토막이 무한히 흐름 */
06성공 체크 드로우success check
원 → 체크 순서로 선 그리기

성공 체크 드로우

필요한 것

결제·저장 완료 화면의 그 체크. 원이 먼저 그려지고 체크가 이어 그려진다(딜레이 체이닝). stroke-dashoffset 두 개면 끝.

AI에게 이렇게

“완료되면 원이 그려지고 이어서 체크가 그려지는 성공 애니메이션 만들어줘.”

핵심 코드
circle{animation:draw .55s forwards} polyline{animation:draw .35s .45s forwards} @keyframes draw{to{stroke-dashoffset:0}}
07에러 셰이크error shake
🔒 비밀번호 ••••••
비밀번호가 일치하지 않습니다
translateX ±6px 감쇠 진동

에러 셰이크 (도리도리)

필요한 것

틀리면 입력창이 고개를 젓는다. 좌우 진폭이 점점 줄어드는 감쇠가 자연스러움의 비결. 빨간 테두리+메시지와 세트로.

AI에게 이렇게

“비밀번호 틀리면 입력창이 좌우로 도리도리 흔들리고 빨간 에러 메시지가 나타나게 해줘.”

핵심 코드
@keyframes shake{ 30%,50%,70%{transform:translateX(-6px)} 40%,60%{transform:translateX(6px)}}
08버튼 상태 몰프button morph
버튼 → 원 스피너 → 체크 3단 변신

버튼 상태 몰프 (제출→로딩→완료)

필요한 것

누르면 버튼이 원으로 수축해 스피너가 되고, 끝나면 초록 체크로. width·border-radius 전환 + 상태 클래스 3개의 상태기계.

AI에게 이렇게

“제출 버튼 누르면 원형 스피너로 줄어들었다가 완료되면 초록 체크로 바뀌게 해줘.”

핵심 코드
btn.classList.add("load"); // 원+스피너 await submit(); btn.classList.replace("load","done"); // 체크
09타이핑 인디케이터typing dots
말풍선 + 도트 웨이브

타이핑 인디케이터 (챗)

필요한 것

‘상대가 입력 중’ 말풍선. 도트 바운스를 말풍선 모양(한쪽 모서리만 뾰족) 안에 넣은 것. AI 챗 응답 대기 UI의 표준.

AI에게 이렇게

“챗봇이 답변 준비 중일 때 말풍선 안에서 점 세 개가 물결치는 타이핑 인디케이터 보여줘.”

핵심 코드
border-radius:18px 18px 18px 5px; /* 말풍선 */ i{animation:wave 1.1s infinite} /* +delay */