DEMO
CODE
<div class="demo-stage"><div class="sc-wrap"><div class="sc-text" id="scText">MOTION LAB</div><button class="sc-btn" onclick="scramble()">DECRYPT</button></div></div>
.demo-stage { display:flex; align-items:center; justify-content:center; padding:3rem; }
.sc-wrap { text-align:center; }
.sc-text { font-family:'JetBrains Mono',monospace; font-size:clamp(1.8rem,7vw,3.2rem); font-weight:500; color:#1A1A1A; min-height:1.2em; letter-spacing:.05em; }
.sc-btn { margin-top:1.5rem; padding:.75rem 2rem; background:#1A1A1A; color:#fff; border:none; font-family:'Oswald',sans-serif; letter-spacing:.2em; cursor:pointer; border-radius:6px; }
const scChars = '!?/[]{}=+*^#%@&$~';
function scramble(){
const el = document.getElementById('scText');
const target = el.dataset.value || el.textContent;
el.dataset.value = target;
const queue = [];
for (let i = 0; i < target.length; i++){
const start = Math.floor(Math.random() * 18);
const end = start + Math.floor(Math.random() * 18) + 10;
queue.push({ to: target[i], start: start, end: end, char: '' });
}
let frame = 0;
function update(){
let out = '', done = 0;
for (let i = 0; i < queue.length; i++){
const q = queue[i];
if (frame >= q.end){ done++; out += q.to; }
else if (frame >= q.start){
if (!q.char || Math.random() < 0.3) q.char = scChars[Math.floor(Math.random() * scChars.length)];
out += '<span style="color:#E91B89">' + q.char + '</span>';
}
}
el.innerHTML = out;
if (done < queue.length){ frame++; requestAnimationFrame(update); }
}
update();
}
AI PROMPT
テキストが暗号解読されるように現れる効果を作って。各文字に乱数でstart/endフレームを割り当て、startまでは非表示、start〜endはランダム記号(ピンク色)、end以降は正しい文字を表示。requestAnimationFrameで毎フレームframe++し、全文字doneで停止。等幅フォント+min-heightでガタつき防止。
BOOKS · PR · AMAZON
※当サイトはAmazonアソシエイトプログラムの参加者です。リンクから商品をご購入いただくと、当方に紹介料が発生します。
学びを止めない · AMAZONサブスク
※当サイトはAmazonアソシエイトプログラムの参加者です。リンクから商品をご購入いただくと、当方に紹介料が発生します。
ランダム記号から正しい文字へ解読されるように現れるテキスト効果。ヒーロー・ローディング演出に。この効果は見た目をCSSで整えつつ、JavaScriptでクリックやスクロール・マウス移動などの操作を検知して動きを制御します。
ヒーローの見出し・キャッチコピー・セクションタイトルなど、視線を集めたいテキストに向く。やりすぎると可読性や操作性を損なうため、目的のある一点に絞って使うのがコツです。
動きはGPUで処理されやすいtransformとopacityを軸に組み立てると、レイアウトの再計算(リフロー)を避けて滑らかに動きます。width・height・top/leftなど位置やサイズを直接変えるアニメーションは負荷が高いため避けるのが定石です。当サイトのコードはprefers-reduced-motionに対応しており、動きを減らす設定にしている利用者には自動でアニメーションを抑えるよう配慮しています。
CSSアニメーションは記述が簡潔で軽く、ブラウザ側で最適化されるため高パフォーマンスですが、操作に応じた複雑な分岐や数値計算は不得意です。一方JavaScriptはイベントに反応して動きを動的に組み立てられる反面、書き方を誤ると処理が重くなりがちです。この効果は見た目はCSS・制御はJavaScriptという役割分担で成り立っています。