실제 시스템 커서는 cursor: none으로 숨기고, position: fixed(또는 iframe 내부처럼 좁은 컨테이너라면 absolute)인 대체 요소를 포인터 좌표에 맞춰 따라다니게 합니다. 대체 요소의 이동에는 보통 약간의 lerp(선형 보간, pos += (target - pos) × 0.2 정도)를 줘서 시스템 커서보다 살짝 느리게, 그러나 지연이 거슬리지 않을 만큼만 따라오게 합니다.
"모프"의 핵심은 mouseenter/mouseleave(또는 이 요소들에 대한 이벤트 위임)로 지금 커서 아래에 있는 요소의 종류(링크, 버튼, 텍스트, 드래그 가능한 영역 등)를 판별해 커서 요소에 상태 클래스를 토글하는 것입니다. 각 상태는 크기·모양·배경·라벨 텍스트가 다른 CSS로 정의해두고, 전환에는 transform과 opacity만 애니메이션해 상태가 바뀌는 순간에도 프레임이 끊기지 않게 합니다.
터치 기기에는 마우스 커서 자체가 없으므로 이 패턴은 무의미합니다 — 포인터 타입을 감지해(@media (pointer: fine) 또는 JS의 matchMedia) 데스크톱에서만 적용하고, 터치 환경에서는 시스템 커서를 그대로 두는 게 맞습니다.
언제 쓰나
포트폴리오·에디토리얼 사이트처럼 커서 자체가 브랜드 표현의 일부일 때 씁니다. 업무용 도구·폼처럼 정확한 클릭 위치가 중요한 UI에는 커서를 대체하지 마세요 — 위치 감각이 흐트러집니다.