テキストをランダムに1文字づつ表示するアニメーション
テキストをランダムに1文字づつ表示するアニメーションの実装方法について解説しています。オープニングなどに使うと伝えたいテキストに視線を誘導できそうです。
実装例
下記が実装例です。
テキストを読み込んだ直後にランダムに1文字づつ表示させています。もう一度実行したい場合は、右下にある「Return」ボタンをクリックしてください。
あまりに長いテキストだと視線が忙しくなるので、実装例のように10〜20文字程度のコピーにおすすめです。
解説
HTMLは次のとおりです。
<p class="text" data-char-span data-text-animation="fadeIn">吾輩は猫である。</p><p class="text" data-char-span data-text-animation="fadeIn">名前はまだない。</p>
data-char-span
がテキストを1文字づつspanタグで囲うための属性で、data-text-animation="fadeIn"
がテキストアニメーション設定用の属性となります。
CSSのアニメーションに関する部分は次のとおりです。
/* アニメーション前 */[data-text-animation="fadeIn"] span { opacity: 0; transition: opacity 1s;}
/* アニメーション後 */[data-text-animation="fadeIn"] span.is-active { opacity: 1;}
アニメーションの前後でopacity
を変化させています。今回はopacity
だけですが、その他のプロパティを設定することで表現の幅が広がりそうです。
JavaScriptの処理を言語化
JavaScriptのテキストアニメーションに関する部分は以下のとおりです。
// テキストアニメーションの一連の処理const fadeInChars = document.querySelectorAll( '[data-text-animation="fadeIn"] span'); // アニメーション対象の要素をNodeListとして取得const spansArray = Array.from(fadeInChars); // NodeListを配列に変換
// ランダムに要素を選択してアクティブ化する関数const addActiveClassRandomly = () => { if (spansArray.length === 0) return; // 配列が空の場合は処理を終了
const randomIndex = Math.floor(Math.random() * spansArray.length); // 0から配列の長さ-1までのランダムな整数を生成 const randomSpan = spansArray[randomIndex]; // ランダムに選択された要素を取得
randomSpan.classList.add("is-active"); // 選択された要素にis-activeを追加 spansArray.splice(randomIndex, 1); // 処理済みの要素を配列から削除
if (spansArray.length > 0) { // 配列の要素数が0になるまで setTimeout(addActiveClassRandomly, 100); // 100ミリ秒後に再帰的に関数を呼び出し }};
addActiveClassRandomly(); // アニメーション処理の開始
各行の実行内容はコメントに記載の通りです。
NodeListを配列に変換
// テキストアニメーションの一連の処理const fadeInChars = document.querySelectorAll('[data-text-animation="fadeIn"] span');const spansArray = Array.from(fadeInChars);
querySelectorAll
で取得できる要素はNodeListのため、Array.from
で配列に変換しています。コードの後半で登場するsplice()
メソッドを使用するためです。
ランダムな整数を生成
const randomIndex = Math.floor(Math.random() * spansArray.length);
Math.random()
とMath.floor()
関数を使用して、配列の要素数分のランダムな整数を生成しています。例えば要素が8個ある場合、0〜7のどれかの数字がrandomIndexに代入されます。
繰り返し関数を呼び出し
if (spansArray.length > 0) { setTimeout(addActiveClassRandomly, 100);}
配列の要素数が0になるまで繰り返しaddActiveClassRandomly
を呼び出しています。
各文字の出現するタイミングをコントロールするには、setTimeout
の第二引数のミリセカンドを変更すればOKです。