メインコンテンツまでスキップ
  • Created:
  • Updated:
  • Author:
    Takeshi Takatsudo

テキストオーバーフローとラインクランプ

問題

カード、リスト項目、ナビゲーションなど、制約のあるUI領域にテキストを収めるために切り詰めるのはよくある要件です。AIエージェントはJavaScriptベースの解決策に頼ったり、1行の切り詰めしか処理できない不完全なCSSを生成したりしがちです。特に複数行のクランプは、正確なプロパティの組み合わせが必要で、間違えやすいものです。レガシーの-webkit-line-clampアプローチには相互依存する3つの必須プロパティがあり、いずれか1つでも省略するとサイレントに失敗します。

解決方法

CSSには2つの主要な切り詰めパターンがあります:text-overflowを使った1行の省略記号と、-webkit-line-clampを使った複数行クランプ(標準のline-clampプロパティもより広く採用されつつあります)です。

コード例

1行の省略記号

.truncate {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}

3つのプロパティすべてが必須です:

  • white-space: nowrap は行の折り返しを防ぐ
  • overflow: hidden はあふれたコンテンツをクリップする
  • text-overflow: ellipsis...インジケーターを表示する
<p class="truncate">
This is a very long text that will be truncated with an ellipsis at the end
</p>

複数行クランプ(レガシー構文)

.line-clamp-3 {
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
}

このパターンが動作するには4つのプロパティすべてが必須です。-webkit-プレフィックスが付いていますが、すべての主要ブラウザ(Chrome、Firefox、Safari、Edge)でサポートされており、完全に仕様化された動作です。

<div class="card">
<h3>Card Title</h3>
<p class="line-clamp-3">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris.
</p>
</div>
テキストオーバーフロー — 1行の省略記号と複数行クランプ

モダンなline-clampプロパティ

標準のline-clampプロパティは構文を簡素化します。2025年時点では、Chromiumベースのブラウザがこれをサポートしています。

.line-clamp-modern {
line-clamp: 3;
overflow: hidden;
}

クロスブラウザ対応パターン

最大限の互換性のために、両方のアプローチを組み合わせましょう:

.line-clamp {
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
line-clamp: 3;
}

実用的なカードコンポーネント

.card {
max-width: 320px;
padding: 1rem;
}

.card__title {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}

.card__description {
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
}
<article class="card">
<h3 class="card__title">A very long card title that might overflow</h3>
<p class="card__description">
Card description text that can span multiple lines but will be clamped to
exactly three lines with an ellipsis at the end of the third line.
</p>
</article>

展開可能なクランプテキスト

.expandable {
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
}

.expandable.is-expanded {
-webkit-line-clamp: unset;
}

クランプテキストのアクセシビリティ対応

<p class="line-clamp-3" title="Full text content goes here for tooltip access">
Truncated visible content...
</p>

AIがよくやるミス

  • 1行切り詰めに必要な3つのプロパティのうち1つを忘れる — white-spaceoverflowtext-overflowのすべてを設定する必要がある
  • 複数行クランプでdisplay: -webkit-box-webkit-box-orient: verticalを忘れ、クランプがサイレントに失敗する
  • CSSの代わりにJavaScriptで文字数によるテキスト切り詰めを行う。これはフォントサイズや画面幅が異なると正しく動作しない
  • コンテナに幅の制約を設定しない — text-overflow: ellipsisは要素に制限された幅(明示的またはflex/gridの親からの暗黙的な幅)が必要
  • text-overflow: ellipsisなしでoverflow: hiddenを使い、視覚的なインジケーターなしにテキストが文字の途中でクリップされる
  • -webkit-line-clampをインライン要素に適用する — -webkit-boxディスプレイモデルのブロックレベルボックスが必要
  • クランプされたテキストがスクリーンリーダーからコンテンツを隠すことを考慮しない — フルテキストはDOMに残っているが、視覚のみのユーザーはどれだけ隠されているかのコンテキストを失う

使い分け

1行の切り詰め

  • 動的なラベルを持つナビゲーション項目
  • 可変幅のコンテンツを含むテーブルセル
  • 幅が制約されたタグやバッジ
  • パンくずリンク

複数行クランプ

  • グリッドレイアウトのカード説明文
  • ソーシャルインターフェースのコメントプレビュー
  • 一覧ページの商品説明
  • 記事の抜粋やティーザー

切り詰めるべきでない場合

  • ユーザーが全文を読む必要がある主要コンテンツ
  • エラーメッセージやバリデーションテキスト
  • アクセシビリティ上重要なラベルや説明
  • 切り詰めた部分によって意味が変わるコンテンツ(例: 価格、日付)

Tailwind CSS

Tailwindは1行の省略記号にtruncate、複数行クランプにline-clamp-*ユーティリティを提供しています。

Tailwind: truncateとline-clamp

参考リンク