css ellipsis di baris kedua

208

CSS text-overflow: ellipsisdi baris kedua, apakah ini mungkin? Saya tidak dapat menemukannya di internet.

contoh:

yang saya inginkan adalah seperti ini:

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

tetapi yang terjadi adalah ini:

I hope someone could help me. I ... 
Reigel
sumber
3
AFAIK elipsis akan muncul dan memotong teks di ujung lebar elemen. Itu tidak akan mengalir ke baris berikutnya. Solusi terbaik di sini adalah dengan mengimplementasikan beberapa script sisi server atau klien yang secara otomatis memotong teks ke sejumlah karakter dan kemudian menambahkan elipsis. Tebakan saya adalah skrip sisi klien akan lebih baik, yang akan memungkinkan Anda untuk tetap memiliki semua teks asli yang tersedia jika Anda membutuhkannya.
FarligOpptreden
di sini adalah pertanyaan serupa: stackoverflow.com/questions/3922739/…
Evgeny
tl; dr: hanya mungkin di webkit
Evgeny
Yang paling dekat dengan saya untuk mencapai ini adalah menambahkan elemen pseudo 'setelah' untuk ellipsis, dan posisikan sebaris, langsung setelah elemen yang berisi teks. Tetapi elipsis lenyap jika elemen teks terlalu panjang, jadi Anda harus memotong teksnya entah bagaimana, agar dapat diandalkan.
Jonathan

Jawaban:

105

Persyaratan untuk text-overflow: ellipsis;bekerja adalah versi satu baris white-space( pre, nowrapdll). Yang berarti teks tidak akan pernah mencapai baris kedua.

Jadi. Tidak mungkin dalam CSS murni.

Sumber saya ketika saya sedang mencari hal yang sama persis sekarang: http://www.quirksmode.org/css/textoverflow.html (Quirksmode ftw!)

EDIT Jika dewa CSS yang baik akan mengimplementasikan http://www.w3.org/TR/css-overflow-3/#max-lines kita dapat memperbaharuinya dalam CSS murni menggunakan fragments(baru) dan max-lines(baru). Juga beberapa info lebih lanjut tentang http://css-tricks.com/line-clampin/

EDIT 2 WebKit / Blink memiliki line-clamp: -webkit-line-clamp: 2akan menempatkan ellipsis di baris ke-2.

Rudie
sumber
9
Mengawasi, tetapi sejauh ini tampaknya para dewa belum bersama kita: caniuse.com/#search=max-lines
Daniel
1
Bagaimana cara mencapai fitur di atas dengan saas? @Rudie
Bhoomi Bhalani
144

Ini seharusnya berfungsi di browser webkit :

overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
Skeep
sumber
1
Perhatikan bahwa, pada komentar ini, -webkit-line-clamp tidak menghormati visibilitas: disembunyikan. bugs.webkit.org/show_bug.cgi?id=45399
Kevin
1
Hei - sepertinya bagus tapi tidak berhasil untukku. Ini hanya menempatkan '...' pada garis-penjepit yang diberikan tetapi tidak memotong sisa teks (bahkan dengan attr white-space)
lemoid
3
Anda mungkin perlu menambahkan overflow: hiddenagar ini berfungsi.
Robert
Ini tidak akan berfungsi di Firefox, webkit tidak didukung di mesin tokek
ZetaPR
Ini harus menjadi jawaban yang diterima. Anda tidak ingin ada bantalan di bagian bawah elemen tempat Anda menerapkan ini, karena Anda bisa mendapatkan sisa dari teks mengintip.
Tr1stan
34

Seperti yang sudah dijawab orang lain, solusi CSS murni tidak ada. Ada plugin jQuery yang sangat mudah digunakan, disebut dotdotdot . Ia menggunakan lebar dan tinggi wadah untuk menghitung jika perlu memotong dan menambahkan elipsis.

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

Ini jsFiddle .

Giohji
sumber
Plugin ini juga menyediakan banyak utilitas lain seperti menambahkan tautan "baca lebih lanjut", juga dapat menguraikan URI dan markup HTML. Bagus temukan!
Martin Andersson
2
Saya mencoba jQuery dotdotdot 1.7.3 untuk toko e-niaga, untuk membatasi nama produk pada halaman kategori kisi menjadi dua baris. Setelah pengujian menyeluruh, kami memutuskan untuk tidak menggunakan plugin ini karena terkadang, setelah shift-refresh, tata letak halaman kategori akan rusak. YMMV. Pada akhirnya kami pergi dengan solusi JS vanilla yang sangat sederhana: jika clientHeight elemen nama produk kurang dari scrollHeight, potong teks pada batas yang telah ditentukan dan tambahkan "...". Kadang-kadang beberapa nama produk bisa sedikit terlalu pendek karena batas yang telah ditentukan, tetapi itu sangat stabil.
thdoan
1
Easty menerapkan dan bekerja dengan indah. Terima kasih!
Rachel S
Meskipun bekerja dengan baik, sayangnya itu mengalami masalah kinerja. Jika proyek Anda memerlukan beberapa penggunaan elips, pertimbangkan opsi lain. Selain itu, inilah kutipan dari repositori: "Karena kinerjanya tidak dapat ditingkatkan, plugin ini tidak lagi dipelihara secara aktif.".
boyomarinov
1
juga, itu tidak akan berfungsi jika teks berubah secara dinamis setelah memuat :(
Dejell
34

Saya menemukan bahwa jawaban Skeep tidak cukup dan membutuhkan overflowgaya juga:

overflow: hidden;
text-overflow: ellipsis;
-webkit-line-clamp: 2;
display: -webkit-box;
-webkit-box-orient: vertical;
Simon H
sumber
18

jika seseorang menggunakan SASS / SCSS dan menemukan pertanyaan ini - mungkin mixin ini bisa membantu:

@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');
}

ini hanya menambahkan ellipsis di browser webkit. sisanya hanya memotongnya saja.

pkyeck
sumber
1
Menggunakan KURANG, saya harus mengubah /* autoprefixer: off */ke yang /*! autoprefixer: off */lain -webkit-box-orient: vertical;dihapus setelah kompilasi yang berarti ellipsis tidak pernah menunjukkan
Nathan
18

Cukup gunakan garis-penjepit untuk browser yang mendukungnya (sebagian besar browser modern) dan kembali ke 1 baris untuk yang lebih lama.

  .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;
    }
  }
Nicholas
sumber
1
ruang putih: awal; menyelamatkan saya
James
10

Sayang sekali Anda tidak bisa membuatnya bekerja lebih dari dua baris! Akan luar biasa jika elemennya adalah tampilan blok dan memiliki ketinggian diatur ke 2em atau sesuatu, dan ketika teks meluap akan menampilkan ellipsis!

Untuk satu liner, Anda dapat menggunakan:

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

Untuk beberapa baris mungkin Anda bisa menggunakan Polyfill seperti jQuery autoellipsis yang ada di github http://pvdspek.github.com/jquery.autoellipsis/

superlogikal
sumber
Plugin itu terlalu berat untuk apa yang dilakukannya. Umurnya 5 tahun. Alih-alih menggunakan dotdotdotdisebutkan dalam posting lain.
adi518
10

Saya bukan pro JS, tapi saya menemukan beberapa cara Anda bisa melakukan ini.

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>

Kemudian dengan jQuery Anda memotongnya ke jumlah karakter tertentu tetapi meninggalkan kata terakhir seperti ini:

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

Hasilnya terlihat seperti ini:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi
Elementum sebagai konsekuensi dari tortor et…

Atau, Anda bisa memotongnya ke jumlah karakter tertentu seperti ini:

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

Hasilnya terlihat seperti ini:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi
elementum yang diakibatkan tortor et euismod ...

Semoga itu bisa membantu sedikit.

Ini jsFiddle .

Ross Howard-Jones
sumber
7

di sini adalah contoh yang baik di css murni.

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

Mirodil
sumber
Solusi yang cukup bagus, hanya memotong teks bahkan jika baris kedua terlalu pendek untuk dipotong, tapi tetap saja, acungan jempol
Amin
6

Saya telah menggunakan plugin jQuery-condense-plugin sebelumnya, yang sepertinya dapat melakukan apa yang Anda inginkan. Jika tidak, ada beberapa plugin yang mungkin sesuai dengan kebutuhan Anda.

Sunting: Membuat Anda demo - perhatikan bahwa saya menautkan jquery.condense.js pada demo yang melakukan keajaiban, kredit penuh untuk pembuat plugin itu :)

andyb
sumber
4

Ini adalah CSS non-standar, yang tidak tercakup dalam versi CSS saat ini (Firefox tidak mendukungnya). Coba gunakan JavaScript sebagai gantinya.

Raptor
sumber
4

Cara css murni memangkas teks multiline dengan ellipsis

Sesuaikan hight kontener teks, baris kontrol untuk dipecah oleh -webkit-line-clamp: 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;
}
Anil
sumber
3

Saya telah bertemu masalah ini sebelumnya, dan tidak ada solusi css murni

Itu sebabnya saya telah mengembangkan perpustakaan kecil untuk menangani masalah ini (antara lain). Perpustakaan menyediakan objek untuk memodelkan dan melakukan rendering teks tingkat huruf. Misalnya Anda dapat meniru teks-overflow: ellipsis dengan batas arbitrer (tidak perlu satu baris)

Baca lebih lanjut di http://www.samuelrossille.com/home/jstext.html untuk tangkapan layar, tutorial, dan tautan dowload.

Samuel Rossille
sumber
3

Jika ada yang mencoba membuat garis-penjepit bekerja di flexbox , itu sedikit rumit - terutama sekali Anda melakukan tes penyiksaan dengan kata-kata yang sangat panjang. Satu-satunya perbedaan nyata dalam cuplikan kode ini adalah min-width: 0;pada item fleksibel yang berisi teks terpotong, dan word-wrap: break-word;. Hat-tip untuk https://css-tricks.com/flexbox-truncated-text/ untuk wawasan. Penafian: ini masih webkit sejauh yang saya tahu.

.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 (versi codepen)

AlexMA
sumber
1

Semua jawaban di sini salah, mereka kehilangan bagian penting, tingginya

.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>
kiwi yang marah
sumber
0

metode css murni berdasarkan -webkit-line-clamp, yang bekerja di webkit:

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

Pakaian
sumber
-1

Tidak ada cara mudah nyata untuk melakukan ini. Gunakan perpustakaan Clamp.js .

$clamp(myHeader, {clamp: 3});
S.Galarneau
sumber
-6

Saya menemukan solusi namun Anda perlu mengetahui panjang karakter kasar yang cocok dengan area teks Anda, kemudian bergabung dengan ... ke ruang sebelumnya.

Cara saya melakukan ini adalah:

  1. anggap panjang karakter kasar (dalam hal ini 200) dan beralih ke fungsi bersama teks Anda
  2. pisahkan spasi sehingga Anda memiliki satu string panjang
  3. gunakan jQuery untuk mendapatkan irisan "" spasi pertama setelah panjang karakter Anda
  4. bergabung dengan yang tersisa ...

kode:

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

di sini adalah biola - http://jsfiddle.net/GYsW6/1/

Paul
sumber