Saya membuat gambar untuk pertanyaan ini agar lebih mudah dipahami.
Apakah mungkin membuat elipsis <div>
dengan lebar tetap dan beberapa garis?
Saya sudah mencoba beberapa plugin jQuery di sana-sini, tetapi tidak dapat menemukan yang saya cari. Ada rekomendasi? Ide ide?
javascript
jquery
html
css
Edward
sumber
sumber
Jawaban:
Hanya ide dasar yang cepat.
Saya sedang menguji dengan markup berikut:
Dan CSS:
Menerapkan jQuery ini akan mencapai hasil yang diinginkan:
Berulang kali mencoba menghapus kata terakhir dari teks hingga mencapai ukuran yang diinginkan. Karena overflow: tersembunyi; prosesnya tetap tidak terlihat dan bahkan dengan JS dimatikan hasilnya tetap 'benar secara visual' (tanpa "..." tentu saja).
Jika Anda menggabungkan ini dengan pemotongan yang masuk akal pada sisi-server (yang hanya menyisakan sedikit overhead) maka akan berjalan lebih cepat :).
Sekali lagi, ini bukan solusi lengkap, hanya sebuah ide.
UPDATE: Menambahkan Demo jsFiddle .
sumber
li
dan di dalamnya masing-masing ada.block
dan.block h2
dan saya perlu menerapkan ini keh2
dalam.block
tetapi saya tidak bisa membuatnya bekerja. Apakah ada perbedaan jika ada lebih dari satu.block h2
?height*3
dengan beberapa piksel. Perbaikan yang mudah adalah dengan hanya menambahkan beberapa piksel kedivh
while
baris:if(!$p.text().match(/\W*\s(\S)*$/)) break;
while ((upper-lower)>1) {let middle=((lower+upper)/2)|0 /*|0 is quick floor*/; if (test(words.slice(0,middle)+'...')) {lower=middle;} else {upper=middle;}}
. Seperti yang ditemukan oleh @KrisWebDev, Anda juga ingin memeriksa satu kata raksasa.Coba plugin jQuery.dotdotdot .
sumber
Perpustakaan Javascript untuk "line clamping"
Perhatikan bahwa "penjepitan garis" juga disebut sebagai "Ellipsis pada blok multi-garis" atau "elipsis vertikal".
github.com/BeSite/jQuery.dotdotdot
github.com/josephschmitt/Clamp.js
Berikut adalah beberapa lagi yang belum saya selidiki:
Solusi CSS untuk penjepitan garis
Ada beberapa solusi CSS, tetapi penggunaan paling sederhana
-webkit-line-clamp
yang memiliki dukungan browser yang buruk . Lihat demo langsung di jsfiddle.net/AdrienBe/jthu55v7/Banyak orang berusaha keras untuk mewujudkan hal ini menggunakan CSS saja. Lihat artikel dan pertanyaan tentang itu:
Apa yang saya rekomendasikan
Tetap sederhana. Kecuali Anda memiliki banyak waktu untuk mendedikasikan fitur ini, gunakan solusi yang paling sederhana & teruji: CSS sederhana atau perpustakaan javascript yang teruji dengan baik.
Pergi untuk sesuatu yang mewah / kompleks / sangat disesuaikan & Anda akan membayar harga untuk ini di jalan.
Apa yang orang lain lakukan
Memudar seperti Airbnb mungkin merupakan solusi yang bagus. Mungkin itu adalah CSS dasar ditambah dengan jQuery dasar. Sebenarnya, sepertinya sangat mirip dengan solusi ini di CSSTricks
Oh, dan jika Anda mencari inspirasi desain:
sumber
Tidak ada fitur seperti itu di HTML, dan ini sangat menyebalkan.
Saya telah mengembangkan perpustakaan untuk menangani hal ini.
Lihat situs saya untuk tangkapan layar, tutorial, dan tautan dowload.
sumber
Solusi JS murni berdasarkan solusi bažmegakapa, dan beberapa pembersihan untuk memperhitungkan orang-orang yang mencoba memberikan tinggi / maks-tinggi yang kurang dari garis elemenTinggi:
sumber
Saya punya solusi yang berfungsi dengan baik tetapi elipsis ia menggunakan gradien. Keuntungannya adalah Anda tidak perlu melakukan perhitungan JavaScript apa pun dan berfungsi untuk wadah lebar variabel termasuk sel tabel. Ini menggunakan beberapa div tambahan, tetapi sangat mudah diimplementasikan.
http://salzerdesign.com/blog/?p=453
Sunting: Maaf, saya tidak tahu bahwa tautannya tidak cukup. Solusinya adalah dengan meletakkan div di sekitar teks, dan gaya div untuk mengendalikan overflow. Di dalam div, letakkan div lain dengan gradien "fade" yang dapat dibuat dengan menggunakan CSS atau gambar (untuk IE lama). Gradien berubah dari transparan ke warna latar belakang sel tabel dan sedikit lebih lebar dari elipsis. Jika teksnya panjang dan meluap, ia berada di bawah "fade" div dan terlihat "faded out". Jika teks pendek, fade tidak terlihat sehingga tidak ada masalah. Dua kontainer dapat disesuaikan untuk membiarkan satu atau beberapa baris ditampilkan dengan mengatur ketinggian wadah sebagai kelipatan dari tinggi baris teks. Div "fade" hanya dapat diposisikan untuk menutupi baris terakhir.
sumber
Berikut ini adalah cara CSS murni untuk mencapai ini: http://www.mobify.com/blog/multiline-ellipsis-in-pure-css/
Berikut ini ringkasannya:
sumber
Anda dapat menggunakan
-webkit-line-clamp
properti dengandiv
.-webkit-line-clamp: <integer>
yang berarti mengatur jumlah maksimum baris sebelum memotong konten dan kemudian menampilkan elipsis(…)
di akhir baris terakhir.sumber
Inilah solusi JavaScript vanilla yang dapat Anda gunakan dalam keadaan darurat:
Anda dapat bermain-main dengannya di codepen di bawah ini. Coba ubah ukuran font di panel CSS dan lakukan sedikit pengeditan di panel HTML (mis., Tambahkan ruang tambahan di suatu tempat) untuk memperbarui hasilnya. Terlepas dari ukuran font, paragraf tengah harus selalu dipotong ke jumlah baris pada parameter kedua yang diteruskan ke limitLines ().
Codepen: http://codepen.io/thdoan/pen/BoXbEK
sumber
EDIT: Datang di Shave yang merupakan plugin JS yang melakukan pemotongan teks multi baris berdasarkan max-height yang diberikan dengan sangat baik. Ini menggunakan pencarian biner untuk menemukan titik istirahat optimal. Pasti layak diselidiki.
JAWABAN ASLI:
Saya harus datang dengan solusi vanilla JS untuk masalah ini. Dalam hal saya telah mengerjakan, saya harus memasukkan nama produk yang panjang menjadi lebar terbatas dan lebih dari dua baris; terpotong oleh elipsis jika diperlukan.
Saya menggunakan jawaban dari berbagai posting SO untuk memasak sesuatu yang sesuai dengan kebutuhan saya. Strateginya adalah sebagai berikut:
Contoh kode:
PS:
PPS: Baru menyadari ini sangat mirip dengan pendekatan seperti yang disarankan oleh @DanMan dan @ st.never. Lihat cuplikan kode untuk contoh implementasi.
sumber
Solusi javascript yang sangat sederhana. Div harus ditata:
Dan JS:
sumber
Bukan jawaban yang tepat untuk pertanyaan itu, tetapi saya menemukan halaman ini ketika mencoba melakukan hal yang sangat mirip, tetapi ingin menambahkan tautan ke "view more" daripada hanya ellipsis yang langsung. Ini adalah fungsi jQuery yang akan menambahkan tautan "lebih" ke teks yang meluap wadah. Secara pribadi saya menggunakan ini dengan Bootstrap, tetapi tentu saja itu akan berhasil tanpa.
Untuk menggunakan, letakkan teks Anda dalam wadah sebagai berikut:
Ketika fungsi jQuery berikut ditambahkan, salah satu div yang lebih besar dari nilai penyetelan akan dipotong dan memiliki tautan "Lainnya" ditambahkan.
Berdasarkan ini, tetapi diperbarui: http://shakenandstirredweb.com/240/jquery-moreless-text
sumber
Plugin dotdotdot jQuery yang disebutkan berfungsi dengan baik dengan sudut:
Markup yang sesuai adalah:
sumber
Demo JS murni (tanpa jQuery dan loop 'sementara')
Ketika saya mencari solusi dari masalah ellipsis multiline, saya terkejut bahwa tidak ada yang bagus tanpa jQuery. Juga ada beberapa solusi berdasarkan loop 'while', tapi saya pikir mereka tidak efektif dan berbahaya karena kemungkinan untuk masuk ke loop infinite. Jadi saya menulis kode ini:
sumber
Mungkin agak terlambat tetapi menggunakan SCSS Anda dapat mendeklarasikan fungsi seperti:
Dan gunakan seperti:
Yang akan memotong teks menjadi satu baris dan mengetahui bahwa itu adalah 1.4 tinggi barisnya. Output yang diharapkan adalah chrome untuk di-render dengan
...
di akhir dan FF dengan beberapa fade keren di akhirFirefox
Chrome
sumber
Temukan solusi singkat khusus CSS ini di jawaban Adrien Be :
Per Maret 2020, dukungan browser adalah 95,3% , tidak didukung di IE dan Opera Mini. Bekerja di Chrome, Safari, Firefox dan Edge.
sumber
Anda mungkin tidak dapat melakukannya (saat ini?) Tanpa font dengan lebar tetap seperti Courier. Dengan font dengan lebar tetap, setiap huruf menempati ruang horizontal yang sama, sehingga Anda mungkin dapat menghitung huruf dan mengalikan hasilnya dengan ukuran font saat ini di ems atau exs. Maka Anda hanya perlu menguji berapa banyak huruf yang pas pada satu baris, dan kemudian memecahnya.
Atau, untuk font yang tidak diperbaiki Anda mungkin dapat membuat pemetaan untuk semua karakter yang mungkin (seperti i = 2px, m = 5px) dan kemudian melakukan perhitungan. Banyak pekerjaan buruk sekalipun.
sumber
Untuk memperluas pada solusi @ DanMan: dalam kasus di mana font-lebar variabel digunakan, Anda bisa menggunakan lebar font rata-rata. Ini memiliki dua masalah: 1) teks dengan terlalu banyak W akan meluap dan 2) teks dengan terlalu banyak I akan terpotong lebih awal.
Atau Anda bisa mengambil pendekatan kasus terburuk dan menggunakan lebar huruf "W" (yang saya percaya adalah yang terluas). Ini menghilangkan masalah 1 di atas tetapi mengintensifkan masalah 2.
Pendekatan yang berbeda bisa berupa: tinggalkan
overflow: clip
di div dan tambahkan bagian elipsis (mungkin div lain atau gambar) denganfloat: right; position: relative; bottom: 0px;
(belum diuji). Caranya adalah membuat gambar muncul di atas akhir teks.Anda juga bisa hanya menampilkan gambar ketika Anda tahu itu akan meluap (katakanlah, setelah sekitar 100 karakter)
sumber
overflow: clip
? Dan apa yang Anda harapkan dari CSSfloat
itu?Dengan kode ini tidak perlu div pembungkus tambahan jika elemen memiliki tinggi dibatasi oleh gaya max-height.
Juga menyimpan teks asli dalam atribut data yang dapat ditampilkan hanya menggunakan gaya, misalnya. di mouse:
sumber
Dalam skenario saya, saya tidak dapat mengerjakan salah satu fungsi yang disebutkan di atas dan saya juga perlu memberi tahu fungsi berapa banyak baris yang harus ditampilkan terlepas dari ukuran font atau ukuran wadah.
Saya mendasarkan solusi saya pada penggunaan metode Canvas.measureText (yang merupakan fitur HTML5 ) seperti yang dijelaskan di sini oleh Domi , sehingga tidak sepenuhnya cross-browser.
Anda dapat melihat cara kerjanya pada biola ini .
Ini kodenya:
Dan HTML untuk menggunakannya adalah seperti ini:
Kode untuk mendapatkan font-family agak sederhana, dan dalam kasus saya berfungsi, tetapi untuk skenario yang lebih kompleks, Anda mungkin perlu menggunakan sesuatu di sepanjang baris ini .
Juga, dalam kasus saya, saya memberi tahu fungsi berapa banyak baris yang akan digunakan, tetapi Anda dapat menghitung berapa banyak baris untuk ditampilkan sesuai dengan ukuran dan font wadah.
sumber
Saya telah membuat versi yang membiarkan html tetap utuh. contoh jsfiddle
jQuery
CSS
contoh jsfiddle
sumber
Saya menulis komponen sudut yang memecahkan masalah. Ini membagi teks yang diberikan menjadi elemen span. Setelah rendering, ia menghilangkan semua elemen yang meluap dan menempatkan elips tepat setelah elemen yang terlihat terakhir.
Contoh penggunaan:
Demo Stackblitz: https://stackblitz.com/edit/angular-wfdqtd
Komponen:
sumber
Di sini saya membuat perpustakaan lain dengan algoritma yang lebih cepat. Silakan periksa:
https://github.com/i-ahmed-biz/fast-ellipsis
Untuk menginstal menggunakan bower:
Untuk menginstal menggunakan npm:
Semoga kamu menikmati!
sumber
tidak yakin apakah ini yang Anda cari, ia menggunakan ketinggian minimum, bukan ketinggian.
sumber
Func sangat sederhana akan dilakukan.
Pengarahan:
Melihat:
sumber
iiiiiiiiii
vsMMMMMMMMMM
(dengan font saat ini tidak terlalu terlihat: D).