HELLO JAVASCRIPT
<!-- 素のテキストを書くだけ。表示時に再生、クリックで何度でも再生 --> <p class="bnto-scrm" data-bnto-scramble>HELLO JAVASCRIPT</p>
.bnto-scrm { --c1: hsl(202 73% 50%); /* アクセント色 */ margin: 0; background: #fff; border: 2px solid #DFE9F1; border-radius: 14px; padding: 20px 16px; text-align: center; /* 等幅フォントだと解読中の幅ガタつきが出ません */ font-family: Consolas, Menlo, monospace; font-weight: 700; font-size: 17px; letter-spacing: .03em; color: var(--c1); cursor: pointer; user-select: none; }
// data-bnto-scramble を自動検出して初期化(複数設置OK・二重実行OK) (function () { var CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789#$%&+*'; document.querySelectorAll('[data-bnto-scramble]').forEach(function (el) { if (el.dataset.bntoInit) return; el.dataset.bntoInit = '1'; var text = el.textContent; var reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches; var timer = null; function play() { // 動きを減らす設定の人には最終状態を即表示 if (reduce) { el.textContent = text; return; } clearInterval(timer); var frame = 0; timer = setInterval(function () { var fixed = Math.floor(frame / 3); // 3コマごとに左から1文字確定 var out = ''; for (var i = 0; i < text.length; i++) { out += i < fixed ? text[i] : CHARS[Math.floor(Math.random() * CHARS.length)]; } el.textContent = out; frame++; if (fixed >= text.length) { clearInterval(timer); el.textContent = text; } }, 40); } el.addEventListener('click', play); // クリックで再生 play(); // 初期表示時にも1回再生 }); })();
使い方のコツ
元のテキストは初期化時にJSが記憶するので、HTMLには素のテキストを書くだけで動きます。確定スピードは frame / 3 の3を、コマ送りの速さは 40(ms)を変更してください。ランダム文字が英数字なので、英字の見出しと特に相性がよいです。プレビューをクリック(または↺ボタン)で再生し直せます。