ブログ

Blog

コンクリートに刻まれた矢印

テキストをランダムに1文字づつ表示するアニメーション

テキストをランダムに1文字づつ表示するアニメーションの実装方法について解説しています。オープニングなどに使うと伝えたいテキストに視線を誘導できそうです。

実装例

下記が実装例です。

テキストをランダムに表示

テキストを読み込んだ直後にランダムに1文字づつ表示させています。もう一度実行したい場合は、右下にある「Return」ボタンをクリックしてください。

あまりに長いテキストだと視線が忙しくなるので、実装例のように10〜20文字程度のコピーにおすすめです。

解説

HTMLは次のとおりです。

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のアニメーションに関する部分は次のとおりです。

CSS
/* アニメーション前 */
[data-text-animation="fadeIn"] span {
opacity: 0;
transition: opacity 1s;
}
/* アニメーション後 */
[data-text-animation="fadeIn"] span.is-active {
opacity: 1;
}

アニメーションの前後でopacityを変化させています。今回はopacityだけですが、その他のプロパティを設定することで表現の幅が広がりそうです。

JavaScriptの処理を言語化

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を配列に変換

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です。

参考サイト