円形のマスクを使ったテキストが左から現れるCSSアニメーション

初期表示のテキストに重ねる形で、別の色のテキストが左側から現れるアニメーションを実装しました。コードのポイントを含めてメモ書きを残しておきます。

実装例

早速ですが、以下が実装例です。

円形のマスクを使ったテキストが左から現れるCSSアニメーション

テキストが流れるように現れるアニメーションには以下のようにいくつかの手法が考えられます。

手法見た目
overflow: hidden + transform直線的なワイプ
mask-image グラデーションぼかしを含む現れ方
clip-path: ellipse()丸みのある現れ方

今回は丸みを帯びた動きを表現したかったため、パフォーマンスと扱いやすさを考慮してclip-pathを選択しました。

どんな場面で使えるか

  • ファーストビューのキャッチコピー(スクロール不要で目を引く)
  • 下層ページのページタイトル(遷移直後のリッチな印象)
  • セクション見出し(スクロール連動で発火)

テキスト量が多い本文や、頻繁に繰り返される要素には向かない印象です。「特別感」を出したい箇所にピンポイントで使うのが効果的です。

コードの解説

実装の内容を簡単に振り返ります。

HTML

pタグの中に全く同じテキストを2つ配置しています。pタグ直下のテキストが初期表示、spanタグのテキストがアニメーションで表示される色違いのテキストです。

index.html
<p class="text">Contact<span aria-hidden="true">Contact</span></p>

入れ子になっているspanタグのテキストには、aria-hidden="true"を付与してスクリーンリーダーでは読み上げないようにしています。

CSS

positionプロパティを使用して、上記の2つのテキストを全く同じ位置に重ねて配置しています。

style.css
.text {
/* 省略 */
position: relative;
}
.text span {
position: absolute;
top: 50%;
left: 0;
transform: translateY(-50%);
/* 省略 */
}

青色のテキストはclip-pathプロパティで楕円形にクリップしているため、初期状態では表示されていません。 今回使用しているellipse()関数はCSS関数の一つで、構文は次の通りです。

ellipse(横半径 縦半径 at X座標 Y座標)

アニメーション前後でのellipse()関数の値の変化は次の通りです。

アニメーション前アニメーション後
横半径円の半径円の半径
縦半径円の半径円の半径
X座標calc(0% - 円の半径)calc(100% - 円の半径)
Y座標50%50%

アニメーションの前後で変化しているのはatのX座標のみです。

円の半径にはカスタムプロパティで「テキストの横幅+テキストの1行分の高さ」を設定しています。つまりかなり大きな円形のマスクを作成しています。横半径と縦半径が等しいため、楕円ではなく円形のマスクになります。

style.css
.text {
--_clip-radius: calc(100% + 1lh); /* 楕円の半径 */
--_clip-offset-x: 0%; /* 楕円の横方向のオフセット */
/* 省略 */
}
.text span {
/* 省略 */
height: var(--_clip-radius);
clip-path: ellipse(
var(--_clip-radius) var(--_clip-radius) at
calc(var(--_clip-offset-x) - var(--_clip-radius)) 50%
);
transition: clip-path 1s cubic-bezier(0.87, 0, 0.13, 1);
}
.text.is-active {
--_clip-offset-x: 100%; /* 楕円の横方向のオフセット(変化後) */
}

グレーの「Contact」の上に重ねた青い「Contact」のうち、円の内側だけが見えるので、円が左から右へ動くと青い文字が円形で現れて表示されます。アニメーションをテキスト化すると次のようになります。

  • アニメーション前:巨大な楕円が要素の左外にあり、楕円の内側が要素と全く重ならない → 青テキストが完全に隠れる
  • アニメーション中:楕円が右へスライドし、楕円の内側が要素と少しずつ重なり始める → 左から徐々に露出
  • アニメーション後:楕円の内側が要素全体を覆う → 青テキストが完全に表示

図で表すと次のようなイメージです。

クリップパスの巨大な楕円が左から右に移動して、テキストが表示される仕組み

イージングで緩急をつけることで、視線をより誘導しやすいように工夫しています。

まとめ

今回は円形のclip-pathを利用して、テキストが左から流れるように現れるアニメーションを実装しました。

直線的なワイプでは物足りないが、ライブラリを使うほどではない。そのような場面でclip-path: ellipse()でのCSSアニメーションは、軽量かつ効果的な選択肢になると感じました。

円の半径やイージングの値を調整することで、表示スピードや丸みの印象を変えられます。また、X座標だけでなくY座標を動かすと縦方向へのアニメーションにも応用できそうです。

参考サイト

この記事を書いた人

写真:ブール 代表 西川雅人

Masato Nishikawa

ウェブ制作会社・デザイナー様向けに、コーディングやWordPress実装を承っているフリーランスです。繁忙期のサポートや、継続的な外注先をお探しでしたら、お気軽にお声がけください。

コーディングや
WordPress実装の
ご相談を承っています。

新規制作から運用フェーズの修正まで柔軟に対応します。
お見積りや実装可否の確認など、お気軽にご連絡ください。