텍스트 스크램블

Text Scramble

글자가 무작위 문자들 사이를 지나며 최종 단어로 "해독"되는 효과. 해커 영화의 코드 화면 같은 느낌을 줍니다.

다른 이름: Scramble textDecrypt text effect
···
html
<span id="txsEl">HOVER ME</span>
css
#txsEl{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:clamp(18px,6.5vmin,30px);
  font-weight:700;letter-spacing:.04em;color:var(--fg);cursor:pointer}
js
let auto=true;
addEventListener('pointerdown',()=>{auto=false;},{capture:true});
addEventListener('pointermove',()=>{auto=false;},{capture:true});
const el=document.getElementById('txsEl');
const CHARS='ABCDEFGHIJKLMNOPQRSTUVWXYZ#%&$*+-01';
const phrases=['HOVER ME','SCRAMBLE','DECODED','TRY ME'];
let phraseIdx=0, running=false;
function scrambleTo(text){
  if(running) return; running=true;
  const len=Math.max(el.textContent.length,text.length);
  const totalFrames=24;
  let frame=0;
  function step(){
    let out='';
    for(let i=0;i<len;i++){
      if(i<text.length && frame/totalFrames > i/len) out+=text[i];
      else out+=CHARS[Math.floor(Math.random()*CHARS.length)];
    }
    el.textContent=out;
    frame++;
    if(frame<=totalFrames) requestAnimationFrame(step);
    else el.textContent=text, running=false;
  }
  step();
}
el.addEventListener('pointerenter',()=>{
  auto=false;
  phraseIdx=(phraseIdx+1)%phrases.length;
  scrambleTo(phrases[phraseIdx]);
});
async function autoSeq(){
  while(auto){
    await new Promise(res=>{ const s=performance.now(); (function st(now){ if(!auto) return res(); if(now-s<1400) requestAnimationFrame(st); else res(); })(performance.now()); });
    if(!auto) break;
    phraseIdx=(phraseIdx+1)%phrases.length;
    scrambleTo(phrases[phraseIdx]);
  }
}
autoSeq();

목표 문자열의 각 글자 위치마다 "이 자리는 몇 프레임째부터 확정할지"를 정해두고(왼쪽부터 순서대로, 또는 무작위 순서로), 그 프레임에 도달하기 전까지는 무작위 문자 풀(영문 대문자·숫자·기호)에서 매 프레임 다른 글자를 뽑아 보여준다. 확정된 자리는 최종 글자로 고정한다.

전체 프레임 수(보통 20~30프레임, 애니메이션 프레임 기준)를 정해두고, 글자 인덱스를 프레임 진행률과 비교해서 "왼쪽 글자부터 순서대로 확정"되게 하면 타자기처럼 왼쪽에서 오른쪽으로 해독되는 느낌이 난다.

원래 글자 수와 목표 글자 수가 다르면(예: "HOVER ME" → "DECODED") 더 긴 쪽 길이에 맞춰 반복하고, 짧은 쪽은 빈 자리를 무작위 문자로 채우다가 사라지게 처리해야 자연스럽다.

언제 쓰나

숫자 카운터, 코드/터미널 테마의 히어로 문구, 버튼 라벨이 상태에 따라 바뀌는 순간에 포인트로 씁니다. 본문에는 쓰지 않습니다.