ikinci satırda css üç nokta


208

CSS text-overflow: ellipsisİkinci satırda , bu mümkün mü? İnternette bulamıyorum.

misal:

ne istiyorum böyle:

I hope someone could help me. I need 
an ellipsis on the second line of...

ama olan şu:

I hope someone could help me. I ... 

3
Üç nokta AFAIK görünecek ve öğenin genişliğinin sonundaki metni kesecektir. Bir sonraki satıra akmayacak. Buradaki en iyi çözüm, metni otomatik olarak belirli sayıda karaktere kesen ve ardından üç nokta ekleyen bazı sunucu veya istemci tarafı komut dosyası uygulamak olacaktır. Benim tahminim, bir istemci tarafı komut dosyası daha iyi olurdu, bu da ihtiyacınız olan tüm orijinal metne sahip olmanızı sağlar.
FarligOpptreden


tl; dr: sadece webkit'te mümkündür
Evgeny

Bunu gerçekleştirmeye en yakın geldiğimde, üç nokta için bir 'after' sözde elemanı ekledim ve metni içeren öğeden hemen sonra satır içi konumlandırdım. Ancak elips, öğe metni çok uzunsa kaybolur, bu nedenle bunu güvenilir hale getirmek için metni bir şekilde kırpmanız gerekir.
Jonathan

Yanıtlar:


105

text-overflow: ellipsis;Çalışmak için bir gereksinim , white-space( pre, nowrapvb.) 'Nin tek satırlık bir sürümüdür . Bu, metnin asla ikinci satıra ulaşmayacağı anlamına gelir.

Ergo. Saf CSS'de mümkün değil.

Tam olarak aynı şeyi ararken kaynağım : http://www.quirksmode.org/css/textoverflow.html (Quirksmode ftw!)

DÜZENLEME İyi CSS tanrıları http://www.w3.org/TR/css-overflow-3/#max-lines uygulayacaksa , fragments(yeni) ve max-lines(yeni) kullanarak saf CSS'de buna zarar verebiliriz . Ayrıca http://css-tricks.com/line-clampin/ hakkında daha fazla bilgi

DÜZENLEME 2 WebKit / Blink line-clamp: -webkit-line-clamp: 22. çizgiye üç nokta yerleştirir


9
Bir saat tutmak, ancak şu ana kadar tanrılar henüz bizimle değil: caniuse.com/#search=max-lines
Daniel

1
Saas ile yukarıdaki özelliğe nasıl ulaşılır? @Rudie
Bhoomi Bhalani

144

Bu , webkit tarayıcılarında çalışmalıdır :

overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;

1
Bu yorumdan itibaren -webkit-line-clamp'in görünürlüğe saygı duymadığını unutmayın: gizli. bugs.webkit.org/show_bug.cgi?id=45399
Kevin

1
Hey - hoş görünüyor ama benim için çalışmıyor. Sadece verilen satır kıskacına '...' koyuyor ancak metnin geri kalanını kesmiyor (beyaz boşluk
attresinde

3
Bunun çalışması için eklemeniz gerekebilir overflow: hidden.
Robert

Firefox'ta çalışmaz, gecko motorunda desteklenmeyen webkit
ZetaPR

Bu kabul edilen cevap olmalı. Bunu uyguladığınız öğenin altında herhangi bir dolgu istemezsiniz, çünkü metnin geri kalanını gözetleyebilirsiniz.
Tr1stan

34

Diğerlerinin zaten cevapladığı gibi, saf bir CSS çözümü mevcut değildir. Kullanımı çok kolay bir jQuery eklentisi var, buna dotdotdot denir . Üç nokta kesip kırpması gerekip gerekmediğini hesaplamak için kabın genişliğini ve yüksekliğini kullanır.

$("#multilinedElement").dotdotdot();

İşte bir jsFiddle .


Bu eklenti, "daha fazla bilgi" bağlantısı eklemek gibi birçok yardımcı program da sağlar, ayrıca URI'leri ve HTML işaretlemesini ayrıştırabilir. İyi bulmak!
Martin Andersson

2
Bir ızgara kategorisi sayfasındaki ürün adlarını iki satıra sınırlamak için bir e-ticaret mağazası için jQuery dotdotdot 1.7.3'ü denedim. Kapsamlı testlerden sonra, bu eklenti ile gitmemeye karar verdik, çünkü bazen, bir vardiya yenilemesinden sonra kategori sayfa düzeni bozulabilir. YMMV. Sonunda çok basit bir vanilya JS çözümü ile gittik: ürün adı öğesinin clientHeight, scrollHeight değerinden daha azsa, metni önceden belirlenmiş bir sınırda kesin ve "..." ekleyin. Bazen birkaç ürün adı, önceden belirlenmiş sınır nedeniyle biraz çok kısa olabilir, ancak süper kararlıdır.
thdoan

1
Easty uygulamak ve güzel çalışıyor. Teşekkür ederim!
Rachel S

İyi çalışmasına rağmen, maalesef performans sorunlarından muzdarip. Projeniz birden fazla üç nokta kullanımı gerektiriyorsa, başka bir seçenek düşünün. Buna ek olarak, depodan bir alıntı: "Performansı iyileştirilemediğinden, bu eklenti artık aktif olarak korunmuyor."
boyomarinov

1
ayrıca, yüklendikten sonra metin dinamik olarak değişirse işe yaramaz :(
Dejell

34

Skeep'in cevabının yeterli olmadığını ve bir overflowstile de ihtiyaç duyduğunu buldum :

overflow: hidden;
text-overflow: ellipsis;
-webkit-line-clamp: 2;
display: -webkit-box;
-webkit-box-orient: vertical;

18

Birisi SASS / SCSS kullanıyorsa ve bu soru üzerine tökezliyorsa - belki de bu karışım yardımcı olabilir:

@mixin line-clamp($numLines : 1, $lineHeight: 1.412) {
  overflow: hidden;
  text-overflow: -o-ellipsis-lastline;
  text-overflow: ellipsis;
  display: block;
  /* autoprefixer: off */
  display: -webkit-box;
  -webkit-line-clamp: $numLines;
  -webkit-box-orient: vertical;
  max-height: $numLines * $lineHeight + unquote('em');
}

bu sadece webkit tarayıcılarında üç nokta ekler. dinlenme sadece keser.


1
Az kullanarak, değiştirmek zorunda /* autoprefixer: off */için /*! autoprefixer: off */aksi -webkit-box-orient: vertical;üç nokta gösterdi yani hiçbir zaman derleme sonra kaldırılır başlamıştı
Nathan

18

Bunu destekleyen tarayıcılar için (çoğu modern tarayıcı) hat kelepçesini kullanın ve daha yaşlı olanlar için 1 satıra geri dönün.

  .text {
    white-space: nowrap;
    text-overflow: ellipsis;
    overflow: hidden;


    @supports (-webkit-line-clamp: 2) {
      overflow: hidden;
      text-overflow: ellipsis;
      white-space: initial;
      display: -webkit-box;
      -webkit-line-clamp: 2;
      -webkit-box-orient: vertical;
    }
  }

1
beyaz boşluk: başlangıç; kurtardı beni
James

10

İki hat üzerinde çalışamayacağınız için ne yazık! Eleman ekran bloğu ve 2em ya da başka bir yüksekliğe ayarlanmış olsaydı harika olurdu ve metin taştığında bir üç nokta gösterecekti!

Tek bir astar için şunları kullanabilirsiniz:

.show-ellipsis {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

Birden fazla satır için, github'da bulunan jQuery autoellipsis gibi bir Polyfill kullanabilirsiniz http://pvdspek.github.com/jquery.autoellipsis/


Bu eklenti, yaptığı şey için çok ağır. 5 yaşında. dotdotdotBaşka bir gönderide belirtilen kullanım .
adi518

10

Ben JS profesyonel değilim, ama bunu yapabilmek için birkaç yol buldum.

HTML:

<p id="truncate">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi elementum consequat tortor et euismod. Nam commodo consequat libero vel lobortis. Morbi ac nisi at leo vehicula consectetur.</p>

Daha sonra jQuery ile belirli bir karakter sayısına kısalırsınız, ancak son sözcüğü şu şekilde bırakırsınız:

// Truncate but leave last word
var myTag = $('#truncate').text();
if (myTag.length > 100) {
  var truncated = myTag.trim().substring(0, 100).split(" ").slice(0, -1).join(" ") + "…";
  $('#truncate').text(truncated);
}

Sonuç şuna benzer:

Lorem ipsum dolor sit amet, seçkin adipiscing elit. Morbi
elementum sonucu tortor et…

Veya, bunu aşağıdaki gibi belirli bir karakter sayısına kısaltabilirsiniz:

// Truncate to specific character
var myTag = $('#truncate').text();
if (myTag.length > 15) {
  var truncated = myTag.trim().substring(0, 100) + "…";
  $('#truncate').text(truncated);
}

Sonuç şuna benzer:

Lorem ipsum dolor sit amet, seçkin adipiscing elit. Morbi
elementum sonucu tortor ve euismod…

Umarım bu biraz yardımcı olur.

İşte jsFiddle .


7

İşte saf css iyi bir örnek .

.container{
  width: 200px;
}
.block-with-text {
  overflow: hidden;
  position: relative; 
  line-height: 1.2em;
  max-height: 3.6em;
  text-align: justify;  
  margin-right: -1em;
  padding-right: 1em;
}
.block-with-text+.block-with-text{
  margin-top:10px;
}
.block-with-text:before {
  content: '...';
  position: absolute;
  right: 0;
  bottom: 0;
}
.block-with-text:after {
  content: '';
  position: absolute;
  right: 0;
  width: 1em;
  height: 1em;
  margin-top: 0.2em;
  background: white;
}
<div class="container">


<div class="block-with-text">
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a
</div>

<div class="block-with-text">
Lorem Ipsum is simply dummy text of the printing and typesetting industry
</div>


<div class="block-with-text">
Lorem Ipsum is simply
</div>

</div>


Oldukça iyi bir çözüm, sadece ikinci satır kesilmek için çok kısa olsa bile metinleri kesiyor, ama yine de başparmak yukarı
Amin


4

Geçerli CSS sürümünde bulunmayan standart olmayan bir CSS'dir (Firefox desteklemez). Bunun yerine JavaScript'i kullanmayı deneyin.


4

Üç köşeli metnin üç nokta ile kesilmesi için saf css yolu

Metin kabının yüksekliğini ayarlayın, -webkit-line-clamp ile kırmak için satırı kontrol edin: 2;

.block-ellipsis {
  display: block;
  display: -webkit-box;
  max-width: 100%;
  height: 30px;
  margin: 0 auto;
  font-size: 14px;
  line-height: 1;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  text-overflow: ellipsis;
}

3

Daha önce bu konuyla tanıştım ve saf bir css çözümü yok

Bu yüzden (diğerlerinin yanı sıra) bu konuyu ele almak için küçük bir kütüphane geliştirdim. Kütüphane, harf düzeyinde metin oluşturmayı modellemek ve gerçekleştirmek için nesneler sağlar. Örneğin bir metin taşmasını taklit edebilirsiniz: rastgele bir sınır ile üç nokta (bir satır gerekli değildir)

Ekran görüntüsü, eğitim ve yükleme bağlantısı için http://www.samuelrossille.com/home/jstext.html adresinden daha fazla bilgi edinin .


3

Birisi flexbox'ta çalışmak için hat kelepçesi almaya çalışıyorsa , özellikle biraz uzun kelimelerle işkence testi yaptıktan sonra biraz daha zorlayıcıdır. Bu kod snippet'indeki tek gerçek fark, min-width: 0;kesilmiş metin içeren flex öğesinde ve word-wrap: break-word;. Analiz için https://css-tricks.com/flexbox-truncated-text/ adresine bir şapka ipucu . Yasal Uyarı: Bu hala bildiğim kadarıyla webkit.

.flex-parent {
  display: flex;
}

.short-and-fixed {
  width: 30px;
  height: 30px;
  background: lightgreen;
}

.long-and-truncated {
  margin: 0 20px;
  flex: 1;
  min-width: 0;/* Important for long words! */
}

.long-and-truncated span {
  display: inline;
  -webkit-line-clamp: 3;
  text-overflow: ellipsis;
  overflow: hidden;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  word-wrap: break-word;/* Important for long words! */
}
<div class="flex-parent">
  <div class="flex-child short-and-fixed">
  </div>
  <div class="flex-child long-and-truncated">
    <span>asdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasd</span>
  </div>
  <div class="flex-child short-and-fixed">
  </div>
</div>

http://codepen.io/AlgeoMA/pen/JNvJdx (kodlama sürümü)


1

Buradaki tüm cevaplar yanlış, önemli bir parçayı, yüksekliği kaçırıyorlar

.container{
    width:200px;
    height:600px;
    background:red
}
.title {
        overflow: hidden;
        line-height: 20px;
        height: 40px;
        text-overflow: ellipsis;
        display: -webkit-box;
        -webkit-line-clamp: 2;
        -webkit-box-orient: vertical;
    }
<div class="container">
    <div class="title">this is a long text you cant cut it in half</div>
</div>

0

webkit üzerinde çalışan -webkit-line-clamp üzerinde saf bir css yöntemi tabanı:

@-webkit-keyframes ellipsis {/*for test*/
    0% { width: 622px }
    50% { width: 311px }
    100% { width: 622px }
}
.ellipsis {
    max-height: 40px;/* h*n */
    overflow: hidden;
    background: #eee;

    -webkit-animation: ellipsis ease 5s infinite;/*for test*/
    /**
    overflow: visible;
    /**/
}
.ellipsis .content {
    position: relative;
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-box-pack: center;
    font-size: 50px;/* w */
    line-height: 20px;/* line-height h */
    color: transparent;
    -webkit-line-clamp: 2;/* max row number n */
    vertical-align: top;
}
.ellipsis .text {
    display: inline;
    vertical-align: top;
    font-size: 14px;
    color: #000;
}
.ellipsis .overlay {
    position: absolute;
    top: 0;
    left: 50%;
    width: 100%;
    height: 100%;
    overflow: hidden;

    /**
    overflow: visible;
    left: 0;
    background: rgba(0,0,0,.5);
    /**/
}
.ellipsis .overlay:before {
    content: "";
    display: block;
    float: left;
    width: 50%;
    height: 100%;

    /**
    background: lightgreen;
    /**/
}
.ellipsis .placeholder {
    float: left;
    width: 50%;
    height: 40px;/* h*n */

    /**
    background: lightblue;
    /**/
}
.ellipsis .more {
    position: relative;
    top: -20px;/* -h */
    left: -50px;/* -w */
    float: left;
    color: #000;
    width: 50px;/* width of the .more w */
    height: 20px;/* h */
    font-size: 14px;

    /**
    top: 0;
    left: 0;
    background: orange;
    /**/
}
<div class='ellipsis'>
    <div class='content'>
        <div class='text'>text text text text text text text text text text text text text text text text text text text text text </div>
        <div class='overlay'>
            <div class='placeholder'></div>
            <div class='more'>...more</div>
        </div>
    </div>
</div>


-1

Bunu yapmanın gerçek kolay bir yolu yok. Clamp.js kütüphanesini kullanın .

$clamp(myHeader, {clamp: 3});

-6

Bir çözüm buldum, ancak metin alanınıza sığacak kaba bir karakter uzunluğunu bilmeniz, ardından önceki boşluğa ... eklemeniz gerekiyor.

Bunu yaptığım yol:

  1. kaba bir karakter uzunluğu varsayalım (bu örnekte 200) ve metninizle birlikte bir fonksiyona geçebilirsiniz
  2. boşlukları bölün, böylece uzun bir dizeniz olsun
  3. jQuery kullanarak karakter uzunluğundan sonraki ilk "" alanı dilimleyin
  4. kalanlara katıl ...

kod:

truncate = function(description){
        return description.split('').slice(0, description.lastIndexOf(" ",200)).join('') + "...";           
}

işte bir keman - http://jsfiddle.net/GYsW6/1/

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.