Tailwind CSSでline-clampが効かない|paddingの落とし穴と正しい行数省略の使い方

line-clampが効かずテキストがはみ出したカードと、正しく2行で省略されたカードのビフォーアフター比較
  • このエントリーをはてなブックマークに追加

スポンサーリンク

カード一覧の本文抜粋を「2行で切って … を出したい」と思って line-clamp-2 を付けたのに、3行目がはみ出したり、まったく効かなかったり——そんな経験はありませんか? クラス名は合っているのに省略されない。でもコードは間違っていないように見える。実はこれ、多くの場合 line-clamp そのものではなく、隣に付けた padding が原因です。

この記事では、Tailwind CSS の line-clamp が「効かない」ときの原因を逆引きで整理し、正しい行数省略の書き方を解説します。まず結論から。行数を付けるだけでよく、余白(padding)は line-clamp を当てた要素の外側に出すのが基本です。

<!-- ✕ 効かない: line-clamp と padding を同じ要素に付けている -->
<p class="line-clamp-2 p-4">長い本文がここに入る……</p>

<!-- ○ 直る: padding は親、line-clamp は内側の要素に分ける -->
<div class="p-4">
  <p class="line-clamp-2">長い本文がここに入る……</p>
</div>

「なぜ padding で崩れるのか」「他にどんな原因があるのか」を、順を追って見ていきましょう。

line-clampが効かずテキストがはみ出したカードと、正しく2行で省略されたカードのビフォーアフター比較
同じ line-clamp-2 でも、padding の当て方ひとつで「はみ出す(左)」と「キレイに省略(右)」が分かれる

line-clampの基本:もうプラグインは要らない

まず前提から。指定した行数でテキストを切って末尾に … を付けたいときは、line-clamp-2 のように 行数を付けるだけです。1〜6 まで標準で用意されていて、line-clamp-none で解除できます。

<p class="line-clamp-2">
  カード一覧の本文抜粋など、長くなりがちなテキストを2行で打ち切って
  末尾に三点リーダーを付けたいときに使います。
</p>

ここで古い記事を見て @tailwindcss/line-clamp プラグインを入れようとした方は要注意です。Tailwind CSS v3.3 以降、line-clamp はフレームワーク本体に標準搭載され、このプラグインは不要になりました。むしろ入れっぱなしだと将来の移行で邪魔になるので、まだ導入している場合は外してしまって問題ありません。

「効かない」原因の逆引き

クラス名が正しいのに省略されない・はみ出すときは、次の4つのどれかに当てはまることがほとんどです。上から順に多い順で並べています。

① 同じ要素に padding を当てている(最頻出)

これが圧倒的に多いパターンです。line-clamp は内部で overflow: hidden と -webkit-box を使って余分な行を隠します。ところが line-clamp を当てた要素自身に上下の padding(py-4 など)があると、隠したはずのテキストが padding 領域ににじみ出て、3行目・4行目が見えてしまいます。

テキスト自体が消えているわけではなく、切り取り線の外側に padding のぶんの余白ができて、そこから中身が漏れているイメージです。直し方はシンプルで、padding は親要素に持たせ、line-clamp は余白のない内側の要素に当てるだけです。

<!-- カードUIのよくある構成。padding は外側の div に寄せる -->
<article class="rounded-lg border p-4">
  <h3 class="font-bold">記事タイトル</h3>
  <p class="mt-2 line-clamp-3 text-gray-600">
    本文の抜粋。ここは3行で打ち切って三点リーダーを出す。
    padding を持つのは親の article 側なので漏れない。
  </p>
</article>

② displayを上書きするクラスを併用している

line-clamp は display: -webkit-box に依存して動きます。そのため 同じ要素に flex や grid、block など display を変えるクラスを併用すると、-webkit-box が上書きされて効かなくなります。レイアウトのために flex を使いたいときは、flex は親コンテナに当て、テキストの省略は子要素側で行うと衝突しません。

③ 高さ固定(h-*)と併用して中途半端に切れる

h-20 のように高さを固定した上で line-clamp を使うと、行数の指定と高さがぶつかって、文字が行の途中で切れたり … が出なかったりします。行数で高さをコントロールしたいなら固定 h-* は外すのが基本です。カードの高さを揃えたい場合は、高さそのものではなく行数(line-clamp-3 など)で揃えると崩れません。

④ 1行だけの省略に line-clamp を使っている

「1行で収まらなければ … にしたい」だけなら、line-clamp ではなく truncate が正解です。truncate は単一行の省略に特化していて、-webkit-box を使わないぶんハマりどころが少なくなります。複数行なら line-clamp-2 以上、1行なら truncate、と使い分けを覚えておくと迷いません。

line-clampが効かない4つの原因(padding併用・display上書き・高さ固定・単一行)と対処をまとめた逆引き表
「効かない」の原因は主にこの4つ。上から順に遭遇しやすい

line-clampが生成するCSSを1枚で理解する

なぜ padding や display で崩れるのかは、生成される CSS を見ると腑に落ちます。line-clamp-2 は次のような CSS に展開されます。

/* line-clamp-2 が生成する CSS */
.line-clamp-2 {
  overflow: hidden;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
}

ポイントは display: -webkit-box と overflow: hidden の2つです。-webkit-box を別の display で上書きすれば行数指定が無効になる(原因②)し、overflow: hidden の切り取り基準は要素の padding の内側なので、padding があるとそのぶん見える範囲が広がる(原因①)——という理屈です。仕組みを1枚で押さえておくと、初見のバグでも切り分けが速くなります。

v4での新機能:任意行数とCSS変数

標準の 1〜6 で足りないときは、Tailwind CSS v4 の任意値(arbitrary value)が使えます。角カッコで好きな行数を指定できます。

<!-- 8行で省略したい -->
<p class="line-clamp-[8]">……</p>

<!-- CSS変数で動的に行数を変える(ショートハンド記法) -->
<p class="line-clamp-(--teaser-lines)">……</p>

line-clamp-(--teaser-lines) は line-clamp-[var(--teaser-lines)] のショートハンドで、var() を自動で補ってくれます。CSS変数側で行数を切り替えれば、画面幅や状態に応じて省略する行数を動的に変えられます。もちろん line-clamp-none でいつでも省略を解除できるので、「もっと見る」ボタンで全文表示に切り替える、といった実装とも相性が良いです。

まとめ:line-clampが効かないときのチェックリスト

Tailwind CSS で line-clamp が効かない・はみ出すときは、次の順で確認してみてください。

  • line-clamp を当てた同じ要素に padding(py-* など)を付けていないか? → padding は親に出す
  • 同じ要素に flex / grid / block など display を変えるクラスを併用していないか?
  • 高さ固定 h-* と併用していないか? → 高さは行数で揃える
  • 1行だけの省略なら line-clamp ではなく truncate を使う
  • 古い @tailwindcss/line-clamp プラグインを入れっぱなしにしていないか?(v3.3 以降は不要)

「クラスは正しいのに効かない」という理不尽の正体は、たいてい padding か display の併用です。仕組み(-webkit-box と overflow: hidden)さえ掴めば切り分けは一瞬なので、慌てず1つずつ潰していきましょう。同じ「効かない」系ではTailwind CSSでhoverが効かない原因と対処もハマりどころが近いので、あわせて読むと切り分けの勘所がつかめます。Tailwind の基本を一度おさらいしたい方はTailwind CSSの使い方【初心者向け】、カード内の要素をまとめてホバーさせたいときはTailwind CSSのgroup-hover完全解説も参考にしてください。

スポンサーリンク

  • このエントリーをはてなブックマークに追加