커서 트레일

Cursor Trail

커서가 지나간 자리에 점들이 조금씩 지연되며 줄줄이 따라오는 효과. 각 점이 앞 점을 쫓아가며 자연스러운 잔상을 만듭니다.

다른 이름: Mouse trailCursor particles
···
html
<div class="stage" id="stage"></div>
css
.stage{position:absolute;inset:0;cursor:none;background:
  radial-gradient(60% 60% at 30% 30%, color-mix(in srgb,var(--accent) 14%,transparent), transparent 65%)}
.tdot{position:absolute;left:0;top:0;border-radius:50%;pointer-events:none}
js
let auto=true;
addEventListener('pointerdown',()=>{auto=false;},{capture:true});
addEventListener('pointermove',()=>{auto=false;},{capture:true});
const stage=document.getElementById('stage');
const N=10;
const dots=[];
for(let i=0;i<N;i++){
  const p=i/(N-1);
  const d=document.createElement('div');
  d.className='tdot';
  const size=10-p*6;
  d.style.width=d.style.height=size+'px';
  d.style.margin=(-size/2)+'px 0 0 '+(-size/2)+'px';
  d.style.opacity=String(1-p*0.75);
  d.style.background='color-mix(in srgb, var(--accent) '+Math.round(100-p*70)+'%, var(--accent-2) '+Math.round(p*70)+'%)';
  stage.appendChild(d);
  dots.push({el:d,x:innerWidth/2,y:innerHeight/2});
}
let mx=innerWidth/2, my=innerHeight/2, t=0;
function update(){
  let px=mx, py=my;
  dots.forEach(d=>{
    d.x += (px-d.x)*0.45;
    d.y += (py-d.y)*0.45;
    d.el.style.transform='translate('+d.x+'px,'+d.y+'px)';
    px=d.x; py=d.y;
  });
}
(function loop(){
  if(auto){
    t+=0.02;
    mx=innerWidth/2+Math.sin(t)*innerWidth*0.38;
    my=innerHeight/2+Math.cos(t*1.7)*innerHeight*0.32;
  }
  update();
  requestAnimationFrame(loop);
})();
addEventListener('pointermove',e=>{ mx=e.clientX; my=e.clientY; });

점 N개를 만들고, 매 프레임 `dot[i].pos += (target - dot[i].pos) * k` 식으로 목표 지점을 향해 조금씩만 이동시킨다(선형 보간, lerp). 첫 점의 target은 실제 커서, 두 번째 점의 target은 첫 점의 현재 위치 — 이렇게 체인으로 엮으면 뒤로 갈수록 지연이 누적돼 자연스러운 꼬리가 된다.

`k`(보간 계수, 보통 0.3~0.5)가 작을수록 꼬리가 길고 느슨하며, 클수록 커서에 바짝 붙는다. 점마다 크기·투명도를 뒤로 갈수록 줄이면 사라지는 느낌이 더 산다.

점 개수가 많아지면(20개 이상) 매 프레임 DOM 스타일을 갱신하는 비용이 커진다. 실무에서는 `<canvas>`에 그리거나 점 개수를 10개 안팎으로 제한한다.

언제 쓰나

캔버스형 툴, 실험적인 랜딩 페이지의 포인트 장식으로 씁니다. 일반 웹앱에서는 커서를 계속 주시하게 만들어 오히려 산만합니다.