İçerik çok genişse HTML etiketine üç nokta (…) ekleyin


148

Tarayıcı penceresi yeniden boyutlandırıldığında genişliğini değiştiren elastik bir düzen ile bir web sayfam var.

Bu düzende h2değişken bir uzunluğa sahip (aslında üzerinde kontrol sahibi olmadığım blog yazılarının başlıkları olmak üzere) başlıklar () vardır. Şu anda - eğer pencereden daha genişlerse - iki satıra bölünürler.

Bu başlık etiketinin innerHTML'sini kısaltan ve metin geçerli ekranda bir satıra sığmayacak kadar genişse "..." ekleyen zarif, test edilmiş (çapraz tarayıcı) bir çözüm var mı - örneğin jQuery ile - konteyner genişliği?


1
2014 güncellenmiş cevap: stackoverflow.com/a/22811590/759452
Adrien Be

Metin biçimlendirmek için boşluk ve word-wrap CSS özelliklerini kullanan bu iş parçacığına dayalı eklenti oluşturdum. Github.com/nothrem/jQuerySmartEllipsis
Radek Pech

Yanıtlar:


119

FF3, Safari ve IE6 + 'da tek ve çok satırlı bir metinle çalışan bir çözümüm var

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

22
Güzel, birden fazla hatla taşmayı nasıl başaracağımı arıyorum. Bir gelişme: üç nokta eklemek yerine üç nokta karakteri '…' ekleyin.
Simon Lieschke

4
Bu çok iyi çalışıyor. Bunu jQuery sitesinde yayınlamanız gerekir.
Edgar

1
IE'de üç nokta işlevi sadece bir bağlantısı olan bir div'a uygulanırsa, üç noktadan sonra bağlantı kaybolur. Bu konuda herhangi bir işaretçi var mı?
Chantz

6
Bunu eylemde görmek istiyorsanız, burada görebilirsiniz (eklenti kodundaki vidalı biçimlendirme için üzgünüm) jsfiddle.net/danesparza/TF6Rb/1
Dan Esparza

22
Performansı artırmak için, "while" döngüsünde bir seferde 1 karakteri kaldırmak yerine ikili bir arama yapın. Metnin% 100'ü sığmıyorsa, metnin% 50'sini deneyin; % 50 uygunsa metnin% 75'i veya% 50 uygun değilse% 25, ​​vb.
StanleyH

182

Aşağıdaki CSS yalnızca tek bir satırdaki metni kısaltmaya yönelik çözüm , Firefox 6.0 hariç olmak üzere yazma olarak http://www.caniuse.com adresinde listelenen tüm tarayıcılarla çalışır . Çok satırlı metni veya Firefox'un önceki sürümlerini kaydırmayı desteklemeniz gerekmedikçe JavaScript'in tamamen gerekli olmadığını unutmayın.

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

Firefox'un önceki sürümleri için desteğe ihtiyacınız varsa , bu diğer soruya cevabımı kontrol edin .


2
Bu, jQuery yaklaşımından daha hızlı büyüklük sıralarıdır. IE7 + ve Chrome'da iyi çalışır.
JDB hala

3
Bu, eski tarayıcılarda da iyi çalışır. Google'da ~ 2004'te başarılı bir şekilde kullanıyorduk, burada bazı gerçekten köşe halinde tarayıcılarda zarif bir şekilde desteklememiz veya bozmamız gerekiyordu.
ElBel

2
Bir tarayıcıda örneklemek isteyenler için JS Fiddle - jsfiddle.net/r39Ad
Deepak Bala

@DilipRajkumar , IE 8'de çalışmadığını gösteren bir JSFiddle örneği daha fazla ayrıntı vermeniz gerekecek .
Simon Lieschke

1
@SharpCoder yapmazsın. Metnin kesildiği yer, onu içeren öğenin genişliği tarafından belirlenir, yani öğenin genişliğini ne zaman taşacağı kesilir.
Simon Lieschke

40

Bu kodu, aşağıdaki geliştirmeler ile, diğer yazıların bir dizi kullanarak inşa:

  1. Doğru olan metin uzunluğunu bulmak için bir ikili arama kullanır.
  2. Üç nokta öğesinin ilk görüntülendiğinde üç nokta kodunu yeniden çalıştıran tek adımlık bir gösteri olayı ayarlayarak üç nokta öğesinin / öğelerinin başlangıçta gizlendiği durumları işler. Bu, bazı öğelerin başlangıçta görüntülenmediği ana ayrıntı görünümleri veya ağaç görünümleri için kullanışlıdır.
  3. İsteğe bağlı olarak, fareyle üzerine gelme efekti için orijinal metne sahip bir başlık niteliği ekler.
  4. Tarza eklendi display: block, böylece açıklıklar çalışıyor
  5. Üç nokta yerine üç nokta karakterini kullanır.
  6. .Ellipsis sınıfıyla herhangi bir şey için komut dosyasını otomatik olarak çalıştırır

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

2
Güzel. Bravo benim ikili arama önerimi uygulamak için.
StanleyH

2
Hızlı bir not ... tempElement değişkenine .css ('max-width', 'none') eklemeye değer ... Bu şekilde css'nizde bir maksimum genişlik bildirimi kullanabilirsiniz, bu da eklentiyi çok daha esnek hale getirir (en azından sahip olduğum çoğu kullanım durumunda). Yine de iyi iş. :)
gordyr

3
Bu, yukarıda kabul edilen cevaptan çok daha hızlı bir uygulamadır. Birden çok .ellipsis öğeniz varsa ve onlarla dinamik bir şey yapıyorsanız, bu çok daha iyi performans gösterir.
mjvotaw

Lütfen bir örnek verebilir misiniz? Benim sorum burada: stackoverflow.com/questions/26344520/…
SearchForKnowledge

İkili Arama tercih edilir, ancak çok küçük veri kümeleriyle tercih edilmez ve bu durumda indexOf () gibi düz bir doğrusal aramaya kıyasla performansı engeller ... görünüşte
user1360809

20

Cevabım yalnızca tek satırlı metni destekliyor. Çok satırlı çatal için gfullam'ın aşağıdaki yorumuna göz atın, oldukça umut verici görünüyor.

İlk cevaptaki kodu birkaç kez yeniden yazdım ve bunun en hızlı olması gerektiğini düşünüyorum.

Önce bir "Tahmini" metin uzunluğu bulur ve ardından genişlik doğru olana kadar bir karakter ekler veya kaldırır.

Kullandığı mantık aşağıda gösterilmiştir:

resim açıklamasını buraya girin

"Tahmini" metin uzunluğu bulunduktan sonra, istenen genişliğe ulaşılana kadar karakterler eklenir veya kaldırılır.

Eminim bazı tweaking ihtiyacı var, ama işte kod:

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

3
Çözümünüz en iyi olmayabilir, ancak çok iyi açıklanmıştır. Ve bu tür bir yaklaşım mantığını seviyorum. +1 :)
Flater

2
Bunu textareas ve çok hatlı ( dikey) üç nokta kesilmesi için destek eklemek için çatalladım : jsfiddle.net/gfullam/j29z7381 (BTW yaklaşık mantığı beğendim)
gfullam


18

Metnin tüm elips çeşitlerini işlemek için gerçekten harika bir jQuery eklentisi yaptım ThreeDots @ http://tpgblog.com/threedots denir

CSS yaklaşımlarından çok daha esnektir ve çok daha gelişmiş, özelleştirilebilir davranışları ve etkileşimleri destekler.

Zevk almak.


8

Daha esnek bir jQuery eklentisi, üç noktadan sonra bir öğeyi (örneğin, "daha fazla oku" düğmesi) tutmanıza ve Windows üzerinde güncellemenize olanak tanır. İşaretleme ile metin etrafında da çalışır:

http://dotdotdot.frebsite.nl


Bu eklentiyi yeni test ettim, ancak çalıştıramadım. Trunk8 benim için daha iyi bir seçimdi.
Guilherme Garnier

8

trunk8 jQuery eklentisi birden çok satırı destekler ve kesme eki için yalnızca üç nokta karakteri değil, herhangi bir html kullanabilir: https://github.com/rviscomi/trunk8

Burada demo: http://jrvis.com/trunk8/


evet ama bu şimdi çok eski. desteklenmiyor mu?
user2513846

1
Aktif olarak desteklenmiş gibi görünüyor - yazma sırasında (Mart 2016), sorunlar ve halkla ilişkiler projeleri proje yaratıcısını içeren son etkinliği gösteriyor.
Eliot Sykes

5

Aslında bunu IE standart dışı ve FF destekleri ile genişletir gerçeğini kullanarak CSS bunu yapmak için oldukça basit bir yolu var:after

İsterseniz, JS'de hedefin scrollWidth değerini inceleyerek ve bunu ebeveyn genişliğiyle karşılaştırarak da yapabilirsiniz, ancak bu daha az sağlamdır.

Düzenleme: Bu görünüşte düşündüğümden daha gelişmiş. CSS3 desteği yakında mevcut olabilir ve denemeniz için bazı kusurlu uzantılar mevcuttur.

Sonuncusu iyi okuma.


Aslında JS çözümünü tercih ediyorum - çünkü metin kullanılabilir alandan daha genişse yalnızca "..." ekler.
BlaM

3

Geçenlerde bir müşteri için benzer bir şey yapmıştım. İşte onlar için yaptığımın bir sürümü (örnek, Win Vista'daki tüm son tarayıcı sürümlerinde test edilmiştir). Tüm tahta etrafında mükemmel değil, ama oldukça kolay tweaked olabilir.

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

Kod:

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

3

Peki, basit bir çözüm, "..." 'i tam olarak eklemez, ancak <h2>' nin iki satıra bölünmesini engeller, bu css bitini eklemek olacaktır:

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

Biraz daha düşündüm ve bu çözümü buldum, h2 etiketinizin metin içeriğini başka bir etiketle (örneğin bir açıklık) sarmanız (veya alternatif olarak h2'leri verilen yüksekliğe sahip bir şeyle sarmanız) ve sonra gereksiz kelimeleri filtrelemek için bu tür bir javascript kullanabilirsiniz:

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

Aslında bunu olası bir çözüm için temel olarak kullanmayı düşündüm, ancak - buna dayanarak - tüm metnin şimdi gösterilip gösterilmediğini veya kısaltıp eklemem gerekip gerekmediğini öğrenmek mümkün değil " ... ". Sadece kesmek garip görünecektir.
BlaM


3

Saf css ile çok satırlı metin için bir çözüm var. Denirline-clamp , ancak yalnızca webkit tarayıcılarda çalışır. Bununla birlikte, tüm modern tarayıcılarda (IE8'den daha yeni olan her şey) bunu taklit etmenin bir yolu var. Ayrıca, son satırın son kelimelerini gizlemek için bir arka plan görüntüsüne ihtiyacınız olduğu için yalnızca sağlam arka planlar üzerinde çalışacaktır. İşte böyle:

Bu html verildiğinde:

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

İşte CSS:

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 arka planınızla aynı renkte, yaklaşık 100 piksel genişliğinde ve satır yüksekliğinizle aynı yüksekliğe sahip bir resimdir.

Çok güzel değil, çünkü metniniz bir harfin ortasında kesilebilir, ancak bazı durumlarda yararlı olabilir.

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


Bu güzel, ancak metninizin yeterince uzun olduğundan emin olmalısınız, çünkü metin mevcut alana sığacak kadar kısa olsa bile bu CSS "..." ekleyecektir. BTW: Aynı yanıt Apopii tarafından yaklaşık bir ay önce
sağlandı

@BlaM Gerçekten de aynı. Ama ben degrade hile düzgün ve SASS yerine CSS bu kodu düşünüyorum, bu yüzden ayrı bir cevap olmaya değer düşünüyorum.
Jules Colle

3

Metin içeriği için Saf CSS Çok Satırlı Üç Nokta:

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

Canlı bir örnek için lütfen snippet'e göz atın.


2

Bu Alex'inkine benzer, ancak doğrusal yerine günlük zamanında yapar ve bir maxHeight parametresi alır.

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 + "...");
    }
  }
};


1

Alex'in işlevini MooTools kütüphanesinde kullanmak için yeniden yazdım. Bir sözcüğün ortasına üç nokta eklemek yerine kelimeyi zıplatmak için biraz değiştirdim.

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


1

Yine de css davranışı tarafından biraz şaşırdım.

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

Elipsi bağlamak için gereken kontrole genişliği sağlamadığım sürece sebebimi desteklemedi. Genişlik eklenecek bir özellik mi ??? Lütfen düşüncelerinizi yazınız.


1

YALNIZCA CSS KULLANARAK ELLİPSİ YAPMAK

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

* Bu kod, mevcut tarayıcıların çoğunda çalışır. Opera ve IE ile herhangi bir sorun yaşarsanız (muhtemelen yapmayacaksınız), bunları stile ekleyin:

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

* Bu özellik CSS3'ün bir parçasıdır. Tam sözdizimi:

text-overflow: clip|ellipsis|string;

1

İşte güzel Widget / eklenti inşa üç nokta olan kütüphane: http://www.codeitbetter.co.uk/widgets/ellipsis/ bunu kitaplığı başvuru ve aşağıdakileri çağrı yapmanız gereken:

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

1

bunu yalnızca css ile çok daha kolay yapabilirsiniz, örneğin: sass modu

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

ve üç nokta var;)


0

Tıpkı @acSlater gibi, ihtiyacım olan şey için bir şey bulamadım, bu yüzden kendime yuvarladım. Başka birinin kullanabileceği durumlarda paylaşım:

Yöntem:
ellipsisIfNecessary(mystring,maxlength);
Kullanımı:
trimmedString = ellipsisIfNecessary(mystring,50);
Kod ve Demo Bağlantısı: https://gist.github.com/cemerson/10368014

İki ek açıklama: a) Bu kod, bir HTML öğesinin gerçek boyutunu kontrol etmez. Belirli bir uzunluğu belirtmeniz gerekir - bu gerekli işlevsellik olabilir, ancak aslında önemsizdir. b) Dizenin sonuna "..." eklersiniz. Kullanabileceğiniz / kullanmanız gereken bir üç nokta işareti "…" vardır.
BlaM

Hey @BlaM - kod aslında uzunluğu maxlength parametresine göre kontrol eder. En azından benim için çalışıyor. Dedi ki - bu sadece benim özel durumum için mütevazı bir kerelik. Durumunuza uygun değilse yukarıdaki çözümlerden herhangi birini kullanmaktan çekinmeyin.
Christopher D. Emerson

Evet, "uzunluk" ile çalışır, ancak "genişlik" (piksel boyutu) ile çalışmaz.
BlaM

İlginç bir fikir - bunun için güncellenmiş bir sürüm w / destek yapmaktan çekinmeyin. Şimdi buna ihtiyacım yok ama gelecekte faydalı olabilir.
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>
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.