CSSを使用してテキストの長さをn行に制限する


515

CSSを使用してテキストの長さを「n」行に制限することはできますか(または垂直方向にオーバーフローしたときにカットします)。

text-overflow: ellipsis; 1行のテキストに対してのみ機能します。

元のテキスト:

Ultrices natoque mus mattis、aliquam、pelentesque
tinciduntのエリートpurus lectus、vel ut aliquet、elementum nunc
nunc rhoncus placerat urna!座ってest sed!Ut penatibus turpis
mus tincidunt!ダピバスセドアエネン、マグナサジティス、ロレムベリット

必要な出力(2行):

Ultrices natoque mus mattis、aliquam、pelentesque tinciduntの
cras ellit purus lectus、vel ut aliquet、elementum ...


1
ちょうどノート:テキストオーバーフローの省略記号は、Firefoxの上でサポートされていない、見bugzilla.mozilla.org/show_bug.cgi?id=312156
Joril


IE10では動作しません。それは11で動作します
user2060451 14

@GauravShahありがとうございます。IE10でも動作します。ここでのソリューションのほとんどはクロスブラウザではありません。
user2060451 14

回答:


655

非公式のラインクランプ構文を使用してそれを行う方法があり、Firefox 68以降、すべての主要なブラウザで動作します。

body {
   margin: 20px;
}

.text {
   overflow: hidden;
   text-overflow: ellipsis;
   display: -webkit-box;
   -webkit-line-clamp: 2; /* number of lines to show */
   -webkit-box-orient: vertical;
}
<div class="text">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam consectetur venenatis blandit. Praesent vehicula, libero non pretium vulputate, lacus arcu facilisis lectus, sed feugiat tellus nulla eu dolor. Nulla porta bibendum lectus quis euismod. Aliquam volutpat ultricies porttitor. Cras risus nisi, accumsan vel cursus ut, sollicitudin vitae dolor. Fusce scelerisque eleifend lectus in bibendum. Suspendisse lacinia egestas felis a volutpat.
</div>

IEユーザーを気にしない限りline-heightmax-heightフォールバックを行う必要はありません。


3
たとえば、特定のfont-sizeからline-heightを使用すると、text-align:justifyを使用して次の行の一部を表示できます。省略記号は最後の行の終わりではなく、位置でテキストと重なっています。テキストが左揃えの場合
Matus

3
ここにフィドルがあります:jsfiddle.net/csYjC/1122私がそれを準備していたとき、私は最後の行のその部分がパディングがあるときだけ見えます
Matus

さて、この非標準のWebkitのみの黒魔術が常に完全に機能することは誰も言っていません。他の、おそらく親であるコンテナでパディングを使用できます。<p>タグ内のテキストの折り返しは完全に理にかなっています:jsfiddle.net/csYjC/1129
Evgeny

2
このコメントの時点では、-webkit-line-clampは可視性を考慮していないことに注意してください。このため、デバッグに数時間かかりました。サポートされているバグレポートは次のとおりです:bugs.webkit.org/show_bug.cgi?id=45399
ケビン

3
-webkit-box-orient: vertical;scssのコンパイル時に非表示に問題がある場合は、これを試してください /* autoprefixer: ignore next */ -webkit-box-orient: vertical;
Salam

109

あなたができることは次のとおりです:

.max-lines {
  display: block;/* or inline-block */
  text-overflow: ellipsis;
  word-wrap: break-word;
  overflow: hidden;
  max-height: 3.6em;
  line-height: 1.8em;
}
<p class="max-lines">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vitae leo dapibus, accumsan lorem eleifend, pharetra quam. Quisque vestibulum commodo justo, eleifend mollis enim blandit eu. Aenean hendrerit nisl et elit maximus finibus. Suspendisse scelerisque consectetur nisl mollis scelerisque.</p>

ここでmax-height:= line-height:× <number-of-lines>ですem


13
text-overflow:clipのように機能しています(表示されていないため)(...)
rishiAgar

私にとっても最善の解決策のようですが、@ rishiAgarが指摘したように、省略記号で終わっていません。クリップのように機能し続けます。
David Carrigan 2016年

display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;省略記号を表示するには、属性を追加する必要があると思います。ただし、これはChromeでのみ機能します。Firefoxでも機能する解決策については、こちらをご覧ください:stackoverflow.com/a/20595073/1884158そして、この件に関する役立つチュートリアルがあります:css-tricks.com/line-clampin
modulitos

34

実用的なクロスブラウザーソリューション

この問題は何年もの間私たち全員を悩ませてきました。

すべてのケースで役立つように、CSSのみのアプローチと、CSSの警告が問題になる場合のjQueryアプローチを示しました。

これが私が思いついたCSSのみのソリューションです。いくつかの小さな注意点がありますが、すべての状況で機能します。

基本はシンプルで、スパンのオーバーフローを隠し、Eugene Xaによって提案されているように行の高さに基づいて最大の高さを設定します。

次に、含まれているdivの後に、省略記号を適切に配置する疑似クラスがあります。

注意事項

このソリューションは、必要があるかどうかに関係なく、省略記号を常に配置します。

最後の行が終了文で終わる場合は、4つのドットで終わります。

正当化されたテキストの配置に満足する必要があります。

省略記号はテキストの右側に表示され、ずさんに見える場合があります。

コード+スニペット

jsfiddle

.text {
  position: relative;
  font-size: 14px;
  color: black;
  width: 250px; /* Could be anything you like. */
}

.text-concat {
  position: relative;
  display: inline-block;
  word-wrap: break-word;
  overflow: hidden;
  max-height: 3.6em; /* (Number of lines you want visible) * (line-height) */
  line-height: 1.2em;
  text-align:justify;
}

.text.ellipsis::after {
  content: "...";
  position: absolute;
  right: -12px; 
  bottom: 4px;
}

/* Right and bottom for the psudo class are px based on various factors, font-size etc... Tweak for your own needs. */
<div class="text ellipsis">
  <span class="text-concat">
Lorem ipsum dolor sit amet, nibh eleifend cu his, porro fugit mandamus no mea. Sit tale facete voluptatum ea, ad sumo altera scripta per, eius ullum feugait id duo. At nominavi pericula persecuti ius, sea at sonet tincidunt, cu posse facilisis eos. Aliquid philosophia contentiones id eos, per cu atqui option disputationi, no vis nobis vidisse. Eu has mentitum conclusionemque, primis deterruisset est in.

Virtute feugait ei vim. Commune honestatis accommodare pri ex. Ut est civibus accusam, pro principes conceptam ei, et duo case veniam. Partiendo concludaturque at duo. Ei eirmod verear consequuntur pri. Esse malis facilisis ex vix, cu hinc suavitate scriptorem pri.
  </span>
</div>

jQueryアプローチ

私の意見では、これが最良の解決策ですが、誰もがJSを使用できるわけではありません。基本的に、jQueryは.text要素をチェックし、事前設定された最大変数よりも多くの文字がある場合、残りを切り取って省略記号を追加します。

このアプローチには注意点はありませんが、このコード例は基本的なアイデアを示すことのみを目的としています。次の2つの理由から、これを改善しない限り、本番環境では使用しません。

1).text要素の内部htmlを書き換えます。必要かどうか。2)内側のhtmlにネストされた要素がないことを確認するテストは行われません。したがって、.textを正しく使用するには、作成者に大きく依存しています。

編集済み

キャッチ@markzzzをありがとう

コードスニペット

jsfiddle

setTimeout(function()
{
	var max = 200;
  var tot, str;
  $('.text').each(function() {
  	str = String($(this).html());
  	tot = str.length;
    str = (tot <= max)
    	? str
      : str.substring(0,(max + 1))+"...";
    $(this).html(str);
  });
},500); // Delayed for example only.
.text {
  position: relative;
  font-size: 14px;
  color: black;
  font-family: sans-serif;
  width: 250px; /* Could be anything you like. */
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p class="text">
Old men tend to forget what thought was like in their youth; they forget the quickness of the mental jump, the daring of the youthful intuition, the agility of the fresh insight. They become accustomed to the more plodding varieties of reason, and because this is more than made up by the accumulation of experience, old men think themselves wiser than the young.
</p>

<p class="text">
Old men tend to forget what thought was like in their youth;
</p>
 <!-- Working Cross-browser Solution

This is a jQuery approach to limiting a body of text to n words, and end with an ellipsis -->


3
あなたのCSSソリューションはあまり良くありません、テキストがオーバーフローしない場合はどうですか?「...」も表示されます...
user5260143 '26

しかし、jQueryバージョンでは、テキストが短い場合にドットが追加されます。jsfiddle.net
o82opadm

@markzzz-そのおかげで、どうしてそれを逃したかわからない:-)私は今それを改訂しましたが、もう少しの作業なしにプロダクションで使用するものではありません。しかし、少なくとも基本的な考え方は説明されています。
asimovwasright 2017年

1
CSSのみのソリューションはうまく機能しているように見えますが、これピクセル測定のみを使用する場合に限られます。EMとパーセンテージにより、問題が発生しました。そして、省略記号を<a>スタイルとしてposition:absoluteとして右下に追加し、リンクをクリックして詳細を確認したい人のために追加しました。私の場合、テキストが常にオーバーフローすることがわかっていたため、jQueryは必要ありませんでした。便利なCSSソリューションをありがとう!
メンタリスト2018年

30

私の知る限り、これは使用することでのみ可能でheight: (some em value); overflow: hiddenあり、それでも...最後には空想がありません。

それが選択肢でない場合、サーバー側の前処理(テキストフローを確実に予測することが不可能であるため困難)またはjQuery(可能ですが、おそらく複雑)がないと不可能だと思います。


16
これは、任意のフォントサイズの.mytextで機能するようです。行の高さ:1.2em; max-height:2.4em; }
Peter

1
@ペドロええ。.mytextjQueryを使用してそれぞれを実行し、表示されているよりも多くのコンテンツがあるかどうかを確認して、...手動で追加できる場合があります。そうすれば、JSのないクライアントと互換性があり、JSのあるクライアントは装飾を持つことができます。jQuery Guruが回答する別の質問に値するかもしれません。比較的簡単に実行できる可能あります
Pekka

15

このスレッドからの解決策は、jqueryプラグインdotdotdotを使用することです。CSSソリューションではありませんが、「もっと読む」リンクや動的なサイズ変更などの多くのオプションを提供します。


10

次のCSSクラスは、2行の省略記号を取得するのに役立ちました。

  .two-line-ellipsis {
        padding-left:2vw;
        text-overflow: ellipsis;
        overflow: hidden;
        width: 325px;
        line-height: 25px;
        display: -webkit-box;
        -webkit-line-clamp: 2;
        -webkit-box-orient: vertical;
        padding-top: 15px;
    }

5

現在はできませんが、将来はを使用できるようになりますtext-overflow:ellipis-lastline。現在、Opera 10.60以降ではベンダープレフィックスを使用できます。


5
複数行の文字列では機能しません。white-scace:nowrapも設定する必要があるためです。こちらをご覧ください
セバスチャンノアック、2011

4

私はうまくいく解決策を持っていますが、代わりに省略記号は勾配を使用しています。動的テキストがある場合に機能するため、楕円が必要になるほど長いかどうかはわかりません。利点は、JavaScriptの計算を行う必要がなく、表のセルを含む可変幅のコンテナーで機能し、クロスブラウザーであることです。いくつかの追加のdivを使用しますが、実装は非常に簡単です。

マークアップ:

<td>
    <div class="fade-container" title="content goes here">
         content goes here
         <div class="fade">
    </div>
</td>

CSS:

.fade-container { /*two lines*/
    overflow: hidden;
    position: relative;
    line-height: 18px; 
    /* height must be a multiple of line-height for how many rows you want to show (height = line-height x rows) */
    height: 36px;
    -ms-hyphens: auto;
    -webkit-hyphens: auto;
    hyphens: auto;
    word-wrap: break-word;
}

.fade {
        position: absolute;
        top: 50%;/* only cover the last line. If this wrapped to 3 lines it would be 33% or the height of one line */
        right: 0;
        bottom: 0;
        width: 26px;
        background: linear-gradient(to right,  rgba(255,255,255,0) 0%,rgba(255,255,255,1) 100%);
}

ブログ投稿:http : //salzerdesign.com/blog/?p=453

サンプルページhttp : //salzerdesign.com/test/fade.html


3
.class{
   word-break: break-word;
   overflow: hidden;
   text-overflow: ellipsis;
   display: -webkit-box;
   line-height: 16px; /* fallback */
   max-height: 32px; /* fallback */
   -webkit-line-clamp: 2; /* number of lines to show */
   -webkit-box-orient: vertical;
}

0

私は本当にラインクランプが好きですが、Firefoxはまだサポートされていません。なので、数式計算でオーバーフローを非表示にします

.body-content.body-overflow-hidden h5 {
    max-height: 62px;/* font-size * line-height * lines-to-show(4 in this case) 63px if you go with jquery */
    overflow: hidden;
}
.body-content h5 {
    font-size: 14px; /* need to know this*/
    line-height:1,1; /*and this*/
}

ここで、リンク付きのjQueryを介してこのクラスを削除および追加したいとします。最大高さが63ピクセルになるように、追加のピクセルが必要になります。これは、高さが次の値よりも大きいかどうかを毎回確認する必要があるためです62px、ただし4行の場合、false trueが返されるため、追加のピクセルでこれが修正され、追加の問題は発生しません

私はこれだけの例としてコーヒースクリプトを貼り付け、デフォルトで非表示になっているいくつかのリンクを使用します。クラスはread-moreとread-lessで、オーバーフローが必要としないものを削除し、本文を削除します-overflowクラス

jQuery ->

    $('.read-more').each ->
        if $(this).parent().find("h5").height() < 63
             $(this).parent().removeClass("body-overflow-hidden").find(".read-less").remove()
             $(this).remove()
        else
            $(this).show()

    $('.read-more').click (event) ->
        event.preventDefault()
        $(this).parent().removeClass("body-overflow-hidden")
        $(this).hide()
        $(this).parent().find('.read-less').show()

    $('.read-less').click (event) ->
        event.preventDefault()
        $(this).parent().addClass("body-overflow-hidden")
        $(this).hide()
        $(this).parent().find('.read-more').show()

ちなみに、これにラインクランプを追加しないでください。高さは62pxに設定され(この場合)、jqueryの互換性がなくなります
Alexis

0

letterあなたがそうすることができるそれぞれに集中したいなら、私はこの質問を参照します

wordあなたがそれぞれに焦点を当てたいなら、あなたはそのようにすることができます+スペース

wordあなたがそれぞれに集中したいなら、あなたはそのように+スペースなしで行うことができます


-1

基本的なサンプルコード。コーディングの学習は簡単です。スタイルCSSコメントを確認してください。

table tr {
  display: flex;
}
table tr td {
  /* start */
  display: inline-block; /* <- Prevent <tr> in a display css */
  text-overflow: ellipsis;
  white-space: nowrap;
  /* end */
  padding: 10px;
  width: 150px; /* Space size limit */
  border: 1px solid black;
  overflow: hidden;
}
<table>
  <tbody>
    <tr>
      <td>
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla egestas erat ut luctus posuere. Praesent et commodo eros. Vestibulum eu nisl vel dui ultrices ultricies vel in tellus.
      </td>
      <td>
        Praesent vitae tempus nulla. Donec vel porta velit. Fusce mattis enim ex. Mauris eu malesuada ante. Aenean id aliquet leo, nec ultricies tortor. Curabitur non mollis elit. Morbi euismod ante sit amet iaculis pharetra. Mauris id ultricies urna. Cras ut
        nisi dolor. Curabitur tellus erat, condimentum ac enim non, varius tempor nisi. Donec dapibus justo odio, sed consequat eros feugiat feugiat.
      </td>
      <td>
        Pellentesque mattis consequat ipsum sed sagittis. Pellentesque consectetur vestibulum odio, aliquet auctor ex elementum sed. Suspendisse porta massa nisl, quis molestie libero auctor varius. Ut erat nibh, fringilla sed ligula ut, iaculis interdum sapien.
        Ut dictum massa mi, sit amet interdum mi bibendum nec.
      </td>
    </tr>
    <tr>
      <td>
        Sed viverra massa laoreet urna dictum, et fringilla dui molestie. Duis porta, ligula ut venenatis pretium, sapien tellus blandit felis, non lobortis orci erat sed justo. Vivamus hendrerit, quam at iaculis vehicula, nibh nisi fermentum augue, at sagittis
        nibh dui et erat.
      </td>
      <td>
        Nullam mollis nulla justo, nec tincidunt urna suscipit non. Donec malesuada dolor non dolor interdum, id ultrices neque egestas. Integer ac ante sed magna gravida dapibus sit amet eu diam. Etiam dignissim est sit amet libero dapibus, in consequat est
        aliquet.
      </td>
      <td>
        Vestibulum mollis, dui eu eleifend tincidunt, erat eros tempor nibh, non finibus quam ante nec felis. Fusce egestas, orci in volutpat imperdiet, risus velit convallis sapien, sodales lobortis risus lectus id leo. Nunc vel diam vel nunc congue finibus.
        Vestibulum turpis tortor, pharetra sed ipsum eu, tincidunt imperdiet lorem. Donec rutrum purus at tincidunt sagittis. Quisque nec hendrerit justo.
      </td>
    </tr>
  </tbody>
</table>


4
OPは複数ラインのソリューションを探しています。これは、1行のテキストでのみ機能します。
asimovwasright 2016年

-11

私はこれを探していましたが、私のウェブサイトはphpを使用していると気づきました!!! テキスト入力でトリム機能を使用して、最大長で遊んでみませんか。

これは、phpを使用しているユーザーにも可能な解決策です。http//ideone.com/PsTaI

<?php
$s = "In the beginning there was a tree.";
$max_length = 10;

if (strlen($s) > $max_length)
{
   $offset = ($max_length - 3) - strlen($s);
   $s = substr($s, 0, strrpos($s, ' ', $offset)) . '...';
}

echo $s;
?>

18
ページ内でテキストが占めるスペースを事前に知ることができないため、サーバー側の処理を安全に使用できません。フォントサイズ、ブラウザのテキストサイズ設定、ブラウザのズームレベルなどによって異なります
ermannob
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.