概要
line-clampプロパティは、CSSでテキストの表示行数を制限し、超過したテキストを省略記号(…)で表示するための機能です。ブログカード、商品リスト、ニュース一覧など、限られたスペースにテキストを収める必要があるUIコンポーネントで広く活用されています。
この記事では、line-clampの基本的な使い方から実践的な応用パターン、ブラウザ互換性の対処法まで詳しく解説します。
line-clampの基本
line-clampを使用するには、いくつかの関連プロパティを組み合わせる必要があります。これはWebKitベースの実装に由来するためです。
必須プロパティの組み合わせ
.clamped-text {
display: -webkit-box; /* 必須: ボックスレイアウトに変換 */
-webkit-box-orient: vertical; /* 必須: 縦方向にレイアウト */
-webkit-line-clamp: 3; /* 表示する行数を指定 */
overflow: hidden; /* 超過部分を隠す */
}
各プロパティの役割
| プロパティ | 役割 |
|---|---|
display: -webkit-box | フレックスボックスのような特殊なレイアウトモードを有効化 |
-webkit-box-orient: vertical | 子要素を縦方向に配置 |
-webkit-line-clamp | 表示する最大行数を指定 |
overflow: hidden | 指定行数を超えたコンテンツを非表示 |
基本的な使用例
シンプルな3行制限
<p class="text-clamp-3">
これは長いテキストの例です。line-clampプロパティを使用することで、
指定した行数を超えるテキストは自動的に省略され、末尾に「...」が
表示されます。ユーザーに長いテキストであることを視覚的に示すことができます。
</p>
.text-clamp-3 {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
overflow: hidden;
line-height: 1.6;
}
行数を変えた複数のパターン
/* 1行制限 - タイトルや見出し向け */
.clamp-1 {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 1;
overflow: hidden;
}
/* 2行制限 - サブタイトルや短い説明向け */
.clamp-2 {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
}
/* 3行制限 - 概要説明向け */
.clamp-3 {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
overflow: hidden;
}
/* 5行制限 - 詳細説明向け */
.clamp-5 {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 5;
overflow: hidden;
}
実践的な活用パターン
ブログカードコンポーネント
<article class="blog-card">
<img src="thumbnail.jpg" alt="記事のサムネイル" class="blog-card__image">
<div class="blog-card__content">
<h2 class="blog-card__title">最新のCSS技術でレイアウトを作る方法</h2>
<p class="blog-card__excerpt">
この記事では、FlexboxやGridを活用した最新のレイアウト手法について解説します。
レスポンシブデザインにも対応した実践的なサンプルコードを紹介し、
モダンなWebサイト構築のテクニックを学びましょう。
</p>
<time class="blog-card__date">2024年9月27日</time>
</div>
</article>
.blog-card {
display: flex;
flex-direction: column;
border: 1px solid #e0e0e0;
border-radius: 8px;
overflow: hidden;
max-width: 320px;
}
.blog-card__image {
width: 100%;
height: 180px;
object-fit: cover;
}
.blog-card__content {
padding: 16px;
}
.blog-card__title {
font-size: 18px;
font-weight: bold;
margin: 0 0 8px;
/* タイトルは2行まで */
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
}
.blog-card__excerpt {
font-size: 14px;
color: #666;
line-height: 1.6;
margin: 0 0 12px;
/* 概要は3行まで */
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
overflow: hidden;
}
.blog-card__date {
font-size: 12px;
color: #999;
}
商品リストカード
<div class="product-card">
<img src="product.jpg" alt="商品画像" class="product-card__image">
<div class="product-card__info">
<h3 class="product-card__name">高機能ワイヤレスイヤホン Pro Max Edition</h3>
<p class="product-card__description">
最新のノイズキャンセリング技術を搭載し、最大30時間のバッテリー持続時間を実現。
快適な装着感と高音質を両立した、プロフェッショナル向けのワイヤレスイヤホンです。
</p>
<span class="product-card__price">¥29,800</span>
</div>
</div>
.product-card {
display: flex;
gap: 16px;
padding: 16px;
border: 1px solid #ddd;
border-radius: 8px;
max-width: 400px;
}
.product-card__image {
width: 100px;
height: 100px;
object-fit: cover;
border-radius: 4px;
flex-shrink: 0;
}
.product-card__info {
flex: 1;
min-width: 0; /* flexアイテムの縮小を許可 */
}
.product-card__name {
font-size: 16px;
font-weight: bold;
margin: 0 0 8px;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
}
.product-card__description {
font-size: 13px;
color: #666;
line-height: 1.5;
margin: 0 0 8px;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
}
.product-card__price {
font-size: 18px;
font-weight: bold;
color: #e74c3c;
}
レスポンシブ対応の行数制限
.responsive-clamp {
display: -webkit-box;
-webkit-box-orient: vertical;
overflow: hidden;
/* デフォルト: 3行 */
-webkit-line-clamp: 3;
}
/* タブレット: 4行 */
@media (min-width: 768px) {
.responsive-clamp {
-webkit-line-clamp: 4;
}
}
/* デスクトップ: 5行 */
@media (min-width: 1024px) {
.responsive-clamp {
-webkit-line-clamp: 5;
}
}
1行テキストの省略との違い
1行のみのテキスト省略には、line-clampを使わないシンプルな方法があります。
1行省略(従来の方法)
.single-line-ellipsis {
white-space: nowrap; /* 改行を禁止 */
overflow: hidden; /* はみ出し部分を隠す */
text-overflow: ellipsis; /* 省略記号を表示 */
}
比較表
| 要件 | 使用するプロパティ |
|---|---|
| 1行で省略 | white-space + overflow + text-overflow |
| 複数行で省略 | -webkit-line-clamp + 関連プロパティ |
ホバーで全文表示
<div class="expandable-text">
<p class="expandable-text__content">
これは長いテキストの例です。通常は3行で省略されますが、
ホバーすると全文が表示されます。ユーザーが詳細を確認したい場合に
便利なパターンです。
</p>
</div>
.expandable-text {
position: relative;
}
.expandable-text__content {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
overflow: hidden;
transition: all 0.3s ease;
line-height: 1.6;
}
/* ホバー時に全文表示 */
.expandable-text:hover .expandable-text__content {
-webkit-line-clamp: unset;
overflow: visible;
}
JavaScript連携での「もっと見る」機能
<div class="read-more-container">
<p class="read-more-text" id="expandableText">
これは長いテキストの例です。「もっと見る」ボタンをクリックすると
全文が表示されます。再度クリックすると折りたたまれます。
ユーザーが自分のペースでコンテンツを閲覧できる便利な機能です。
</p>
<button class="read-more-button" id="toggleButton">もっと見る</button>
</div>
.read-more-container {
max-width: 300px;
}
.read-more-text {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
overflow: hidden;
line-height: 1.6;
transition: all 0.3s ease;
}
.read-more-text.expanded {
-webkit-line-clamp: unset;
}
.read-more-button {
background: none;
border: none;
color: #007bff;
cursor: pointer;
padding: 8px 0;
font-size: 14px;
}
.read-more-button:hover {
text-decoration: underline;
}
const text = document.getElementById('expandableText');
const button = document.getElementById('toggleButton');
button.addEventListener('click', () => {
text.classList.toggle('expanded');
button.textContent = text.classList.contains('expanded')
? '折りたたむ'
: 'もっと見る';
});
注意点とベストプラクティス
1. 必須プロパティを忘れずに
-webkit-line-clamp単体では動作しません。必ず以下のプロパティをセットで指定してください。
/* NG: line-clampだけでは動作しない */
.broken {
-webkit-line-clamp: 3;
}
/* OK: 必要なプロパティをすべて指定 */
.working {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
overflow: hidden;
}
2. Flexコンテナ内での使用
Flexアイテム内で使用する場合、min-width: 0を設定しないと正しく動作しない場合があります。
.flex-container {
display: flex;
gap: 16px;
}
.flex-item {
flex: 1;
min-width: 0; /* 重要: これがないと省略されない場合がある */
}
.flex-item__text {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
}
3. line-heightとの関係
line-heightを適切に設定することで、見た目がより美しくなります。
.well-styled-clamp {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
overflow: hidden;
line-height: 1.6; /* 適切な行間を設定 */
max-height: calc(1.6em * 3); /* フォールバック用の高さ制限 */
}
ブラウザサポート
| ブラウザ | サポート状況 |
|---|---|
| Chrome | 全バージョン(プレフィックス付き) |
| Firefox | 68以降(プレフィックス付き) |
| Safari | 全バージョン(プレフィックス付き) |
| Edge | 全バージョン(プレフィックス付き) |
| Opera | 全バージョン(プレフィックス付き) |
すべてのモダンブラウザで-webkit-プレフィックス付きでサポートされています。
まとめ
line-clampプロパティは、テキストの行数制限において非常に便利な機能です。
主なポイント:
- 必須プロパティ(
display: -webkit-box、-webkit-box-orient、overflow: hidden)を忘れずに - ブログカード、商品リスト、ニュース一覧など幅広いUIで活用可能
- レスポンシブ対応でデバイスごとに行数を変更できる
- JavaScriptと組み合わせて「もっと見る」機能も実装可能
- Flexアイテム内では
min-width: 0を設定する
適切に活用することで、デザインの一貫性を保ちながら、ユーザーにとって読みやすいコンテンツを提供できます。