長いテキストを一定文字数で省略表示する実装は、記事一覧やカードUIで頻繁に使われます。CSS(-webkit-line-clamp)・JavaScript文字列処理・「続きを見る」展開機能まで解説します。
この記事でわかること
- CSSだけで省略表示する方法(推奨)
- jQueryで任意の文字数で切り詰める方法
- 「続きを読む」ボタンで展開/折りたたみする実装
- 複数要素を一括で処理する方法
1. CSSだけで省略表示する(推奨)
モダンブラウザではCSSだけで行数制限と省略記号の表示が可能です。JavaScriptは不要です。
/* 1行で省略 */
.truncate-1 {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 300px; /* 幅の制限が必要 */
}
/* 複数行で省略(Chrome・Safari・Edge・Firefox対応) */
.truncate-3 {
display: -webkit-box;
-webkit-line-clamp: 3; /* 表示行数 */
-webkit-box-orient: vertical;
overflow: hidden;
}
CSSによる省略が推奨される理由
CSSによる省略はフォント・行高・コンテナ幅に応じて自動で調整されます。JavaScriptで文字数を切り詰める方法は、全角/半角・フォントサイズ・レスポンシブ対応が複雑になります。見た目の調整が目的なら
CSSによる省略はフォント・行高・コンテナ幅に応じて自動で調整されます。JavaScriptで文字数を切り詰める方法は、全角/半角・フォントサイズ・レスポンシブ対応が複雑になります。見た目の調整が目的なら
-webkit-line-clamp を最初に検討してください。2. jQueryで文字数で切り詰める
文字数ベースで正確に切り詰めたい場合や、HTMLの一部(タグを除いたテキスト)を対象にする場合に使います。
$(function () {
var maxLen = 80; // 最大文字数
$('.truncate-text').each(function () {
var text = $(this).text();
if (text.length > maxLen) {
$(this).text(text.slice(0, maxLen) + '…');
}
});
});
3. 「続きを読む」で展開/折りたたみ
省略表示と「続きを読む」ボタンを組み合わせた、ブログでよく使われるパターンです。
<div class="read-more-box">
<div class="rm-content" data-limit="100">
長い本文テキストがここに入ります。この文章は100文字を超えた場合に省略されます。
続きの文章はここに書かれています。ボタンをクリックすると全文が表示されます。
</div>
<a class="rm-toggle" href="#">続きを読む</a>
</div>
$(function () {
$('.rm-content').each(function () {
var $el = $(this);
var limit = parseInt($el.data('limit'), 10) || 100;
var full = $el.text();
if (full.length <= limit) {
$el.next('.rm-toggle').hide(); // 短い場合はボタンを隠す
return;
}
var short = full.slice(0, limit) + '…';
$el.text(short).data('full', full); // 全文をdataに保存
});
$(document).on('click', '.rm-toggle', function (e) {
e.preventDefault();
var $toggle = $(this);
var $content = $toggle.prev('.rm-content');
var isExpanded = $toggle.text() === '閉じる';
if (isExpanded) {
var limit = parseInt($content.data('limit'), 10) || 100;
$content.text($content.data('full').slice(0, limit) + '…');
$toggle.text('続きを読む');
} else {
$content.text($content.data('full'));
$toggle.text('閉じる');
}
});
});
まとめ
| 方法 | メリット | デメリット |
|---|---|---|
| CSS(-webkit-line-clamp) | フォント・幅に自動対応 | 行数制限のみ(文字数指定不可) |
| JS(文字数切り詰め) | 文字数を正確に制御 | レスポンシブ・フォントサイズ考慮が必要 |
| 続きを読むボタン | 全文読める・UXが良い | 実装が少し複雑 |
関連記事: jQueryの.lengthプロパティで要素数を取得する方法 / jQueryのeach()でループ処理する方法
よくある質問(FAQ)
QCSSだけで省略できますか?
Aはい。
text-overflow: ellipsis(1行)または -webkit-line-clamp(複数行)でCSSのみで省略できます。モダンブラウザのサポートも良好で、レスポンシブデザインにも自動対応するため推奨です。Q全角と半角で文字数のカウントが違うのですが?
AJavaScriptの
str.length はUnicode文字数を返すため、全角・半角ともに1文字としてカウントします。視覚的な幅(半角1・全角2)でカウントしたい場合は、正規表現で全角文字を検出して別途計算する必要があります。QHTMLタグを含むコンテンツを省略するには?
AHTMLタグを含む場合は
$(el).text() でテキストのみ取得してから切り詰めるか、CSSの -webkit-line-clamp を使う方が安全です。HTMLタグを壊さずに途中で切り詰めることは複雑なため避けることを推奨します。Q複数の要素を一括で省略処理するには?
A
$(".truncate-text").each(function(){ ... }) で全ての対象要素に対してループ処理できます。各要素ごとに異なる文字数を設定したい場合はdata-limit="100" のようなデータ属性を使うと柔軟に対応できます。Q省略部分を「…」ではなく「もっと見る」リンクにするには?
A切り詰めた後に
$(this).after('<a class="rm-toggle">もっと見る</a>')でリンクを動的に挿入し、クリックイベントで展開する方法を使います(セクション3参照)。