Text Truncate
JavaScript でテキストを省略する|CSSで無理なケースだけ使う
2025-11-28
結論:JSは最後の手段
CSSの text-overflow / line-clamp で対応できないケースだけ JavaScript を使う。
「とりあえずJS」は間違い。まずCSSを試せ。
JSが必要なケース(これ以外はCSS)
| ケース | 理由 |
|---|---|
| サーバーサイドで事前処理 | ブラウザがない |
| APIレスポンスの整形 | 配信前に処理したい |
| 単語の途中で切りたくない | CSSでは制御不可 |
| 中央省略(ファイル名) | CSSは末尾のみ |
| 省略位置のカスタマイズ | CSSでは固定 |
上記以外は CSS(text-overflow / line-clamp) で対応できる。
基本の省略関数
function truncate(text, maxLength, ellipsis = "…") {
if (text.length <= maxLength) return text;
return text.slice(0, maxLength).trimEnd() + ellipsis;
}
// 使用例
truncate("これは長いテキストです", 8);
// → "これは長いテ…"
シンプルだが、単語の途中で切れる可能性がある。
単語の途中で切らない(英文向け)
function truncateWord(text, maxLength, ellipsis = "…") {
if (text.length <= maxLength) return text;
const truncated = text.slice(0, maxLength);
const lastSpace = truncated.lastIndexOf(" ");
if (lastSpace > 0) {
return truncated.slice(0, lastSpace).trimEnd() + ellipsis;
}
return truncated.trimEnd() + ellipsis;
}
// 使用例
truncateWord("This is a long sentence", 15);
// → "This is a…"("long" の途中で切らない)
日本語対応(句読点で区切る)
function truncateJa(text, maxLength, ellipsis = "…") {
if (text.length <= maxLength) return text;
const truncated = text.slice(0, maxLength);
const breakPoints = ["。", "、", "!", "?", ")", "」"];
for (let i = truncated.length - 1; i > maxLength * 0.5; i--) {
if (breakPoints.includes(truncated[i])) {
return truncated.slice(0, i + 1) + ellipsis;
}
}
return truncated + ellipsis;
}
// 使用例
truncateJa("これは長い文章です。続きもあります。", 15);
// → "これは長い文章です。…"
中央省略(ファイル名向け)
function truncateMiddle(text, maxLength, ellipsis = "…") {
if (text.length <= maxLength) return text;
const charsToShow = maxLength - ellipsis.length;
const front = Math.ceil(charsToShow / 2);
const back = Math.floor(charsToShow / 2);
return text.slice(0, front) + ellipsis + text.slice(-back);
}
// 使用例
truncateMiddle("very-long-filename-2024.pdf", 20);
// → "very-lon…2024.pdf"
ファイル名は拡張子を残したいので中央省略が有効。
React コンポーネント例
function TruncatedText({ text, maxLength, ellipsis = "…" }) {
const truncated = text.length > maxLength
? text.slice(0, maxLength) + ellipsis
: text;
return (
<span title={text}>
{truncated}
</span>
);
}
// 使用
<TruncatedText text="長いテキスト..." maxLength={20} />
title 属性でホバー時に全文表示。
省略記号の選び方
| 記号 | 特徴 |
|---|---|
... | 3文字、スクリーンリーダーは「ピリオドピリオドピリオド」 |
… | 1文字(U+2026)、スクリーンリーダーは「省略」と読むことが多い |
... | 前にスペース、英文向け |
…(U+2026)推奨。 1文字で済み、読み上げも自然。
CSSで省略されているかをJSで検出
function isTextTruncated(element) {
return element.scrollWidth > element.clientWidth;
}
// line-clamp の場合
function isTextClamped(element) {
return element.scrollHeight > element.clientHeight;
}
// 省略されている場合のみツールチップを表示
const el = document.querySelector('.truncate');
if (isTextTruncated(el)) {
el.title = el.textContent;
}
まとめ
| やりたいこと | 関数 |
|---|---|
| 基本の省略 | truncate() |
| 単語区切り(英文) | truncateWord() |
| 句読点区切り(日本語) | truncateJa() |
| 中央省略(ファイル名) | truncateMiddle() |
JSは最後の手段。まずCSSを試せ。
コード生成は Text Truncate で。
関連記事
- Text Truncate完全ガイド — 1行・複数行・JSの判断基準
- text-overflow が効かない時のチェックリスト — CSS事故対応