Masukkan ellipsis (...) ke tag HTML jika isinya terlalu lebar

148

Saya memiliki halaman web dengan tata letak elastis yang mengubah lebarnya jika jendela browser diubah ukurannya.

Dalam tata letak ini ada tajuk ( h2) yang akan memiliki panjang variabel (sebenarnya menjadi tajuk utama dari blogpost yang saya tidak punya kendali atas). Saat ini - jika mereka lebih lebar dari jendela - mereka dipecah menjadi dua baris.

Apakah ada solusi (lintas-peramban) yang elegan dan teruji - misalnya dengan jQuery - yang memperpendek innerHTML tag judul itu dan menambahkan "..." jika teks akan terlalu lebar untuk masuk ke dalam satu baris pada layar saat ini / lebar kontainer?

BlaM
sumber
1
2014 diperbarui jawaban: stackoverflow.com/a/22811590/759452
Adrien Be
Saya telah membuat plugin berdasarkan utas ini yang menggunakan properti CSS white-space dan word-wrap untuk memformat teks. github.com/nothrem/jQuerySmartEllipsis
Radek Pech

Jawaban:

119

Saya punya solusi untuk FF3, Safari dan IE6 + dengan teks tunggal dan multiline

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

.ellipsis.multiline {
    white-space: normal;
}

<div class="ellipsis" style="width: 100px; border: 1px solid black;">Lorem ipsum dolor sit amet, consectetur adipisicing elit</div>
<div class="ellipsis multiline" style="width: 100px; height: 40px; border: 1px solid black; margin-bottom: 100px">Lorem ipsum dolor sit amet, consectetur adipisicing elit</div>

<script type="text/javascript" src="/js/jquery.ellipsis.js"></script>
<script type="text/javascript">
$(".ellipsis").ellipsis();
</script>

jquery.ellipsis.js

(function($) {
    $.fn.ellipsis = function()
    {
        return this.each(function()
        {
            var el = $(this);

            if(el.css("overflow") == "hidden")
            {
                var text = el.html();
                var multiline = el.hasClass('multiline');
                var t = $(this.cloneNode(true))
                    .hide()
                    .css('position', 'absolute')
                    .css('overflow', 'visible')
                    .width(multiline ? el.width() : 'auto')
                    .height(multiline ? 'auto' : el.height())
                    ;

                el.after(t);

                function height() { return t.height() > el.height(); };
                function width() { return t.width() > el.width(); };

                var func = multiline ? height : width;

                while (text.length > 0 && func())
                {
                    text = text.substr(0, text.length - 1);
                    t.html(text + "...");
                }

                el.html(t.html());
                t.remove();
            }
        });
    };
})(jQuery);
alex
sumber
22
Bagus, saya sudah mencari cara menangani overflow dengan beberapa baris. Satu peningkatan: alih-alih menambahkan tiga periode, tambahkan karakter elipsis, '…'.
Simon Lieschke
4
Ini bekerja dengan sangat baik. Anda harus menerbitkan ini di situs jQuery.
Edgar
1
Meskipun di IE jika fungsi ellipsis diterapkan pada div yang hanya memiliki tautan, setelah ellipsis tautannya menghilang. Adakah petunjuk tentang ini?
Chantz
6
Jika Anda ingin melihat ini dalam tindakan, Anda dapat melihatnya di sini (maaf untuk pemformatan yang keliru
Dan Esparza
22
Untuk meningkatkan kinerja, lakukan pencarian biner alih-alih menghapus 1 karakter sekaligus dalam loop "while". Jika 100% teks tidak cocok, coba 50% dari teks; kemudian 75% dari teks jika 50% cocok, atau 25% jika 50% tidak cocok, dll.
StanleyH
182

Solusi khusus CSS berikut untuk memotong teks pada satu baris berfungsi dengan semua browser yang terdaftar di http://www.caniuse.com pada saat penulisan dengan pengecualian Firefox 6.0. Perhatikan bahwa JavaScript sama sekali tidak perlu kecuali Anda perlu mendukung pembungkus teks multiline atau versi Firefox yang lebih lama.

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

Jika Anda memerlukan dukungan untuk versi Firefox yang lebih lama, periksa jawaban saya untuk pertanyaan lain ini .

Simon Lieschke
sumber
2
Ini adalah urutan besarnya lebih cepat daripada pendekatan jQuery. Berfungsi dengan baik di IE7 + dan Chrome.
JDB masih mengingat Monica
3
Ini juga berfungsi dengan baik pada browser kuno. Kami berhasil menggunakannya di Google pada ~ 2004, di mana kami diminta untuk mendukung atau menurunkan anggun di beberapa peramban yang benar-benar sudut.
ElBel
2
JS Fiddle untuk mereka yang ingin mengambil sampelnya di browser - jsfiddle.net/r39Ad
Deepak Bala
@DilipRajkumar Anda harus memberikan detail lebih lanjut misalnya contoh JSFiddle menunjukkan itu tidak berfungsi di IE 8.
Simon Lieschke
1
@SharpCoder tidak. Di mana teks terpotong ditentukan oleh lebar elemen yang mengandungnya, yaitu memotong ketika akan melimpah lebar elemen.
Simon Lieschke
40

Saya membuat kode ini menggunakan sejumlah posting lain, dengan perangkat tambahan berikut:

  1. Ini menggunakan pencarian biner untuk menemukan panjang teks yang tepat.
  2. Ini menangani kasus-kasus di mana elemen ellipsis (s) awalnya disembunyikan dengan menyiapkan acara pertunjukan satu-shot yang menjalankan kembali kode ellipsis ketika item pertama kali ditampilkan. Ini berguna untuk tampilan detail master atau tampilan hierarki di mana beberapa item awalnya tidak ditampilkan.
  3. Secara opsional menambahkan atribut judul dengan teks asli untuk efek hoverover.
  4. Ditambahkan display: blockke gaya, sehingga bentang bekerja
  5. Ia menggunakan karakter ellipsis bukannya 3 periode.
  6. Ini menjalankan script secara otomatis untuk apa pun dengan kelas .ellipsis

CSS:

.ellipsis {
        white-space: nowrap;
        overflow: hidden;
        display: block;
}

.ellipsis.multiline {
        white-space: normal;
}

jquery.ellipsis.js

(function ($) {

    // this is a binary search that operates via a function
    // func should return < 0 if it should search smaller values
    // func should return > 0 if it should search larger values
    // func should return = 0 if the exact value is found
    // Note: this function handles multiple matches and will return the last match
    // this returns -1 if no match is found
    function binarySearch(length, func) {
        var low = 0;
        var high = length - 1;
        var best = -1;
        var mid;

        while (low <= high) {
            mid = ~ ~((low + high) / 2); //~~ is a fast way to convert something to an int
            var result = func(mid);
            if (result < 0) {
                high = mid - 1;
            } else if (result > 0) {
                low = mid + 1;
            } else {
                best = mid;
                low = mid + 1;
            }
        }

        return best;
    }

    // setup handlers for events for show/hide
    $.each(["show", "toggleClass", "addClass", "removeClass"], function () {

        //get the old function, e.g. $.fn.show   or $.fn.hide
        var oldFn = $.fn[this];
        $.fn[this] = function () {

            // get the items that are currently hidden
            var hidden = this.find(":hidden").add(this.filter(":hidden"));

            // run the original function
            var result = oldFn.apply(this, arguments);

            // for all of the hidden elements that are now visible
            hidden.filter(":visible").each(function () {
                // trigger the show msg
                $(this).triggerHandler("show");
            });

            return result;
        };
    });

    // create the ellipsis function
    // when addTooltip = true, add a title attribute with the original text
    $.fn.ellipsis = function (addTooltip) {

        return this.each(function () {
            var el = $(this);

            if (el.is(":visible")) {

                if (el.css("overflow") === "hidden") {
                    var content = el.html();
                    var multiline = el.hasClass('multiline');
                    var tempElement = $(this.cloneNode(true))
                        .hide()
                        .css('position', 'absolute')
                        .css('overflow', 'visible')
                        .width(multiline ? el.width() : 'auto')
                        .height(multiline ? 'auto' : el.height())
                    ;

                    el.after(tempElement);

                    var tooTallFunc = function () {
                        return tempElement.height() > el.height();
                    };

                    var tooWideFunc = function () {
                        return tempElement.width() > el.width();
                    };

                    var tooLongFunc = multiline ? tooTallFunc : tooWideFunc;

                    // if the element is too long...
                    if (tooLongFunc()) {

                        var tooltipText = null;
                        // if a tooltip was requested...
                        if (addTooltip) {
                            // trim leading/trailing whitespace
                            // and consolidate internal whitespace to a single space
                            tooltipText = $.trim(el.text()).replace(/\s\s+/g, ' ');
                        }

                        var originalContent = content;

                        var createContentFunc = function (i) {
                            content = originalContent.substr(0, i);
                            tempElement.html(content + "…");
                        };

                        var searchFunc = function (i) {
                            createContentFunc(i);
                            if (tooLongFunc()) {
                                return -1;
                            }
                            return 0;
                        };

                        var len = binarySearch(content.length - 1, searchFunc);

                        createContentFunc(len);

                        el.html(tempElement.html());

                        // add the tooltip if appropriate
                        if (tooltipText !== null) {
                            el.attr('title', tooltipText);
                        }
                    }

                    tempElement.remove();
                }
            }
            else {
                // if this isn't visible, then hook up the show event
                el.one('show', function () {
                    $(this).ellipsis(addTooltip);
                });
            }
        });
    };

    // ellipsification for items with an ellipsis
    $(document).ready(function () {
        $('.ellipsis').ellipsis(true);
    });

} (jQuery));
Adam Tegen
sumber
2
Cantik. Bravo untuk menerapkan saran saya tentang pencarian biner.
StanleyH
2
Hanya catatan singkat ... ada baiknya menambahkan .css ('max-width', 'none') ke v tempElement ... Dengan cara ini Anda dapat menggunakan deklarasi lebar-lebar di css Anda, membuat plugin ini jauh lebih fleksibel (setidaknya untuk sebagian besar kasus penggunaan yang saya miliki). Kerja bagus sih. :)
gordyr
3
Ini adalah implementasi yang jauh lebih cepat daripada jawaban yang diterima di atas. Jika Anda memiliki beberapa elemen .ellipsis, dan melakukan sesuatu yang dinamis dengannya, elemen ini berkinerja lebih baik.
mjvotaw
Bisakah Anda memberikan contoh? Pertanyaan saya ada di sini: stackoverflow.com/questions/26344520/…
SearchForKnowledge
Binary Search lebih disukai tetapi tidak dengan dataset yang sangat kecil dan dalam hal ini menghambat kinerja dibandingkan dengan pencarian linear lurus seperti indexOf () ... tampaknya
user1360809
20

Jawaban saya hanya mendukung teks baris tunggal. Lihat komentar gfullam di bawah ini untuk garpu multi-baris, sepertinya cukup menjanjikan.

Saya menulis ulang kode dari jawaban pertama beberapa kali, dan saya pikir ini harus menjadi yang tercepat.

Pertama-tama ia menemukan panjang teks "Estimasi", dan kemudian menambahkan atau menghapus karakter hingga lebarnya benar.

Logika yang digunakan ditunjukkan di bawah ini:

masukkan deskripsi gambar di sini

Setelah panjang teks "diperkirakan" ditemukan, karakter ditambahkan atau dihapus sampai lebar yang diinginkan tercapai.

Saya yakin ini perlu beberapa penyesuaian, tapi ini kodenya:

(function ($) {
    $.fn.ellipsis = function () {
        return this.each(function () {
            var el = $(this);

            if (el.css("overflow") == "hidden") {
                var text = el.html().trim();
                var t = $(this.cloneNode(true))
                                        .hide()
                                        .css('position', 'absolute')
                                        .css('overflow', 'visible')
                                        .width('auto')
                                        .height(el.height())
                                        ;
                el.after(t);

                function width() { return t.width() > el.width(); };

                if (width()) {

                    var myElipse = "....";

                    t.html(text);

                    var suggestedCharLength = (text.length * el.width() / t.width()) - myElipse.length;

                    t.html(text.substr(0, suggestedCharLength) + myElipse);

                    var x = 1;
                    if (width()) {
                        while (width()) {
                            t.html(text.substr(0, suggestedCharLength - x) + myElipse);
                            x++;
                        }
                    }
                    else {
                        while (!width()) {
                            t.html(text.substr(0, suggestedCharLength + x) + myElipse);
                            x++;
                        }
                        x--;
                        t.html(text.substr(0, suggestedCharLength + x) + myElipse);
                    }

                    el.html(t.html());
                    t.remove();
                }
            }
        });
    };
})(jQuery);
Mikey G
sumber
3
Solusi Anda mungkin bukan yang terbaik, tetapi sudah dijelaskan dengan sangat baik. Dan saya suka jenis logika aproksimasi ini. +1 :)
Flater
2
Saya telah forked ini untuk menambahkan dukungan untuk textareas dan multiline (vertikal) ellipsis truncation: jsfiddle.net/gfullam/j29z7381 (Saya suka logika aproksimasi BTW)
gfullam
19

Untuk berjaga-jaga jika Anda berakhir di sini pada tahun 2013 - ini adalah pendekatan css murni yang saya temukan di sini: http://css-tricks.com/snippets/css/truncate-string-with-ellipsis/

.truncate {
  width: 250px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

Ini bekerja dengan baik.

Joseph Juhnke
sumber
1
FWIW, text-overflowtidak bekerja dengan textareaelemen (per 2015). Jika Anda memerlukan dukungan untuk itu, textareaAnda dapat mencapainya dengan memodifikasi jawaban yang diterima atau dengan menggunakan garpu ini .
gfullam
18

Saya membuat plugin jQuery yang sangat keren untuk menangani semua jenis ellipsis teks yang disebut ThreeDots @ http://tpgblog.com/threedots

Ini jauh lebih fleksibel daripada pendekatan CSS, dan mendukung perilaku dan interaksi yang jauh lebih maju dan dapat disesuaikan.

Nikmati.

Jeremy Horn
sumber
8

Plugin jQuery yang lebih fleksibel memungkinkan Anda untuk menyimpan elemen setelah elipsis (misalnya tombol "baca-lebih") dan perbarui onWindowResize. Ini juga berfungsi di sekitar teks dengan markup:

http://dotdotdot.frebsite.nl

Mat
sumber
Saya baru saja menguji plugin ini, tetapi saya tidak bisa membuatnya berfungsi. Trunk8 adalah pilihan yang lebih baik untuk saya.
Guilherme Garnier
8

trunk8 jQuery plugin mendukung banyak baris, dan dapat menggunakan html apa saja, tidak hanya karakter ellipsis, untuk akhiran pemotongan: https://github.com/rviscomi/trunk8

Demo di sini: http://jrvis.com/trunk8/

Eliot Sykes
sumber
ya tapi ini sudah kuno sekarang. Sepertinya itu tidak didukung?
user2513846
1
Sepertinya didukung secara aktif - pada saat penulisan (Maret 2016), masalah dan PR menunjukkan aktivitas terbaru yang melibatkan pembuat proyek.
Eliot Sykes
5

Sebenarnya ada cara yang cukup mudah untuk melakukan ini dalam CSS mengeksploitasi fakta bahwa IE memperluas ini dengan non-standar dan dukungan FF:after

Anda juga dapat melakukan ini di JS jika Anda ingin dengan memeriksa scrollWidth dari target dan membandingkannya dengan lebar orang tuanya, tetapi jika ini kurang kuat.

Sunting: ini tampaknya lebih berkembang daripada yang saya kira. Dukungan CSS3 mungkin segera ada, dan beberapa ekstensi tidak sempurna tersedia untuk Anda coba.

Yang terakhir adalah bacaan yang baik.

annakata
sumber
Sebenarnya saya lebih suka solusi JS - karena hanya menambahkan "..." jika teks lebih luas dari ruang yang tersedia.
BlaM
3

Saya telah melakukan sesuatu yang serupa untuk klien baru-baru ini. Berikut adalah versi dari apa yang saya lakukan untuk mereka (contoh diuji di semua versi browser terbaru di Win Vista). Tidak sempurna di seluruh papan, tetapi bisa di-tweak cukup mudah.

Demo: http://enobrev.info/ellipsis/

Kode:

<html>
    <head>
        <script src="http://www.google.com/jsapi"></script>
        <script>            
            google.load("jquery", "1.2.6");
            google.setOnLoadCallback(function() {
                $('.longtext').each(function() {
                    if ($(this).attr('scrollWidth') > $(this).width()) {
                        $more = $('<b class="more">&hellip;</b>');

                        // add it to the dom first, so it will have dimensions
                        $(this).append($more);

                        // now set the position
                        $more.css({
                            top: '-' + $(this).height() + 'px',
                            left: ($(this).attr('offsetWidth') - $more.attr('offsetWidth')) + 'px'
                        });
                    }
                });
            });
        </script>

        <style>
            .longtext {
                height: 20px;
                width: 300px;
                overflow: hidden;
                white-space: nowrap;
                border: 1px solid #f00;
            }

            .more {
                z-index: 10;
                position: relative;
                display: block;
                background-color: #fff;
                width: 18px;
                padding: 0 2px;
            }
        </style>
    </head>
    <body>
        <p class="longtext">This is some really long text.  This is some really long text.  This is some really long text.  This is some really long text.</p>
    </body>
</html>
enobrev
sumber
3

Nah, satu solusi sederhana, itu tidak cukup menambahkan "...", tetapi mencegah <h2> dari memecah menjadi dua baris adalah menambahkan sedikit css ini:

h2 {
    height:some_height_in_px; /* this is the height of the line */
    overflow:hidden; /* so that the second (or third, fourth, etc.)
                        line is not visible */
}

Saya memikirkannya lagi, dan saya datang dengan solusi ini, Anda harus membungkus konten tekstual dari tag h2 Anda dengan tag lain (mis. Rentang) (atau membungkus h2s dengan sesuatu yang memiliki ketinggian tertentu) dan kemudian Anda dapat menggunakan javascript semacam ini untuk memfilter kata-kata yang tidak dibutuhkan:

var elems = document.getElementById('conainter_of_h2s').
                     getElementsByTagName('h2');

    for ( var i = 0, l = elems.length; i < l; i++) {
        var span = elems.item(i).getElementsByTagName('span')[0];
        if ( span.offsetHeight > elems.item(i).offsetHeight ) {
            var text_arr = span.innerHTML.split(' ');
            for ( var j = text_arr.length - 1; j>0 ; j--) {
                delete text_arr[j];
                span.innerHTML = text_arr.join(' ') + '...';
                if ( span.offsetHeight <= 
                                        elems.item(i).offsetHeight ){
                    break;
                }
            }
        }
    }
Ramuns Usovs
sumber
Sebenarnya saya berpikir untuk menggunakan ini sebagai dasar untuk solusi yang mungkin, tetapi saya tidak tahu apakah - berdasarkan ini - akan mungkin untuk mencari tahu, apakah seluruh teks sekarang ditampilkan atau jika saya perlu mempersingkat dan menambahkan " ... " Memotongnya saja akan terlihat aneh.
BlaM
3

Inilah solusi JavaScript lainnya. Bekerja sangat baik dan sangat cepat.

https://github.com/dobiatowski/jQuery.FastEllipsis

Diuji pada Chrome, FF, IE pada Windows dan Mac.

Adam Lukaszczyk
sumber
Meskipun ini kurang otomatis, saya menemukan itu menjadi solusi yang lebih akurat daripada jawaban Adam Tegen . Skrip ini mengharuskan jumlah baris teks maksimum ditentukan alih-alih menebak.
donat
3

Ada solusi untuk teks multi-baris dengan css murni. Ini disebutline-clamp , tetapi hanya berfungsi di browser webkit. Namun ada cara untuk meniru ini di semua browser modern (semuanya lebih baru daripada IE8.) Juga, itu hanya akan bekerja pada latar belakang yang solid karena Anda memerlukan gambar latar belakang untuk menyembunyikan kata-kata terakhir dari baris terakhir. Begini caranya:

Diberikan html ini:

<p class="example" id="example-1">
    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</p>

Inilah CSS-nya:

p {
    position:relative;
    line-height:1.4em;
    height:4.2em;      /* 3 times the line-height to show 3 lines */
}
p::after {
    content:"...";
    font-weight:bold;
    position:absolute;
    bottom:0;
    right:0;
    padding:0 20px 1px 45px;
    background:url(ellipsis_bg.png) repeat-y;
}

ellipsis_bg.png menjadi gambar dengan warna yang sama dengan latar belakang Anda, yang lebarnya sekitar 100px dan memiliki tinggi yang sama dengan tinggi garis Anda.

Ini tidak terlalu cantik, karena teks Anda mungkin terpotong di tengah-tengah huruf, tetapi mungkin berguna dalam beberapa kasus.

Referensi: http://www.css-101.org/articles/line-clamp/line-clamp_for_non_webkit-based_browsers.php

Jules Colle
sumber
Itu bagus, tetapi Anda perlu memastikan bahwa teks Anda cukup panjang, karena CSS ini akan menambahkan "..." bahkan jika teksnya cukup pendek untuk masuk ke ruang yang tersedia. BTW: Jawaban yang sama telah diberikan oleh Apopii sekitar sebulan yang lalu;)
BlaM
@ BlaM Cukup banyak memang sama. Tapi saya pikir trik gradien rapi dan kode ini dalam CSS bukan SASS, jadi saya pikir layak untuk menjadi jawaban yang terpisah.
Jules Colle
3

Ellipsis Multi-baris CSS Murni untuk konten teks:

.container{
    position: relative;  /* Essential */
    background-color: #bbb;  /* Essential */
    padding: 20px; /* Arbritrary */
}
.text {
    overflow: hidden;  /* Essential */
    /*text-overflow: ellipsis; Not needed */
    line-height: 16px;  /* Essential */
    max-height: 48px; /* Multiples of line-height */
}
.ellipsis {
    position: absolute;/* Relies on relative container */
    bottom: 20px; /* Matches container padding */
    right: 20px; /* Matches container padding */
    height: 16px; /* Matches line height */
    width: 30px; /* Arbritrary */
    background-color: inherit; /* Essential...or specify a color */
    padding-left: 8px; /* Arbritrary */
}
<div class="container">
    <div class="text">
        Lorem ipsum dolor sit amet, consectetur eu in 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. 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>
    <div class="ellipsis">...</div>
</div>

Silakan checkout cuplikan untuk contoh langsung.

Jason Williams
sumber
2

Ini mirip dengan Alex tetapi melakukannya dalam waktu log, bukan linear, dan mengambil parameter maxHeight.

jQuery.fn.ellipsis = function(text, maxHeight) {
  var element = $(this);
  var characters = text.length;
  var step = text.length / 2;
  var newText = text;
  while (step > 0) {
    element.html(newText);
    if (element.outerHeight() <= maxHeight) {
      if (text.length == newText.length) {
        step = 0;
      } else {
        characters += step;
        newText = text.substring(0, characters);
      }
    } else {
      characters -= step;
      newText = newText.substring(0, characters);
    }
    step = parseInt(step / 2);
  }
  if (text.length > newText.length) {
    element.html(newText + "...");
    while (element.outerHeight() > maxHeight && newText.length >= 1) {
      newText = newText.substring(0, newText.length - 1);
      element.html(newText + "...");
    }
  }
};
Dave Aaron Smith
sumber
2

Ada solusi jQuery sederhana oleh Devon Govett :

https://gist.github.com/digulla/5796047

Untuk menggunakan, cukup panggil elipsis () pada objek jQuery. Sebagai contoh:

$ ("span"). ellipsis ();

BlaM
sumber
Saya baru saja memposting tautan yang sama. :)
Gumbo
Tautan dalam pos ini sudah mati.
Justin Tanner
Saya menambahkan tautan fallback
BlaM
1

Saya menulis ulang fungsi Alex untuk digunakan ke perpustakaan MooTools. Saya mengubahnya sedikit ke kata lompatan daripada menambahkan elipsis di tengah kata.

Element.implement({
ellipsis: function() {
    if(this.getStyle("overflow") == "hidden") {
        var text = this.get('html');
        var multiline = this.hasClass('multiline');
        var t = this.clone()
            .setStyle('display', 'none')
            .setStyle('position', 'absolute')
            .setStyle('overflow', 'visible')
            .setStyle('width', multiline ? this.getSize().x : 'auto')
            .setStyle('height', multiline ? 'auto' : this.getSize().y)
            .inject(this, 'after');

        function height() { return t.measure(t.getSize).y > this.getSize().y; };
        function width() { return t.measure(t.getSize().x > this.getSize().x; };

        var func = multiline ? height.bind(this) : width.bind(this);

        while (text.length > 0 && func()) {
            text = text.substr(0, text.lastIndexOf(' '));
            t.set('html', text + "...");
        }

        this.set('html', t.get('html'));
        t.dispose();
    }
}
});
iloveitaly
sumber
1

Saya tidak dapat menemukan skrip yang berfungsi persis seperti yang saya inginkan begitu juga skrip saya sendiri untuk jQuery - cukup banyak opsi untuk diatur dengan lebih banyak di jalan mereka :)

https://github.com/rmorse/AutoEllipsis

lebih buruk
sumber
1

Saya agak terkejut dengan perilaku css.

var cssEllipsis = 
{   "width": "100%","display": "inline-block", 
"vertical-align": "middle", "white-space": "nowrap", 
"overflow": "hidden", "text-overflow": "ellipsis" 
};

Kecuali saya memberikan lebar ke kontrol yang saya butuhkan untuk mengikat elipsis tidak mendukung saya. Apakah lebar harus ditambahkan properti ??? Tolong taruh pikiran Anda.

Premanshu
sumber
1

LAKUKAN ELLIPSIS MENGGUNAKAN HANYA CSS

<html>
<head>
<style type="text/css">
#ellipsisdiv {
    width:200px;
    white-space: nowrap;  
    overflow: hidden;  
    text-overflow: ellipsis;  
}  
</style>
</head>
<body>
<div id="ellipsisdiv">
This content is more than 200px and see how the the ellipsis comes at the end when the content width exceeds the div width.
</div>
</body>
</html>

* Kode ini berfungsi di sebagian besar browser saat ini. Jika Anda mengalami masalah dengan Opera dan IE (yang mungkin tidak akan Anda lakukan), tambahkan ini dalam gaya:

-o-text-overflow: ellipsis;  
-ms-text-overflow: ellipsis;

* Fitur ini adalah bagian dari CSS3. Sintaks lengkapnya adalah:

text-overflow: clip|ellipsis|string;
Robin Rizvi
sumber
1

Berikut ini adalah widget / plugin plugin yang bagus yang memiliki ellipsis bawaan: http://www.codeitbetter.co.uk/widgets/ellipsis/ Yang perlu Anda lakukan adalah referensi perpustakaan dan panggil yang berikut:

<script type="text/javascript"> 
   $(document).ready(function () { 
      $(".ellipsis_10").Ellipsis({ 
         numberOfCharacters: 10, 
         showLessText: "less", 
         showMoreText: "more" 
      }); 
   }); 
</script> 
<div class="ellipsis_10"> 
   Some text here that's longer than 10 characters. 
</div>
Tim
sumber
1

Anda dapat melakukan ini lebih mudah hanya dengan css, misalnya: mode sass

.truncatedText {
   font-size: 0.875em;
   line-height: 1.2em;
   height: 2.4em; // 2 lines * line-height
   &:after {
      content: " ...";
   }
}

dan Anda memiliki ellipsis;)

Apopii Dumitru
sumber
0

Sama seperti @acSlater saya tidak dapat menemukan sesuatu untuk apa yang saya butuhkan jadi saya menggulung sendiri. Berbagi seandainya orang lain dapat menggunakan:

Metode:
ellipsisIfNecessary(mystring,maxlength);
Pemakaian:
trimmedString = ellipsisIfNecessary(mystring,50);
Kode dan Tautan Demo: https://gist.github.com/cemerson/10368014
Christopher D. Emerson
sumber
Dua anotasi: a) Kode ini tidak memeriksa ukuran sebenarnya elemen HTML. Anda perlu menentukan panjang yang diberikan - yang mungkin merupakan fungsi yang diperlukan, tetapi sebenarnya sepele untuk dilakukan. b) Anda tinggal menambahkan "..." ke bagian akhir string. Ada tanda elipsis "..." yang bisa / harus Anda gunakan.
BlaM
Hey @BlaM - kode sebenarnya memeriksa panjang terhadap parameter maxlength. Setidaknya itu bekerja untuk saya. Yang mengatakan - ini hanya satu kali saya yang sederhana untuk situasi khusus saya. Jangan ragu untuk menggunakan salah satu solusi di atas jika solusi ini tidak sesuai untuk situasi Anda.
Christopher D. Emerson
Ya, ia bekerja dengan "panjang", tetapi tidak dengan "lebar" (ukuran piksel).
BlaM
Ide menarik - jangan ragu untuk membuat versi yang diperbarui dengan dukungan untuk itu. Saya tidak membutuhkan itu sekarang tetapi bisa berguna di masa depan.
Christopher D. Emerson
0
<html>
<head>
    <!-- By Warren E. Downs, copyright 2016.  Based loosely on a single/multiline JQuery using example by Alex,
    but optimized to avoid JQuery, to use binary search, to use CSS text-overflow: ellipsis for end,
    and adding marquee option as well.
    Credit: Marquee: http://jsfiddle.net/jonathansampson/xxuxd/
            JQuery version: http://stackoverflow.com/questions/536814/insert-ellipsis-into-html-tag-if-content-too-wide
            (by Alex, http://stackoverflow.com/users/71953/alex)
            (Improved with Binary Search as suggested by StanleyH, http://stackoverflow.com/users/475848/stanleyh)
    -->
    <meta content="text/html;charset=utf-8" http-equiv="Content-Type">
    <meta content="utf-8" http-equiv="encoding">
    <style>

        .single {
            overflow:hidden;
            white-space: nowrap;
            width: 10em;
            padding: 10px;
            margin: 0 auto;
            border: solid 1px blue;
        }

        .multiline {
            overflow: hidden;
            white-space: wrap;
            width: 10em;
            height: 4.5em;
            padding: 10px;
            margin: 0 auto;
            border: solid 1px blue;
        }

        .marquee {
            overflow: hidden;
            width: 40em;
            padding: 10px;
            margin: 0 auto;
            border: solid 1px blue;
        }

</style>
    <script>
        var _marqueeNumber=0;
        // mode=start,end,middle
        function clipText(text, len, mode) {
            if(!mode) { mode="end"; }
            else { mode=mode.toLowerCase(); }
            if(mode == "start") { return "&hellip;"+clipText(text,len,"_start"); }
            if(mode == "_start") { return text.substr(text.length - len); }
            if(mode == "middle") { 
                return clipText(text, len/2, "end") + clipText(text, len/2, "_start");
            }
            return text.substr(0, len) + "&hellip;";
        }

        function generateKeyframes(clsName, start, end) {
            var sec=5;
            var totalLen=parseFloat(start)-parseFloat(end);
            if(start.indexOf('em') > -1)      { sec=Math.round(totalLen/3); }
            else if(start.indexOf('px') > -1) { sec=Math.round(totalLen/42); }

            var style = document.createElement('style');
            style.type = 'text/css';
            style.innerHTML = 'body {}';
            document.getElementsByTagName('head')[0].appendChild(style);
            this.stylesheet = document.styleSheets[document.styleSheets.length-1];
            try {
                this.stylesheet.insertRule('.'+clsName+' {\n'+
                    '    animation: '+clsName+' '+sec+'s linear infinite;\n'+
                    '}\n', this.stylesheet.rules.length);
                this.stylesheet.insertRule('.'+clsName+':hover {\n'+
                    '    animation-play-state: paused\n'+
                    '}\n', this.stylesheet.rules.length);
                this.stylesheet.insertRule('@keyframes '+clsName+' {\n'+
                    '    0%   { text-indent: '+start+' }\n'+
                    '    100% { text-indent: '+end+' }\n'+
                    '}', this.stylesheet.rules.length);
            } catch (e) {
                console.log(e.message);
            }
        }

        function addClone(el, multiline, estyle) {
            if(!estyle) { 
                try { estyle=window.getComputedStyle(el); }
                catch(e) { return null; }
            }
            var t = el.cloneNode(true);
            var s=t.style;
            //s.display='none';
            s.visibility='hidden'; // WARNING: Infinite loop if this is not hidden (e.g. while testing)
            s.display='inline-block';
            s.background='black';
            s.color='white';
            s.position='absolute';
            s.left=0;
            s.top=0;
            s.overflow='visible';
            s.width=(multiline ? parseFloat(estyle.width) : 'auto');
            s.height=(multiline ? 'auto' : parseFloat(estyle.height));

            el.parentNode.insertBefore(t, el.nextSibling);

            return t;
        }
        function getTextWidth(el, multiline) {
            var t=addClone(el, multiline);
            if(!t) { return null; }
            var ts=window.getComputedStyle(t);
            var w=ts.width;
            if(multiline) {
                var es=window.getComputedStyle(el);
                var lines=Math.round(parseInt(ts.height)/parseInt(es.height))*2+0.5;
                w=w+'';
                var unit=''; // Extract unit
                for(var xa=0; xa<w.length; xa++) {
                    var c=w[xa];
                    if(c <= '0' || c >= '9') { unit=w.substr(xa-1); }
                }
                w=parseFloat(w);
                w*=lines; // Multiply by lines
                w+=unit; // Append unit again
            }
            t.parentNode.removeChild(t);
            return w;
        }

        // cls=class of element to ellipsize
        // mode=start,end,middle,marq (scrolling marquee instead of clip)
        function ellipsis(cls, mode) {
            mode=mode.toLowerCase();
            var elems=document.getElementsByClassName(cls);
            for(xa in elems) {
                var el=elems[xa];
                var multiline = el.className ? el.className.indexOf('multiline') > -1 : true;
                if(mode == "marq") {       
                    var w=getTextWidth(el, multiline);
                    if(!w) { continue; }
                    var mCls="dsmarquee"+(_marqueeNumber++);
                    var es=window.getComputedStyle(el);
                    generateKeyframes(mCls,es.width, '-'+w);
                    el.className+=" "+mCls; 
                    continue; 
                }
                if(mode == "end" && !multiline) { el.style.textOverflow="ellipsis"; continue; }
                var estyle=null;
                try { estyle=window.getComputedStyle(el); }
                catch(e) { continue; }
                if(estyle.overflow == "hidden") {
                    var text = el.innerHTML;
                    var t=addClone(el, multiline, estyle);

                    function height() {
                        var ts=window.getComputedStyle(t);
                        var es=window.getComputedStyle(el);
                        return parseFloat(ts.height) - parseFloat(es.height); 
                    }
                    function width() { 
                        var ts=window.getComputedStyle(t);
                        var es=window.getComputedStyle(el);
                        return parseFloat(ts.width) - parseFloat(es.width); 
                    }

                    var tooLong = multiline ? height : width;

                    var len=text.length;
                    var diff=1;
                    var olen=0;
                    var jump=len/2;
                    while (len > 0) {
                        var diff=tooLong();
                        if(diff > 0) { len-=jump; jump/=2; }
                        else if(diff < 0) { len+=jump; }
                        len=Math.round(len);
                        //alert('len='+len+';olen='+olen+';diff='+diff+';jump='+jump+';t='+JSON.stringify(t.innerHTML));
                        t.innerHTML=clipText(text, len, mode);
                        if(olen == len) { break; }
                        olen=len;
                    }
                    el.innerHTML=t.innerHTML;
                    t.parentNode.removeChild(t);
                }           
                //break;
                t.style.visibility='hidden';
            }
        }

        function testHarness() {
            ellipsis('ellipsis1', 'start'); 
            ellipsis('ellipsis2', 'end'); 
            ellipsis('ellipsis3', 'middle'); 
            ellipsis('marquee', 'marq')
        }
    </script>
    </head>
    <body onload="testHarness()">
    <div class="single ellipsis1" style="float:left">some long text that should be clipped left</div>
    <div class="single ellipsis2" style="float:right">right clip long text that should be clipped</div>
    <div class="single ellipsis3" style="float:center">some long text that should be clipped in the middle</div>

    <br />

    <p class="single marquee">Windows 8 and Windows RT are focused on your lifeyour friends and family, your apps, and your stuff. With new things like the <a href="http://windows.microsoft.com/en-US/windows-8/start-screen">Start screen</a>, <a href="http://windows.microsoft.com/en-US/windows-8/charms">charms</a>, and a <a href="http://windows.microsoft.com/en-US/windows-8/microsoft-account">Microsoft account</a>, you can spend less time searching and more time doing.</p>
    &nbsp;

    <br />

    <div class="multiline ellipsis1" style="float:left">Test test test test test test, some more long text, such as asdasdasdasdasd, that should be multiline clipped left(*)</div>

    <div class="multiline ellipsis2" style="float:right">right clip multiline long text, such as Test test test test test test, and some more long text that should be multiline clipped right.</div>

    <div class="multiline ellipsis3" style="float:center">Test test test test test test, some more long text, such as asdasdasdasdasd, that should be multiline clipped in the middle(*)</div>

    <br />

    <p class="multiline marquee">Multiline Marquee: Windows 8 and Windows RT are focused on your lifeyour friends and family, your apps, and your stuff. With new things like the <a href="http://windows.microsoft.com/en-US/windows-8/start-screen">Start screen</a>, <a href="http://windows.microsoft.com/en-US/windows-8/charms">charms</a>, and a <a href="http://windows.microsoft.com/en-US/windows-8/microsoft-account">Microsoft account</a>, you can spend less time searching and more time doing.</p>
    &nbsp;

    </body>
</html>
Warren Downs
sumber