1文字ずつ順番に出る 文字の動き

通称:スプリットテキストSplit Text

速さの変わり方

見出しを1文字ずつに分け、少しずつ遅らせて下から浮かび上がらせます。行ごとに出す「文字が行ごとにのぞく」より細かく、文字の流れが目で追えます。

自分のサイトの中身で、この形を作らせる指示文です。最初の「サイトの情報」を書き換えてから渡します。今あるページを直させるときは、その HTML を貼ります。

この形で作る
# 動かすもの(ここを書き換える)
- 動かす要素:〈例:各セクションの見出しとカード、商品の写真〉
- 今あるページ:〈今のページに付けるなら、その HTML と CSS を貼る。新しく作るなら空ける〉

# 動きの呼び名
一般に「スプリットテキスト」(Split Text)と呼ばれる動きです。

# 作ってほしい動き
Split Text(1文字ずつ順番に出る)。見出しが画面に入ったとき、1文字ずつ少し遅らせて、下から浮かび上がらせる。

# 動き
- きっかけ:見出しが画面に 30% 入ったとき。見出しごとに見張り、1回だけ動かす
- 文字の分け方:JavaScript で1文字ずつ span(display: inline-block)に分け、何文字目かを CSS 変数 --i に入れる。英単語は1語ずつ、句読点は前の文字とまとめる(途中で折り返さない・行の頭に句読点を出さない)
- 始まり:opacity 0、translateY(16px)
- 終わり:opacity 1、translateY(0)
- 時間:1文字 0.5秒。1文字ずつ 0.04秒遅らせる(遅れ = --i × 0.04秒)
- 速さの変わり方:すっと止まる(cubic-bezier(0.22, 1, 0.36, 1))

# 付ける場所
- ページの大きな見出し

# 守ってほしいこと
- 読み上げで1文字ずつ区切られないよう、見出しに aria-label で全文を付け、分けた span には aria-hidden="true" を付ける
- 全部の文字が出終わるまでを 2秒以内にする。1文字ずつの遅れは 0.1秒まで、見出しは 20字くらいまで
- 本文の段落には使わない

# 軽さと配慮(どの動きでも守る)
- 動かすのは transform と opacity だけにする(top・left・width・height・margin は動かさない)
- 動きを控える設定(prefers-reduced-motion: reduce)のときは動かさず、最後の状態で表示する
- 画面に入ったかは IntersectionObserver で見る。scroll イベントで毎回位置を測らない
- JavaScript が動かない環境でも中身が見えるようにする(最初に隠す指定は、JavaScript が付ける class の下に書く)
- will-change を付けるなら動いている間だけにする

# 出力
- 足す CSS と JavaScript を分けて出す。ライブラリは使わない
- 時間・距離・速さの変わり方は CSS 変数にまとめ、あとから変えやすくする
- 今あるページを渡したときは、HTML に足す class や属性だけを書き、ほかの見た目は変えない

見出しや数字、文章の中の語を動かして見せる方法を8種類の型に分け、AIへの指示文・動く見本・コードを載せています。見本の下で文言や時間を変えると、指示文とコードも同じものに変わります。

文字の動きはどの型を選ぶか

文字の動きは、文字そのものを1文字ずつ・1語ずつ動かす演出です。読ませたい文字を動かすので、短い見出しや数字、文章の中の1語に絞って使います。まず「出てくるときに動かすか、出たあとに飾るか」を決め、次にサイトの雰囲気で型を選びます。行ごとにのぞかせたいときはリビールの「文字が行ごとにのぞく」、スクロールに合わせて少しずつ読ませたいときはスクロールの「読み進めると文字が濃くなる」が合います。

こんなとき 向いている型
短いキャッチコピーを、文字の流れで見せたい1文字ずつ順番に出る
話しかける調子の見出しや、画面・入力を思わせたいタイプライターで打たれる
AI の返事を、届いた順に少しずつ出したい返事が流れ出る(ストリーミング表示)(読み込み中の動き)
データ・IT・ゲームなど、機械の感じを出したい文字が入れ替わって決まる・ずれて揺れる
実績の数字を印象づけたい数字が数え上がる
数字を、棒や円のグラフで見せたいグラフアニメーション(SVG・図形の動き)
子ども向け・イベントなど、楽しい雰囲気を出したい文字が波打つ
説明文の中の大事な語を読んでほしいマーカーが引かれる
仕事の幅を、1行のキャッチコピーで伝えたい文字が回って入れ替わる
大きな見出しを、行ごとにくっきり出したい文字が行ごとにのぞく(リビールの動き)
短いメッセージを、スクロールに合わせて1行ずつ届けたい読み進めると文字が濃くなる(スクロールの動き)

どの型でも守ること

  1. 文字をばらしたら、読み上げは全文を1回だけにする。見出しに aria-label で全文を付け、ばらした span には aria-hidden="true" を付けます。付けないと、読み上げで1文字ずつ区切って読まれます。
  2. 動きを控える設定の人には、はじめから完成した文字を見せる。@media (prefers-reduced-motion: reduce) の中と、JavaScript の matchMedia の両方で同じ条件を見ます。見本の「動きを控える設定で見る」で、その見え方を確かめられます。
  3. ずっと動かし続けない。波や入れ替わりは数回で止めます。5秒を超えて動き続けるものには、止めるボタンが要ります。点滅は1秒に3回までにします。
  4. 短い文字に絞る。見出しは20字くらいまで、全部の文字が出終わるまでは2秒くらいまでにします。本文の段落には使いません。
  5. まだ出ていない文字にも場所を取っておく。文字が出るたびに行の折り返しや幅が変わると、まわりの要素までがたつきます。

よくある質問 (FAQ)

HTML には分ける前の文をそのまま書き、JavaScript で分けるので、文はそのまま残ります。ここのコードは、ページを読み込んだあとに1文字ずつの span に分けています。JavaScript が動かない環境でも、ふつうの見出しとして読めます。

見出し(h1〜h3)に付けます。p や span のような、役割を持たない要素に付けた aria-label は、読み上げソフトに読まれないことがあります。文章の中の語を動かしたいときは、分けずに動かせる型(マーカーが引かれる)を選ぶと安全です。

1.5〜2秒くらいが目安です。3秒を超えると、数え終わる前にスクロールして通り過ぎる人が増えます。速さを「だんだん遅く」にすると、最後の数が読みやすくなります。

どの単位で分けるか(1文字・1語・行)と、いつ止めるかです。「文字をかっこよく動かして」だけだと、ずっと揺れ続ける動きや、読み上げに配慮のない作りになりがちです。ここの指示文は、分け方・時間・止め方・読み上げの配慮を書き、Split Text のような英語の一般名も添えています。