자릿수마다 0~9가 세로로 나열된 "릴(strip)"을 만들고, 그 릴을 담는 칸은 숫자 하나 높이만큼만 overflow: hidden으로 잘라 보여줍니다. 목표 숫자로 바뀔 때 릴 전체를 translateY로 이동시켜 목표 숫자가 칸의 창(window) 안으로 들어오게 합니다 — 릴의 각 숫자 간격이 동일하므로 이동 거리는 (목표 숫자 - 이전 숫자) × 한 칸 높이로 정확히 계산됩니다.
CSS 변수(--d)에 현재 자릿값을 넣고 transform: translateY(calc(var(--d) * -10%))처럼 퍼센트 기반으로 잡으면, 실제 픽셀 높이를 몰라도(반응형 clamp() 크기에도) 항상 정확한 자릿수 위치로 맞아떨어집니다. transition에 약간의 ease-out을 주면 릴이 "달칵" 멈추는 대신 부드럽게 정지합니다.
9에서 0으로 넘어갈 때(예: 19 → 20)는 릴이 반대 방향으로 9칸을 거슬러 올라가는 것처럼 보일 수 있습니다 — 숫자 목록을 0~9를 두 벌 이어 붙여두고 항상 "앞으로만" 이동하도록 목표 인덱스를 계산하면 자연스럽게 넘어갑니다.
언제 쓰나
카운터가 눈에 띄게 오르내리는 통계·점수판에 씁니다. 자릿수가 많거나(6자리 이상) 값이 매우 자주 바뀌면 릴이 계속 어지럽게 움직이니, 갱신 빈도를 낮추거나 count-up으로 대체하세요.