상태에 반응하는 모션
Motion Interaction Recipes
입력의 응답부터 완료까지. 재시도와 중단도 함께 설계합니다.
이 자료로 구현하기
원문 주소와 버전이 포함된 요청문입니다. 복사한 뒤 만들 화면과 요구사항을 채워 에이전트에게 전달하세요.
TRY THE INTERACTION
열고, 닫고, 다시 열어보세요.
필요할 때 펼치는 정보
내용을 먼저 사용할 수 있게 하고,
움직임으로 변화를 이어줍니다.
전환 중에도 다시 누를 수 있어요. 움직임을 줄여도 같은 내용을 읽을 수 있습니다.
전환 값은 이 데모의 예시입니다. 시스템의 모션 감소 설정도 반영합니다.
FROM PRINCIPLE TO PRACTICE
이 원리로 만든 예제 64
예제를 열어 직접 조작하고, 관찰한 동작을 이 문서의 원리와 비교해 보세요.
Animated List
- 신규 항목 삽입과 읽기 순서
AnimatedList는 앞에서 index+1개를 잘라 역순으로 렌더링하므로 새 항목이 위에 삽입됩니다. 데모는 네 알림을 열 번 복제한 40개 정적 항목을 500px 높이에서 가립니다. 실시간 알림 수신이나 무한 순환 구현은 아닙니다.
- 신규 항목 삽입과 읽기 순서
Blur Fade
- 등장 트리거와 스크롤 진행의 차이
BlurFade는 useInView의 once=true로 진입을 감지한 뒤 opacity·이동·blur를 시간에 따라 바꿉니다. 데모는 아홉 사진에 인덱스 지연을 줍니다. 스크롤을 거꾸로 한다고 등장 효과가 역재생되는 구성은 아닙니다.
- 등장 트리거와 스크롤 진행의 차이
Ripple
- 배경 파동과 입력 피드백의 구분
Ripple은 입력을 받지 않는 동심원 배경이며 기본 여덟 원의 크기를 70px씩 늘리고 지연을 다르게 줍니다. 클릭 때 생기는 RippleButton과 동작이 다릅니다. 대표 데모의 흰 문구는 두 테마에서 별도로 읽기 가능성을 확인해야 합니다.
- 배경 파동과 입력 피드백의 구분
연결된 예제 61개 더 보기
Scroll Based Velocity
- 스크롤 위치가 아닌 속도에 반응
ScrollVelocityRow는 baseX에 시간당 이동량을 누적하고 스크롤 속도로 방향과 배수를 바꿉니다. 같은 scrollY라도 방문 이력에 따라 위치가 다릅니다. 감소 선호는 배수를 1로 만들 뿐 기본 이동을 멈추지 않습니다. 복제본은 첫 블록 외 aria-hidden입니다.
- 스크롤 위치가 아닌 속도에 반응
Text Reveal
- 단어 불투명도를 현재 진행률에서 유도
TextReveal은 200vh 트랙의 target 진행률을 단어별 구간에 나누고 sticky 영역에서 opacity를 계산합니다. 각 단어에는 흐린 복제본과 선명한 복제본이 있습니다. 감소 선호·정적 전체 문장·중복 읽기 처리와 긴 문장 높이는 추가 검토가 필요합니다.
- 단어 불투명도를 현재 진행률에서 유도
Contour, light, altitude.
- 05 / Persistent terrain scene · renderTerrain
One persistent Canvas 2D surface projects an independently generated elevation grid. Elevation bands, approximate surface hillshade and a snow threshold are derived during drawing. Document progress selects camera and chapter state; the renderer is never remounted. This isolates terrain presentation and lifecycle principles without an actual DEM, glTF or Webflow integration. This binding describes the authored study and does not verify the original project.
- 05 / Persistent terrain scene · renderTerrain
Scroll is the director.
- 12 / Cylindrical camera sequence · renderCylinder
A software-projected cylinder samples an original procedural panel atlas. Document progress sets the camera path, base rotation and chapter selection. A closed-form exponentially decaying spin impulse derives rotation and particle energy from the same scrubbed time. This is a deterministic study of inertia, not a claim that live wheel velocity was measured. This binding describes the authored study and does not verify the original project.
- 12 / Cylindrical camera sequence · renderCylinder
From far away to within.
- 16 / Layered three-scene story · renderMoonStory
A single progress evaluator blends an original SVG globe, atmospheric depth layers and an observatory interior. Document-owned scroll maps to bounded scale, translation and opacity; chapter availability changes immediately at explicit boundaries. Native view inputs replace pointer parallax and the static path exposes every chapter in ordinary flow. This binding describes the authored study and does not verify the original project.
- 16 / Layered three-scene story · renderMoonStory
Animate Between Different Targets
- 서로 다른 노드를 연결하는 식별자
thumbnail과 full-size는 별개 img지만 data-flip-id="img"를 공유합니다. 클릭 시 두 active 클래스를 바꾼 뒤 이전 두 노드의 상태에서 Flip.from을 실행합니다. 확대된 화면은 모달이나 새 경로가 아니며 Escape·초점 이동은 구현되어 있지 않습니다.
- 서로 다른 노드를 연결하는 식별자
Animate between layout positions
- 배치 상태를 먼저 바꾸고 이전 기하에서 연결
버튼은 Flip.getState로 element의 기하와 backgroundColor를 기록한 뒤 absolute 클래스를 토글하고 문구를 갱신합니다. Flip.from은 1초 동안 새 배치까지 연결하며 spin:2로 두 바퀴 회전합니다. 새 노드를 복제하거나 다른 항목으로 교체하는 시연은 아닙니다.
- 배치 상태를 먼저 바꾸고 이전 기하에서 연결
Animate CSS Grid Positions
- 격자 슬롯 교환을 먼저 확정
changeGrid는 모든 product를 측정한 다음 기존 active와 클릭한 항목의 data-grid를 교환합니다. Flip.from의 absolute:true는 이동 중 배치를 처리합니다. 원본 CSS에는 img-2 선택자가 중복되어 img-3 지정이 빠져 있어, 프리뷰 어댑터에서 해당 선택자만 보정하고 원본 파일은 보존합니다.
- 격자 슬롯 교환을 먼저 확정
Enter And Exit
- 배치별 삭제 대상과 실제 DOM 순서
setState는 item과 button을 측정하고 DOM 변경을 적용한 뒤 animate를 호출합니다. animate는 해당 배치의 exiting 노드 목록을 캡처해 타임라인 끝에서 그 목록만 제거합니다. Shuffle은 실제 DOM을 이동하고 Add Box는 앞에 새 li를 넣습니다.
- 배치별 삭제 대상과 실제 DOM 순서
Flexbox Filtering
- 남는 항목의 이동과 떠나는 항목의 정리
독립 예제의 아홉 항목은 같은 DOM을 유지합니다. filterTo는 이전 효과를 끝까지 정착시킨 뒤 Flip.getState로 측정하고 display 필터를 적용합니다. Flip.from의 onEnter·onLeave가 반환한 효과가 가시성을 다루며 결과 없음 안내는 떠나는 항목의 조상을 숨기지 않습니다. 빠른 입력 정책은 현재 중간 상태에서 매끄럽게 재지정이 아니라 이전 효과를 끝낸 뒤 새 집합으로 이동입니다.
- 남는 항목의 이동과 떠나는 항목의 정리
Footer bounce
- 진입 속도로 시작하는 시간 기반 효과
onEnter에서 getVelocity를 한 번 읽고 10000으로 나눈 값을 elastic.out의 두 인수에 넣습니다. 이후 2초 MorphSVG 트윈은 스크롤 위치와 독립적으로 진행합니다. variation 범위를 제한하지 않으므로 큰 속도에서의 곡선은 별도 점검이 필요합니다.
- 진입 속도로 시작하는 시간 기반 효과
Horizontal scrolling gallery
- 핀 구간과 실제 넘침 길이
refresh는 pinWrap.scrollWidth에서 innerWidth를 빼 가로 이동 길이를 구합니다. ScrollTrigger는 portfolio를 고정하고 x 함수를 스크럽하며 refreshInit에서 다시 측정합니다. ScrollSmoother의 normalizeScroll과 preventDefault 설정은 프리뷰 내부에 국한해 검증해야 합니다.
- 핀 구간과 실제 넘침 길이
Horizontal Text
- 부모 이동을 기준으로 계산하는 글자 트리거
scrollTween은 text를 xPercent:-100으로 이동하며 wrapper를 5000px 구간 고정합니다. 각 char의 ScrollTrigger는 containerAnimation:scrollTween을 사용해 left 100%에서 left 30%까지 yPercent와 rotation을 복원합니다. 글자 효과의 기준은 문서 세로 좌표 자체가 아니라 부모의 가로 이동입니다.
- 부모 이동을 기준으로 계산하는 글자 트리거
Image Mask On Scroll
- 마스크와 이미지의 반대 이동
comparisonSection이 고정되는 동안 afterImage는 xPercent 100→0, 그 안 img는 -100→0으로 동시에 움직입니다. 상반된 이동 덕분에 그림을 옆으로 밀기보다 경계로 드러냅니다. end는 section.offsetWidth만큼의 스크롤 거리이며 대체 그림 둘은 같은 기하의 무채색·색상 버전입니다.
- 마스크와 이미지의 반대 이동
Image sequence
- 스크롤 진행과 프레임 준비 상태
imageSequence는 147개 Image를 미리 만들고 frame 값을 반올림해 바뀐 프레임만 drawImage합니다. 첫 이미지의 onload만 최초 그림을 시작하며 다른 프레임의 디코드 완료 장벽이나 실패 대체 화면은 없습니다. 프리뷰는 같은 수의 독립 제작 회전 도형 프레임을 사용하고 원본 사진은 재현하지 않습니다.
- 스크롤 진행과 프레임 준비 상태
Infinite card slider
- 누적 이동량과 화면의 반복 위치
playhead.offset은 누적 이동을 유지하고 wrapTime이 반복 타임라인의 표시 위치로 바꿉니다. scrollEnd와 onDragEnd는 같은 scrollToOffset에서 spacing 단위로 맞춥니다. 이전·다음 버튼도 동일한 offset을 사용하므로 드래그 외의 단일 포인터 조작 경로가 실제로 존재합니다.
- 누적 이동량과 화면의 반복 위치
Infinite looped panels
- 반복 페이지가 소유하는 스크롤 경계
첫 패널을 마지막에 복제한 뒤 기존 패널들을 pinSpacing:false로 고정합니다. window scroll 리스너는 끝을 넘으면 1px, 처음보다 위면 maxScroll-1로 위치를 바꾸며 resize에서 최대값을 갱신합니다. 페이지의 유한한 처음·끝으로 진행하는 문서 탐색과 다른 입력 계약입니다.
- 반복 페이지가 소유하는 스크롤 경계
Keyframes
- 순서와 누적 시간이 다른 키프레임
새로 정한 세 keyframe의 지속 시간은 0.6·0.4·0.8초입니다. 한 트윈이 배열을 순서대로 실행하고 inspect는 time()을 누적 경계와 비교합니다. 총 진행률을 단순히 세 등분하지 않습니다. 세 도착 마커와 입력 값은 독립 예제가 공개하는 좌표 계약입니다.
- 순서와 누적 시간이 다른 키프레임
Lateral pin indicator
- 네 표현이 공유하는 진행률
네 listItems에 맞춰 이전 항목의 색과 슬라이드를 복귀시키고 현재 항목을 드러냅니다. fill은 처음 1/4 크기에서 같은 timeline 길이 동안 1까지 자라며 마지막에는 빈 트윈으로 짧은 정체 구간을 더합니다. 목록의 강조색이 실제 선택 상태나 탐색 명령은 아닙니다.
- 네 표현이 공유하는 진행률
Link To Scroll Progress
- 현재 스크롤 구간과 회전 진행률
공식 코드는 #trigger의 top center부터 bottom center까지 scrub:true로 회전을 연결합니다. 동반 예제의 긴 구간과 sticky 도형은 새로 만든 관찰 표면입니다. 문서에는 ease:none이 없으므로 회전 각도가 스크롤 거리와 일정한 비율이라고 추가로 주장하지 않습니다.
- 현재 스크롤 구간과 회전 진행률
MotionPath Waypoints
- 다시 측정하는 경로와 컨텍스트
createTimeline은 이전 ctx를 revert하고 시작 box와 다섯 marker의 중심 차이를 points로 만듭니다. MotionPath의 curviness:1.5와 scrub:1이 그 점들을 연결합니다. resize가 같은 함수를 부르므로 이전 transform에서 누적 측정하지 않도록 정리 순서가 중요합니다.
- 다시 측정하는 경로와 컨텍스트
Orchestrated easeReverse
- 자식마다 지정한 역재생 곡선
독립 메뉴는 패널·세 항목·아이콘 막대에 각각 easeReverse를 지정합니다. 메뉴를 중간에서 바꾸면 같은 타임라인을 play·reverse하고 곡선 설정을 바꾸면 이전 효과를 제거한 뒤 닫힘 상태로 다시 구성합니다. 부모 타임라인에 설정 하나만 붙여 모든 자식이 같은 역재생 곡선을 따른다고 설명하지 않습니다.
- 자식마다 지정한 역재생 곡선
Pinned panels with overscroll
- 내용 이동과 장면 퇴장의 시간 배분
inner의 초과 높이로 fakeScrollRatio와 여백을 계산합니다. 긴 패널에서는 inner를 위로 이동하는 구간을 먼저 넣고 패널의 scale·opacity 퇴장을 이어 붙입니다. 최초 ratio와 margin은 resize에서 다시 구하지 않으므로 end 함수가 새 높이를 읽는 것만으로 전체 크기 대응이 보장되지는 않습니다.
- 내용 이동과 장면 퇴장의 시간 배분
Radial Menu
- 시각적 닫힘과 실제 조작 가능 상태
buildTimeline은 반지름 120의 180…270도 호에 네 항목을 놓고 펼침 타임라인을 만듭니다. 토글은 aria-expanded와 isOpen을 바꾸며 Escape도 닫습니다. 원본은 닫힌 항목의 opacity·scale만 0으로 만들고 tabindex·inert를 바꾸지 않아, 시각적 닫힘만으로 키보드 메뉴 계약을 충족하지 않습니다.
- 시각적 닫힘과 실제 조작 가능 상태
Scroll waypoints
- 측정 상태 두 개와 하나의 진행률
createTimeline은 이전 flipCtx를 revert한 뒤 second·third marker를 측정합니다. 두 Flip.fit 사이에 0.5 위치 간격을 두고 scrub:1로 묶으며, clamp된 시작과 종료를 사용합니다. resize는 타임라인과 측정 상태를 함께 다시 만듭니다.
- 측정 상태 두 개와 하나의 진행률
Scrubbed bento gallery
- 최종 배치 측정과 크기 변경 재구성
createTween은 기존 flipCtx를 revert한 다음 gallery--final을 잠시 붙여 최종 상태를 캡처합니다. 클래스를 제거한 현재 배치에서 Flip.to로 향하고 이를 pin·scrub 타임라인에 넣습니다. resize는 같은 함수로 다시 구성하며 컨텍스트 정리 함수가 항목의 inline 표현을 비웁니다.
- 최종 배치 측정과 크기 변경 재구성
Smooth Scrolling
- 독립 프리뷰가 소유하는 스크롤 보정
ScrollSmoother를 먼저 만들고 smooth:2, effects:true, normalizeScroll:true를 지정합니다. shape는 가운데 도달 후 300px 고정되고 버튼은 smoother.scrollTo로 같은 위치를 요청합니다. 이는 네이티브 문서 스크롤만 사용하는 로컬 스토리 계약과 다른 메커니즘이며 독립 프리뷰 안에서만 실행됩니다.
- 독립 프리뷰가 소유하는 스크롤 보정
Stagger items in on scroll
- 진입 시점으로 묶이는 배치
ScrollTrigger.batch의 onEnter는 전달받은 batch에 1초 autoAlpha 트윈을 만들고 항목마다 0.2초 지연을 줍니다. interval·batchMax는 주석이라 실행 설정이 아니며 leave나 역방향 재숨김도 지정하지 않았습니다. 화면에 나타난 뒤 멈춰도 등장 효과가 완료되는 구조입니다.
- 진입 시점으로 묶이는 배치
Staggering
- 순서를 바꾸지 않는 시작점
등장은 왼쪽부터 0.1초 간격이고 퇴장은 클릭한 index를 stagger.from으로 사용합니다. amount:1은 퇴장 시작 시점을 전체 1초에 분산합니다. DOM을 재정렬하는 구현은 아니며 모두 나간 뒤 재등장 버튼은 원본에 없습니다.
- 순서를 바꾸지 않는 시작점
Swipe Slider
- 전체 화면 입력과 전환 잠금
Observer는 wheel·touch·pointer의 방향을 gotoSection으로 연결하고 preventDefault:true로 기본 스크롤을 가로챕니다. gotoSection은 wrap으로 인덱스를 순환시키며 outer·inner를 반대 방향으로 움직이고 글자를 무작위 순서로 드러냅니다. animating 중 입력은 버리며 키보드 장면 버튼은 원본에 없습니다.
- 전체 화면 입력과 전환 잠금
Trigger On Scroll
- 진입 이벤트와 연속 스크럽의 차이
toggleActions는 onEnter·onLeave·onEnterBack·onLeaveBack에 play reverse play reverse를 대응합니다. 손잡이는 1초 트윈으로 93px 움직이며 scrub은 설정하지 않았습니다. 별도 ScrollTrigger는 방향을 읽어 화살표만 바꿉니다.
- 진입 이벤트와 연속 스크럽의 차이
영상 경계를 넘는 세 단어
- 영상 경계를 넘는 세 단어의 구현 계약
세 단어의 읽기 순서를 DOM에 유지하고 선택된 단어만 강조해 미디어 자르기와 텍스트 계층을 비교합니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 영상 경계를 넘는 세 단어의 구현 계약
매달린 장식의 당김과 복귀
- 매달린 장식의 당김과 복귀의 구현 계약
포인터 당김의 미리보기와 버튼·화살표 입력이 같은 제한된 위치 값을 변경하며 놓기에서 기본 위치로 복귀합니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 매달린 장식의 당김과 복귀의 구현 계약
실내 그림 위 모서리 정보
- 실내 그림 위 모서리 정보의 구현 계약
제목과 모서리 연락처를 SVG 밖의 실제 요소로 유지하고 연락 정보는 장식 미디어와 독립된 disclosure로 공개합니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 실내 그림 위 모서리 정보의 구현 계약
도시 실루엣과 챕터 선택
- 도시 실루엣과 챕터 선택의 구현 계약
하나의 챕터 선택이 도시 색과 제목을 동시에 결정하며 직접 선택 버튼을 항상 유지합니다. 원본 전환 방향은 추정하지 않습니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 도시 실루엣과 챕터 선택의 구현 계약
선 구체와 건너뛰는 역사 인트로
- 선 구체와 건너뛰는 역사 인트로의 구현 계약
선 구체 인트로와 실제 기록 목록을 분리하고 건너뛰기는 타이머 없이 같은 본문을 즉시 공개합니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 선 구체와 건너뛰는 역사 인트로의 구현 계약
항공 풍경과 원형 문구 배지
- 항공 풍경과 원형 문구 배지의 구현 계약
원형 배지는 SVG 장식으로 두고 같은 초대 문구를 일반 텍스트로 제공하여 풍경 실패와 읽기를 분리합니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 항공 풍경과 원형 문구 배지의 구현 계약
화면 폭 제목과 맞닿는 미디어
- 화면 폭 제목과 맞닿는 미디어의 구현 계약
제목 하단과 그림의 경계를 맞추고 넓은 보기·확대 보기 사이에서도 제목과 설명은 같은 읽기 위치에 남깁니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 화면 폭 제목과 맞닿는 미디어의 구현 계약
서명형 이름과 아티스트 소식
- 서명형 이름과 아티스트 소식의 구현 계약
서명처럼 배치한 실제 이름과 소식 카드를 그림 밖에 두고 청취 링크 자리는 외부 재생 없는 트랙 표지 선택으로 구현합니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 서명형 이름과 아티스트 소식의 구현 계약
빈 칸을 섞은 가구 이미지 보드
- 빈 칸을 섞은 가구 이미지 보드의 구현 계약
소개문과 가구 보드를 다른 읽기 영역으로 두고 빈 칸과 가장자리 자르기는 장식 그림에만 적용합니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 빈 칸을 섞은 가구 이미지 보드의 구현 계약
둥근 야외 장면의 고정 정보
- 둥근 야외 장면의 고정 정보의 구현 계약
의료 주장 없이 자체 야외 그림과 소개를 사용하며 둥근 사진 패널의 자르기와 정보 영역의 대비 책임을 분리합니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 둥근 야외 장면의 고정 정보의 구현 계약
밤의 역과 무음 음악 탐색
- 밤의 역과 무음 음악 탐색의 구현 계약
자체 밤 역과 새 캐릭터 위에서 로컬 곡 제목 검색·장르 선택·무음 시각 미리보기를 제공합니다. 오디오·로그인·마이크 요청은 없으며 원본 재생은 미검증입니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 밤의 역과 무음 음악 탐색의 구현 계약
금속 재질 확대와 중앙 제품 보기
- 금속 재질 확대와 중앙 제품 보기의 구현 계약
자체 벡터 반사면을 제품 확대 장면으로 사용하고 대비가 유지되는 중앙 버튼에서 새 물건 설명을 엽니다. 차량·시간대 조명·제품 성능을 재현하거나 주장하지 않습니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 금속 재질 확대와 중앙 제품 보기의 구현 계약
상상 회의 장면과 윤곽선 감독 이름
- 상상 회의 장면과 윤곽선 감독 이름의 구현 계약
새로운 새들의 회의 장면과 가상 감독 이름을 윤곽선·채움 제목으로 조합합니다. 릴은 정지 포스터 세 장을 직접 넘기는 무음 실습이며 원본 영상 재생과 시간 효과는 미검증입니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 상상 회의 장면과 윤곽선 감독 이름의 구현 계약
큰 압축 제목 주변의 서로 다른 포스터 창
- 큰 압축 제목 주변의 서로 다른 포스터 창의 구현 계약
크기와 비율이 다른 새 포스터를 제목 주변에 배치하되 제목은 실제 읽기 요소로 유지합니다. 포스터 선택은 작품 설명만 갱신하며 원본 영상 재생을 주장하지 않습니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 큰 압축 제목 주변의 서로 다른 포스터 창의 구현 계약
동심 파형과 무음 시각화 진입
- 동심 파형과 무음 시각화 진입의 구현 계약
수학적으로 그린 무음 파형을 기본 상태로 제공하고 크기·움직임·짧은 시작음을 별도 명시적 입력으로 둡니다. 마이크나 원본 음원 반응을 재현하지 않습니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 동심 파형과 무음 시각화 진입의 구현 계약
스포츠 포스터와 중앙 재생 요청
- 스포츠 포스터와 중앙 재생 요청의 구현 계약
중앙 버튼은 이 예시의 작은 장식 움직임만 시작·정지합니다. 최근 작업 disclosure와 별도로 동작하며 원본 쇼릴·영상 길이·쿠키 처리를 추측하지 않습니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 스포츠 포스터와 중앙 재생 요청의 구현 계약
설산 읽기 장면과 세로 여정 지점
- 설산 읽기 장면과 세로 여정 지점의 구현 계약
이전·다음·세로 목록은 하나의 지점 상태를 바꾸고 전체 여정은 일반 disclosure 문서로 읽습니다. 휠 입력을 가로채지 않으며 가상 고도와 눈의 움직임을 원본 동작 증거로 취급하지 않습니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 설산 읽기 장면과 세로 여정 지점의 구현 계약
책상 조명의 확대 재질과 주황 문의 제어
- 책상 조명의 확대 재질과 주황 문의 제어의 구현 계약
관절·전선·받침이 있는 비군사 책상 조명을 새로 그려 제품 재질의 확대 표현만 연구합니다. 문의는 로컬 초안이며 목표·좌표·성능·운용 정보를 포함하지 않습니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
- 책상 조명의 확대 재질과 주황 문의 제어의 구현 계약
Activity Dropdown · Gamma UI
- 펼침 애니메이션과 펼침 컨트롤의 차이
ActivityDropdown은 바깥 div의 onClick으로 isOpen을 토글합니다. 버튼, tabIndex, 키보드 처리, aria-expanded, aria-controls는 없습니다. 접힌 목록도 DOM에 남고 grid 0fr·opacity 0·overflow로 감추므로 보이지 않는 내용의 접근성 노출을 따로 확인해야 합니다.
- 펼침 애니메이션과 펼침 컨트롤의 차이
Parallax layers서로 다른 속도
- 현재 진행률에서 계산하는 시차
내부 스크롤 진행률에서 뒤쪽 산·앞쪽 산·제목의 이동량을 각각 계산합니다. 정지하거나 움직임 줄이기를 선택하면 장면 내부의 진행률을 0으로 고정하며, 내용은 계속 스크롤해 읽을 수 있습니다.
- 현재 진행률에서 계산하는 시차
Shimmer button빛이 스치는 버튼
- 버튼의 빛과 활성화 결과 구분
빛은 입력과 관계없이 5초마다 버튼 위를 지나갑니다. 클릭은 상태 문구만 표시하며, 자동으로 지나는 빛을 대기나 완료 상태로 사용하지 않습니다.
- 버튼의 빛과 활성화 결과 구분
Expandable card카드에서 펼쳐지는 내용
- 펼침을 기본 동작으로 유지하는 카드
카드 제목은 summary이고 추가 문장은 details 안에 있습니다. 별도 열림 타이머 없이 기본 동작으로 펼치며 아이콘만 회전합니다. 카드 내부에 고정 최대 높이는 없지만 예제 바깥의 250픽셀 높이가 긴 내용을 자를 수 있습니다.
- 펼침을 기본 동작으로 유지하는 카드
Toggle switch켜고 끄는 스위치
- 상태를 먼저 바꾸고 손잡이가 따라오기
버튼의 aria-checked를 즉시 바꾸고, 손잡이 위치와 배경색은 그 속성을 읽는 트랜지션이 따라옵니다. 움직임을 끄면 같은 상태 변화가 즉시 보입니다.
- 상태를 먼저 바꾸고 손잡이가 따라오기
Skeleton to content내용을 기다리는 자리
- 내용과 같은 크기의 자리 표시자
자리 표시자 카드와 실제 내용 카드를 같은 그리드 셀에 겹쳐 두고 최소 높이를 맞춥니다. 도착하면 불투명도만 교차하고 크기는 바뀌지 않습니다.
- 내용과 같은 크기의 자리 표시자
Loading indicators기다림의 리듬
- 대기 표시는 진행률이 아닙니다
고리, 점, 막대 세 표시는 모두 CSS 키프레임만으로 순환하며 어떤 값도 나타내지 않습니다. 실제 진행률이 있다면 별도 계약으로 확정 진행 표시를 씁니다.
- 대기 표시는 진행률이 아닙니다
Bottom sheet아래에서 올라오는 시트
- 시트의 열림 상태와 초점 이동
열 때 hidden을 풀고 상태 속성을 바꿔 위치 트랜지션이 시작되며 초점은 시트 안 버튼으로 이동합니다. 닫을 때는 상태를 먼저 바꾸고 초점을 여는 버튼으로 돌린 뒤 트랜지션이 끝난 뒤에만 숨깁니다.
- 두 위치 사이의 트랜지션
시트는 화면 아래(100%)와 제자리(0) 두 위치만 가지며 그 사이를 트랜지션이 잇습니다. 정지 설정에서는 같은 두 위치 사이를 즉시 이동합니다.
- 시트의 열림 상태와 초점 이동
2D to 3D image평면에서 입체로
- 입체 상태의 소유자와 평면 읽기 상태
버튼의 aria-pressed가 입체 상태를 소유합니다. 입체일 때만 레이어가 translateZ로 분리되고 포인터 기울기가 적용되며, 평면일 때는 어떤 포인터 입력도 그림을 움직이지 않습니다.
- 입체 상태의 소유자와 평면 읽기 상태
Hover zoom caption머무는 손끝의 사진
- 호버, 초점, 고정의 같은 결과
확대와 설명 등장은 :hover, :focus-visible, aria-pressed 세 조건에서 같은 CSS 규칙을 사용합니다. 누르면 고정되어 터치에서도 같은 화면을 볼 수 있습니다.
- 호버, 초점, 고정의 같은 결과
Scroll crossfade스크롤로 바뀌는 사진
- 진행률 하나에서 나오는 세 장의 불투명도
스크립트는 이름 붙인 스크롤 영역에서 0~1 진행률만 계산합니다. 각 프레임은 중심값 --c와 진행률의 거리에서 CSS 계산으로 불투명도를 얻어 역방향과 건너뛰기에서도 같은 결과를 냅니다.
- 진행률 하나에서 나오는 세 장의 불투명도
Scroll zoom reveal다가오는 장면
- 액자에서 전면으로 커지는 사진
액자의 폭과 높이는 진행률에 따라 38%×46%에서 100%로 늘고 모서리는 사라집니다. 글자는 진행률 0.4 이전에 사라져 사진과 함께 확대되지 않습니다.
- 액자에서 전면으로 커지는 사진
Primary role: motion behavior catalog.
Repository Boundary
These recipes describe product behavior and failure cases. They compose with Layout instead of supplying reusable spatial CSS or visual defaults. Start with a Motion Brief; use Vocabulary for the visual effect's name.
Reusable Method
Choose the task below, assign semantic and presentation owners, implement the immediate state change first, and then test any visual interpolation against that baseline. The traces below are expected behavior, not evidence of a tested implementation.
Action Feedback
Use for a command whose acknowledgement and completion are different events.
ready → pending → success | error; a retry is a new request. Press feedback may acknowledge input immediately, but a success treatment waits for actual confirmation. Decide explicitly whether repeated activation is ignored, queued, or replaces the request. Keep essential status available without motion. Test delayed completion, duplicate input, failure, and a response arriving after navigation.
Disclosure
Use for optional content controlled by a nearby trigger. A native details/summary baseline can be enough:
<details>
<summary>Delivery restrictions</summary>
<p>Some destinations need an additional delivery day.</p>
</details>If a custom disclosure is necessary, keep the trigger's expanded state consistent with content availability. The APG disclosure contract describes button activation and state semantics. When closing while focus is inside, move focus to an available logical target before hiding it. Test repeated toggle, long content, and removal of the trigger. Avoid fixed maximum heights that clip real content; Layout owns intrinsic sizing.
Modal Transition
Use when a temporary task must block the surrounding interface. Assign one owner to opening, focus placement, blocking, cancellation, and focus return. An entrance effect may decorate this change; semantic availability must not wait for an arbitrary timeout. If exit animation is retained, define whether the dialog remains modal until cleanup and how reopening supersedes a pending close.
The APG modal dialog guidance supplies the web interaction baseline. Test close during entry, reopen during exit, nested overlays, trigger removal, and reduced motion. After final close there must be no surviving blocker or focus trap.
Reorder And Filter
Use when the same identifiable items move or are removed. Commit the intended logical order, retain stable item keys, and interpolate presentation only where the source/destination mapping is valid. Preserve focused items; if one disappears, choose a documented neighboring item or controlling filter. Do not reorder DOM solely to produce a pleasing stagger.
Trace: filter A → filter B → late A data → B remains current. Test empty results, long item labels, list updates during movement, keyboard navigation, and a focused item's removal. An immediate redraw is the fallback when continuity cannot be established.
Progress And Completion
Use when an ongoing operation needs visible status. Show determinate progress only when backed by a meaningful measurement; otherwise use a pending state. Completion, failure, and cancellation come from the operation, independently of the progress decoration.
Trace: pending → cancellation requested → confirmed cancelled or completed; do not promise cancellation succeeded before the operation confirms it. Essential information persists beyond a transient flourish. Use urgent alerts sparingly; APG alert guidance distinguishes announcements from focus-taking dialogs.
Drag And Settle
Use when direct manipulation previews a change before commitment. Separate the preview value from the committed value. Release on a valid target commits; cancellation restores or reconciles with the current model. A new gesture retargets from the presented position where continuity is intended. Provide a task-equivalent non-drag operation.
The non-drag operation has two separate audiences. WCAG 2.2 Success Criterion 2.5.7 Dragging Movements (Level AA) asks that functionality operated by dragging also be achievable with a single pointer without dragging: a click or tap, not a held path. Its Understanding document states that keyboard equivalence does not meet this criterion by itself unless those controls can also be clicked or tapped, and that the keyboard and single-pointer requirements are evaluated independently. A sortable list with arrow-key reordering therefore still needs pointer-operable move controls, and move buttons that only respond to a pointer still need keyboard operation.
Two exceptions bound the criterion. Dragging may remain the only pointer method when it is essential to the task, and the criterion does not cover dragging that the user agent determines and the author has not modified, such as native scrolling. The alternative cannot itself be a path-based gesture such as a swipe or flick; the Understanding document's own examples are tapping a slider track, move controls beside a sortable item, and a text input for a precise value. It does cover content that suppresses native scrolling and interprets the drag itself, which includes a custom carousel, a canvas pan, or the art-surface swipe in full-viewport scene navigation. Record an essential claim with its reason rather than assuming it.
Failure cases: the alternative exists only in a keyboard handler; the alternative appears only on hover, so touch cannot reach it; the alternative commits a different value or skips the validation that release performs; the alternative moves the item but leaves focus or the announced position on the old location.
Test release inside/outside, cancellation, pointer loss, a changing destination, and repeated reversal. Run the same task three ways (drag, single-pointer activation without movement, keyboard only) and compare the committed value and the final focus. Focus and the selected item must remain traceable while visual position changes. The engine or browser adapter owns gesture events; the product owns acceptance of the new value.
Scroll-Driven Story
Use when a visitor explores a product through ordered visual chapters: scroll a phone into view, enlarge the device, change its screen, then release the scene into the next section. The story is presentation; scrolling must not commit a payment or other application action.
| Responsibility | Contract | Failure to exercise |
|---|---|---|
| Scroll reveal | Entry triggers a time-based effect; declare once or replay | Re-enter, preference change, content hidden before script starts |
| Scroll scrub | Position continuously determines a bounded progress value | Reverse, jump over a segment, load at the middle |
| Pinned story | Document scroll advances a locally sticky stage | Short viewport, long copy, wrong ancestor overflow, release boundary |
| Layered parallax | Each decorative layer maps progress to a bounded displacement | Cropping, text overlap, reduced-motion alternative |
| Media sequence | Progress requests an image frame or media time | Slow decode, stale completion, missing frame, unavailable media |
The Scroll Story Lab links runnable Flow and headphones examples, a native CSS scrub, source files, and observed verification. It implements scrub, pinning, scene crossfades, and a small image sequence. Parallax and video seeking remain contracts rather than claimed executed examples.
Scene Composition Contract
Layout owns document scroll, the containing block, sticky offset, available stage height, and track distance. Motion owns progress, scene ranges, continuity, and teardown. The consuming product owns imagery, typography, colors, and visual values. First compose stack, content-limiter, and overlay-stack responsibilities with local sticky positioning; a new Layout pattern requires a distinct demonstrated spatial failure.
Record start, distance, scene_ranges, resize_policy, direct_entry, static_path, and media_budget alongside the Motion Brief. For positive distance, clamp (scroll_position - start) / distance to [0, 1]; a nonpositive distance selects the static path. Derive the entire scene from current progress, not from which callbacks have already fired. This makes reversal and skipped segments well defined.
The worked three-scene example centers chapters at progress 0, 0.5, and 1. Copy crossfades between centers while decorative scale and position interpolate. These values are local choices, not universal timing or easing defaults. No wheel interception or artificial scroll smoothing is needed for the example.
Implementation And Fallback
Choose the smallest rendering mechanism that meets the contract. CSS scroll/view timelines suit declarative interpolation; a scheduled JavaScript renderer can coordinate semantic availability and decoded media. Feature detection only chooses an implementation candidate, not a supported-device claim. The lab demonstrates CSS continuous rotation separately from its JavaScript three-scene controller; it does not claim visual parity between them.
Keep all chapters in ordinary semantic HTML before enhancement. In animated mode, only the presented chapter is available to interaction and accessibility APIs; a visible reading-mode control exposes every chapter in order. Provide a skip link outside the changing panels. Do not put essential actions only inside a fading chapter. Narrow or low windows, overflowing copy, no script, and reduced motion must retain a readable path. React to preference changes during use.
Cache geometry on layout changes, batch scroll updates, and avoid a perpetual idle animation loop. Recompute on resize, delayed fonts/images, and history restoration. Dispose observers, queued frames, and stale media callbacks on removal. A restored page must recompute from its restored position.
Media Contract
Record frame order, dimensions, poster, compression, source/license, decoded-memory estimate, cache limit, concurrent decode limit, timeout, and fallback. A successful older decode must never replace a newer requested frame. Retain a poster or last good frame while loading or after failure. Keep essential text outside the image. For video, additionally define duration readiness, seek granularity, pending-seek replacement, and seek failure; selecting currentTime is not proof of frame-accurate delivery.
The lab uses twelve locally drawn 480×480 SVG illustrations, one in-flight decode, three cached frames, and an eight-second example timeout. These low-detail illustrations verify the loading lifecycle, not photographic quality or production video performance.
Verification Trace
Exercise 0 → 0.5 → 1 → 0.5 → 0, direct entry at 0.5, and jumps across both scene boundaries. Compare presented state at the same progress in both directions. Also exercise resize mid-scene, text growth, image failure, a slow obsolete request, idle updates, reading-mode activation, preference changes, and teardown. Record browser and OS separately from emulated viewport/input. A screenshot proves one state; performance and perceptual continuity need separate evidence.
Technical sources rechecked on 2026-09-09: W3C Scroll-driven Animations draft, requestAnimationFrame, and image decode. These support the API distinctions and decode lifecycle; they do not establish local frame rate, comfort, or adoption.
Full-Viewport Scene Navigation
Task: explore a short sequence as screen transitions while the document stays at one position. This is discrete navigation driven by input, not a scroll-position timeline. Use the Scene Navigation example for a runnable contract.
| Model | State source | Scroll responsibility |
|---|---|---|
| Pinned scrub | Continuous document position | Document traverses a track; the local stage sticks and releases |
| Native snapping | Browser scroll position and snap targets | Document or named pane scrolls between real positions |
| Fixed-viewport scenes | Selected chapter identity | Document stays fixed in scene mode; overflowing copy owns native scrolling |
Choose explicitly; similar appearance does not make their input, history, or recovery behavior equivalent. A short showcase may justify scene navigation. Articles, search results, forms, and long task flows should retain ordinary reading and scrolling unless a tested task requires otherwise.
Input And Navigation Contract
One controller owns the selected chapter. Commit that state immediately and let product CSS retarget presentation; never wait for an animation timer before accepting navigation. Keep the same decorative subject node across scenes when object continuity is intended.
- Declare the input surface. The example owns vertical wheel gestures only within its stage and touch swipes only over its decorative art; visible chapter and previous/next controls remain available.
- Aggregate small wheel deltas and accept at most one navigation per burst. Declare threshold, unit conversion, silence interval, reversal, and edge behavior as local choices. Test long momentum tails on actual target hardware before claiming trackpad support.
- Exempt editable controls, native overflowing copy, modifier gestures, and horizontal scrolling. Do not capture Tab, browser history shortcuts, or pinch zoom. Do not auto-advance from a copy pane when its scroll reaches the edge.
- Support direct chapter links, keyboard commands, Back/Forward restoration, and invalid-fragment fallback. Do not loop at the first or last chapter. Preserve unrelated URL state.
- Make only the selected panel interactive in scene mode. If focus was inside the outgoing panel, move it to the incoming heading; otherwise retain control focus. Announce the chapter separately from animation.
- Provide a persistent reading-mode control and an escape command. All chapters remain ordinary semantic HTML with no script. A short viewport selects reading mode; long copy remains a named native scroll region.
- Reduced motion may preserve discrete navigation while making transitions immediate. State this separately from the pinned example's static fallback, and react to preference changes during use.
The example's 60-pixel aggregate threshold, 180-millisecond silence interval, 55-pixel swipe threshold, and 540-pixel minimum height are product experiments. They are not gallery-wide defaults or measured usability recommendations.
Verification Trace
Record 0 → 1 → 2 → 1 → 0 with document position unchanged, a long wheel burst, fresh reverse gesture, rapid opposite commands, boundary commands, direct entry, Back/Forward, and Escape. Exercise long copy and text editing without changing chapters, cancelled/multi-touch gestures, no script, reduced motion, resize, and teardown. Desktop touch emulation does not establish iOS Safari, Android, physical trackpad, or assistive-technology behavior.
Locally authored interaction contract. The worked example's verification is bounded to its recorded source and runtime; no external homepage implementation is inferred from its appearance.
Opinionated Guidance
For frequent operations, compare with removing motion before increasing its complexity. When two recipes compose, one controller must arbitrate the shared state rather than letting competing completion callbacks decide it.
Platform-Specific Guidance
For the web, prefers-reduced-motion is a preference signal. Define the alternative per recipe and respond to preference changes during use. API support, native gesture physics, and rendering performance require the exact target runtime.
Unsupported Absolutes
These recipes establish no universal duration, spring configuration, frame rate, device coverage, or aesthetic result. A static snippet does not prove animated or assistive-technology behavior.
Verification Contract
For each implemented recipe record before, intermediate, interrupted, and final states; logical order and focus; reduced-motion behavior; and completion/error cleanup. Source inspection can check declared ownership. Rendered interaction and assistive-technology behavior require the consuming application. Review when an API changes or a trace fails.
The Interaction Lab provides a bounded web implementation of feedback, native disclosure, modal dismissal, stale search results, reward reveal, and range-input preview. Its verification notes record exercised states and preferences; they do not establish coverage for every possible implementation of these recipes.
Source, License, And Attribution
Locally authored recipes and HTML. The linked W3C APG pages and Media Queries Level 5 were rechecked on 2026-09-08 for the specific semantics and preference signal above. WCAG 2.2 (W3C Recommendation, 12 December 2024) and its Understanding page for Success Criterion 2.5.7 (updated 10 August 2026) were rechecked on 2026-09-19 for the criterion text, its two exceptions, and its relationship to keyboard operation; the Understanding page is informative, and the failure cases above are local and unexecuted. No upstream examples or timing prescriptions are copied.
IA Navigation
Parent: Motion. Next: Motion Review Workflow.


