CSS Tips
CSSで途切れず流れるテキストを実装する方法
ニュースティッカーや装飾テキストに使える、CSSだけで実現する無限ループスクロールのテクニックをご紹介します。
はじめに
横に流れるテキストは、ニュースティッカーや告知バナー、デザインのアクセントなど様々な場面で使われます。
かつてはHTMLの<marquee>タグで実現していましたが、現在は非推奨です。この記事では、CSSのkeyframesアニメーションを使って、途切れることなくスムーズにループするテキストを実装する方法を紹介します。
完成デモ
以下が完成したアニメーションです。テキストが途切れることなく、滑らかにループし続けます。
<div style="width:100%;overflow:hidden;"><div style="display:flex;width:max-content;animation:marquee-demo 8s linear infinite;"><span style="flex-shrink:0;white-space:nowrap;font-size:1.5rem;font-weight:600;padding-right:3rem;">こちらの文字列が横に流れていきます。</span><span style="flex-shrink:0;white-space:nowrap;font-size:1.5rem;font-weight:600;padding-right:3rem;">こちらの文字列が横に流れていきます。</span></div></div>
@keyframes marquee-demo { 0% { transform: translateX(0); } 100% { transform: translateX(-50%); } }
仕組みの解説
このテクニックのポイントは、同じテキストを2つ並べてループさせることです。
1. **同じテキストを2つ用意する**
全く同じ内容のテキストを横に2つ並べます。
2. **Flexboxで横並びに配置**
wrapperをdisplay: flexにして、テキストを横一列に配置します。
3. **-50%まで移動させる**
2つのテキストが並んでいるので、-50%移動すると最初の状態と同じ見た目になります。これにより途切れなくループします。
HTMLコード
<div class="marquee">
<div class="marquee__wrapper">
<span class="marquee__text">こちらの文字列が横に流れていきます。</span>
<span class="marquee__text">こちらの文字列が横に流れていきます。</span>
</div>
</div>
CSSコード
.marquee {
overflow: hidden;
}
.marquee__wrapper {
display: flex;
animation: marquee-scroll 10s linear infinite;
}
.marquee__text {
flex-shrink: 0;
white-space: nowrap;
padding-right: 2rem; /* テキスト間の余白 */
}
@keyframes marquee-scroll {
0% {
transform: translateX(0);
}
100% {
transform: translateX(-50%);
}
}
各プロパティの役割
overflow: hidden
コンテナからはみ出したテキストを非表示にします。これにより、流れるテキストが画面外に出ても見えなくなります。
display: flex
子要素(span)を横並びに配置するためにFlexboxを使用します。
flex-shrink: 0
Flexアイテムが縮まないようにします。これがないとテキストが圧縮されてしまいます。
white-space: nowrap
テキストが改行されないように1行で表示させます。
translateX(-50%)
2つの同じテキストを並べているので、50%移動した時点で最初と同じ見た目になり、ループが継続します。
linear
animation-timing-functionをlinearにすることで、一定速度でスムーズに流れます。
カスタマイズ
このアニメーションは簡単にカスタマイズできます。
**速度を変更する場合**
animationの秒数を変更します。値を小さくすると速く、大きくすると遅くなります。
**逆方向に流す場合**
translateXの値を正の値(50%)にし、初期位置を-50%に設定します。
**ホバーで停止させる場合**
.marquee:hover .marquee__wrapper { animation-play-state: paused; } を追加します。
逆方向に流れるバリエーション
translateXの値を逆にすることで、右から左ではなく左から右に流すこともできます。
<div style="width:100%;overflow:hidden;"><div style="display:flex;width:max-content;animation:marquee-demo-reverse 8s linear infinite;"><span style="flex-shrink:0;white-space:nowrap;font-size:1.5rem;font-weight:600;padding-right:3rem;">右から左ではなく、左から右に流れます。</span><span style="flex-shrink:0;white-space:nowrap;font-size:1.5rem;font-weight:600;padding-right:3rem;">右から左ではなく、左から右に流れます。</span></div></div>
@keyframes marquee-demo-reverse { 0% { transform: translateX(-50%); } 100% { transform: translateX(0); } }
アクセシビリティへの配慮
動くコンテンツは、一部のユーザーにとって不快感や集中の妨げになる場合があります。
prefers-reduced-motionメディアクエリを使用することで、ユーザーがシステム設定で「視差効果を減らす」を有効にしている場合にアニメーションを停止できます。
アクセシビリティ対応のCSS
@media (prefers-reduced-motion: reduce) {
.marquee__wrapper {
animation: none;
}
}
まとめ
CSSのkeyframesアニメーションを使うことで、JavaScriptなしで途切れないスクロールテキストを実装できます。
ポイントは「同じテキストを2つ並べて-50%移動させる」というシンプルな仕組みです。速度や方向のカスタマイズも簡単で、アクセシビリティへの配慮も忘れずに行いましょう。
ニュースティッカーや装飾的なテキスト表示など、様々な場面で活用してみてください。