CSS kullanarak metin uzunluğunu n satırla sınırlayın


515

CSS kullanarak bir metin uzunluğunu "n" satırla sınırlamak (veya dikey olarak taşması durumunda kesmek) mümkün mü?

text-overflow: ellipsis; sadece 1 satır metni için çalışır.

orjinal metin:

Ultrices natoque mus mattis, aliquam, pellentesque
tincidunt elit purus lectus cras, vel ut aliquet, elementum nunc
nunc rhoncus placerat urna! Otur est sed! Ut penatibus turpis
mus tincidunt! Dapibus sed aenean, magna sagittis, lorem velit

İstenen çıktı (2 satır):

Ultrices natoque mus mattis, aliquam, pellentesque
tincidunt elit purus lectus cras, vel ut aliquet, elementum ...


1
Sadece bir not: Metin taşması üç nokta Firefox'ta desteklenmiyor, bkz. Bugzilla.mozilla.org/show_bug.cgi?id=312156
Joril

8
birisi sadece css ile yaparak kaçtı görünüyor mobify.com/dev/multiline-ellipsis-in-pure-css
Gaurav Shah

IE10 üzerinde çalışmaz. 11 üzerinde çalışıyor.
user2060451

@GauravShah Teşekkürler. IE10 üzerinde de çalışır. Buradaki çözümlerin çoğu çapraz tarayıcı değildir.
user2060451

Yanıtlar:


655

Resmi olmayan satır kelepçesi sözdizimini kullanarak yapmanın bir yolu vardır ve Firefox 68 ile başlayarak tüm büyük tarayıcılarda çalışır.

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 kullanıcılarını önemsemediğiniz sürece, yapmaya line-heightve max-heightyedeklemeye gerek yoktur .


3
örneğin, belirli yazı tipi boyutundan satır yüksekliğine kadar, bir sonraki satırın bir kısmını metin hizalaması ile de görebilirsiniz: iki yana yasla, üç nokta son satırın sonunda değil, ancak konumdaki metni çakışıyor, metin sola hizalanmış olsaydı
Matus

3
İşte keman: jsfiddle.net/csYjC/1122 Ben hazırlanırken, son satırın bu kısmının sadece dolgu olduğunda görülebildiğini gördüm
Matus

Kimse bu standart dışı webkit'e özgü kara büyü her zaman mükemmel bir şekilde çalışacak demedi. Dolguyu belki de başka bir kapta kullanabilirsiniz. <p> etiketindeki metni kaydırma mükemmel bir anlam ifade eder: jsfiddle.net/csYjC/1129
Evgeny

2
Bu yorumdan itibaren -webkit-line-clamp'in görünürlüğe saygı duymadığını unutmayın: gizli. Bu hata ayıklama birkaç saat bana mal oldu. İşte destekleyici bir hata raporu: bugs.webkit.org/show_bug.cgi?id=45399 .
Kevin

3
Eğer -webkit-box-orient: vertical;scss derlerken gizli olma ile ilgili sorunlar yaşıyorsanız bunu deneyin /* autoprefixer: ignore next */ -webkit-box-orient: vertical;
Salam

109

Yapabilecekleriniz şunlardır:

.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>

burada max-height:= line-height:× <number-of-lines>inç em.


13
Metin taşması gibi çalışıyor: klibi, gösterilmediği gibi (...)
rishiAgar

Benim için de mümkün olan en iyi çözüm gibi görünüyor, ancak @rishiAgar'ın belirttiği gibi elips ile bitmiyor. Klip gibi çalışmaya devam eder.
David Carrigan

display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;Üç nokta görünmesini sağlamak için özellikleri eklemeniz gerekeceğine inanıyorum . Ancak bu yalnızca Chrome'da çalışır. Firefox'ta da çalışan bir çözüm için buraya bakın: stackoverflow.com/a/20595073/1884158 Ve işte bu konuda yararlı bir öğretici: css-tricks.com/line-clampin
modulitos

34

Çalışma Çapraz Tarayıcı Çözümü

Bu sorun hepimizi yıllardır rahatsız ediyor.

Her durumda yardımcı olmak için, sadece CSS yaklaşımını ve css uyarılarının bir sorun olması durumunda bir jQuery yaklaşımı ortaya koydum.

İşte , her koşulda çalışan birkaç CSS çözümü ile sadece CSS çözümü.

Temel bilgiler basittir, açıklığın taşmasını gizler ve Eugene Xa tarafından önerildiği gibi maksimum yüksekliği satır yüksekliğine göre ayarlar.

Sonra elippsi güzel yerleştiren içeren div sonra sözde bir sınıf var.

Uyarılar

Bu çözüm, ihtiyaç olup olmadığına bakılmaksızın her zaman üç noktaya yerleştirilecektir.

Son satır biten bir cümle ile biterse, dört nokta ile sona erecek ....

Doğrulanmış metin hizalamasından memnun olmanız gerekir.

Üç nokta metnin sağında, özensiz görünebilir.

Kod + Snippet

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 Yaklaşımı

Bence bu en iyi çözüm, ancak herkes JS'yi kullanamıyor. Temel olarak, jQuery herhangi bir .text öğesini kontrol eder ve önceden ayarlanmış maks. Var değerinden daha fazla karakter varsa, geri kalanını keser ve bir üç nokta ekler.

Bu yaklaşım için uyarı yoktur, ancak bu kod örneği sadece temel fikri göstermek içindir - Bunu iki nedenden dolayı gelişmeden üretimde kullanmam:

1) .text elemlerinin iç html'sini yeniden yazacaktır. gerekli olsun ya da olmasın. 2) İç html'de iç içe elem olup olmadığını kontrol etmek için test yapmaz - bu nedenle .text'i doğru kullanmak için yazara çok güveniyorsunuz.

Düzenlenen

@Markzzz için teşekkürler

Kod ve Snippet

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 çözümünüz o kadar iyi değil, çünkü metnin taşmaması durumunda ne olur? ayrıca gösteriliyor "..." ...
user5260143

Ayrıca jQuery sürümü, metin daha kısaysa noktalar ekler: jsfiddle.net/o82opadm/35
markzzz

@markzzz - bunun için teşekkürler, nasıl özlediğimi bilmiyorum :-) Şimdi revize ettim, ama biraz daha fazla çalışma yapmadan üretimde kullanacağım bir şey değil. Ama en azından temel fikir ortaya konuyor.
asimovwasright

1
Yalnızca CSS çözümünün iyi çalıştığını, ancak yalnızca piksel ölçümlerini kullandığınızı gördüm . EM'ler ve yüzdeler beni belaya soktu. Ve üç noktaya konum olarak bir <a> tarz olarak ekledim: bağlantıyı tıklayıp daha fazlasını okumak isteyenler için sağ altta mutlak. Benim durumumda metnin her zaman taşacağını biliyordum, bu yüzden jQuery gerekli değildi. Yararlı CSS çözümü için teşekkürler!
Mentalist

30

Görebildiğim kadarıyla, bu sadece kullanmak mümkün olacak height: (some em value); overflow: hiddenve o zaman bile ...sonunda fantezi olmazdı .

Bu bir seçenek değilse, bazı sunucu tarafı ön işleme (metin akışı güvenilir bir şekilde tahmin etmek zor çünkü zor) veya jQuery (mümkün ama muhtemelen karmaşık) olmadan imkansız olduğunu düşünüyorum.


16
Bu, herhangi bir yazı tipi boyutu .mytext {overflow: hidden; satır yüksekliği: 1.2em; maksimum yükseklik: 2.4em; }
Peter

1
@Pedro evet. .mytextJQuery kullanarak her birini çalıştırabilir , görünürden daha fazla içeriğe sahip olup olmadığını öğrenebilir ve ...manuel olarak ekleyebilirsiniz . Bu şekilde, JS'si olmayan istemcilerle uyumlu olursunuz ve JS'li istemciler dekorasyona sahip olabilirler. Belki bir jQuery Guru'nun cevaplaması için ayrı bir soruya değer; belki nispeten kolayca yapmak mümkün
Pekka


10

CSS dersini takip etmek iki çizgi üç nokta almama yardımcı oldu.

  .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

Şu anda yapamıyorsunuz, ancak gelecekte kullanabileceksiniz text-overflow:ellipis-lastline. Şu anda Opera 10.60+ sürümünde satıcı önekiyle kullanılabilir: örnek


5
Bu, çok çizgili dizgiler için işe yaramaz, çünkü beyaz perdeyi de ayarlamayı gerektirir: nowrap. Buraya bakın .
Sebastian Noack

4

İyi çalışan bir çözüm var ama bunun yerine bir elips degrade kullanır. Dinamik metniniz olduğunda çalışır, bu nedenle bir elips gerekecek kadar uzun olup olmayacağını bilmezsiniz. Avantajları, herhangi bir JavaScript hesaplaması yapmak zorunda olmamanız ve tablo hücreleri de dahil olmak üzere değişken genişlikli kaplar için çalışması ve çapraz tarayıcı olmasıdır. Birkaç ekstra div kullanıyor, ancak uygulanması çok kolay.

İşaretleme:

<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%);
}

blog yazısı: http://salzerdesign.com/blog/?p=453

örnek sayfa: 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

Gerçekten çizgi kelepçesini seviyorum, ama henüz firefox için destek yok .. bu yüzden bir matematik kireç ile gitmek ve sadece taşma gizlemek

.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*/
}

Şimdi bu sınıfı bir bağlantı ile jQuery aracılığıyla kaldırmak ve eklemek istediğinizi varsayalım, maksimum piksel 63 piksel olacak şekilde ekstra bir piksele sahip olmanız gerekecek, çünkü yükseklik her zaman 62 piksel, ancak 4 satır durumunda yanlış bir doğru elde edersiniz, bu nedenle fazladan bir piksel bunu düzeltir ve ekstra bir sorun yaratmaz

bunun sadece bir örnek olması için bir kahve yapıştıracağım, varsayılan olarak gizlenmiş birkaç bağlantı kullanır, sınıflar daha fazla ve daha az okunur, taşma ihtiyacı olmayanları kaldırır ve gövdeyi kaldırır -overflow sınıfları

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()

Bu arada, buna çizgi kelepçesi eklemeyin, yüksekliği 62px'e ayarlayacak (bu durumda) ve jquery karşılaştırmasına sahip olmayacaksınız
Alexis

0

Böyle letteryapabileceğiniz her birine odaklanmak istiyorsanız, bu soruya başvuruyorum

Eğer her birine odaklanmak wordistiyorsanız, bunu + boşluk gibi yapabilirsiniz

Eğer her birine odaklanmak wordistiyorsanız bunu + boşluk olmadan yapabilirsiniz


-1

Temel Örnek Kod, kodlamayı öğrenmek kolaydır. Stil CSS yorumlarını kontrol edin.

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 çok hatlı bir çözüm arıyor. Bu yalnızca tek metin satırlarında çalışır.
asimovwasright

-11

Ben bunun için arıyordum, ama sonra fark, lanet web sitem php kullanıyor !!! Neden metin girişinde trim fonksiyonunu kullanmıyorsunuz ve maksimum uzunlukla oynamıyorsunuz ...

İşte php kullananlar için de olası bir çözüm: 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
Sunucu tarafı işlemeyi güvenli bir şekilde kullanamazsınız, çünkü metnin sayfada ne kadar yer kaplayacağını önceden bilemezsiniz. Yazı tipi boyutuna, tarayıcı metin boyutu ayarlarına, tarayıcı zoom seviyesine vb.
Bağlıdır
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.