Вставьте многоточие () в тег HTML, если содержание слишком велико

У меня есть веб-страница с эластичным макетом, ширина которого изменяется при изменении размера окна браузера.

В этом макете есть заголовки (h2), которые будут иметь переменную длину (на самом деле это заголовки из сообщений блога, которые я не контролирую). В настоящее время - если они шире окна - они разбиты на две строки.

Есть ли элегантное, проверенное (кросс-браузерное) решение - например, с jQuery - которое сокращает innerHTML этого тега заголовка и добавляет "...", если текст будет слишком широким, чтобы поместиться в одну строку на текущем экране / ширина контейнера?


person BlaM    schedule 11.02.2009    source источник
comment
Обновленный ответ 2014 г.: stackoverflow.com/a/22811590/759452   -  person Adrien Be    schedule 14.04.2014
comment
Я создал плагин на основе этого потока, который использует свойства CSS white-space и word-wrap для форматирования текста. github.com/nothrem/jQuerySmartEllipsis   -  person Radek Pech    schedule 04.06.2014


Ответы (23)


У меня есть решение, работающее в FF3, Safari и IE6 + с однострочным и многострочным текстом.

.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);
person alex    schedule 20.06.2009
comment
Хорошо, я искал, как справиться с переполнением с несколькими строками. Одно улучшение: вместо добавления трех точек добавьте символ многоточия «…». - person Simon Lieschke; 09.07.2009
comment
Это очень хорошо работает. Вы должны опубликовать это на сайте jQuery. - person Edgar; 23.07.2010
comment
Хотя в IE, если функция многоточия применяется к div, у которого есть ссылка, после многоточия ссылка исчезает. Есть указатели на это? - person Chantz; 11.01.2011
comment
Если вы хотите увидеть это в действии, вы можете увидеть это здесь (извините за странное форматирование кода плагина) jsfiddle.net/danesparza/TF6Rb/1 - person Dan Esparza; 25.01.2011
comment
Чтобы повысить производительность, выполняйте двоичный поиск вместо удаления одного символа за раз в цикле while. Если 100% текста не умещается, попробуйте 50% текста; затем 75% текста, если 50% подходит, или 25%, если 50% не подходит и т. д. - person StanleyH; 01.02.2011
comment
Действительно мило! Спасибо! Один вопрос. Может ли это работать, если высота текстового поля составляет процент от его родительского контейнера? Судя по моим тестам, это работает только при использовании точной высоты в пикселях. - person worked; 03.03.2011
comment
Это работает только с блочными элементами. Следующие изменения заставляют его работать также со встроенными элементами: 1. добавить var originalDisplay = el.css('display'); el.css('display', 'block'); перед строкой var t = ..., 2. добавить el.css('display', originalDisplay); после строки t.remove();. - person Jakub Januszkiewicz; 05.07.2011
comment
Добавлен новый ответ, касающийся всех этих и других проблем: stackoverflow.com/a/9071361/4066 - person Adam Tegen; 31.01.2012
comment
Я использовал этот сценарий, и он отлично подходит для настольных браузеров, но мне пришлось отключить его для iphone, так как он вызывал тайм-аут javascript. Возможно, я использовал сценарий (возможно, применил его к слишком большому количеству элементов), но это стоит отметить, в остальном он отлично работал. - person SwiftD; 06.03.2012
comment
Есть ли способ заставить это работать при изменении размера окна браузера? Я попытался установить ширину автоматически и вызвать .ellipsis () в resize (), но он никогда не показывает эллипсы. - person Sarel Botha; 27.06.2012
comment
Это приводит к серьезному снижению производительности, если вы используете его для любого значительного количества элементов или если селектор соответствует нескольким элементам в DOM. - person wnajar; 08.06.2013
comment
Я думаю, что это не работает с выбранным элементом. Есть ли способ добиться этого в выбранном элементе. http://jsfiddle.net/F8Kdt/ - person Vivek Dragon; 06.02.2014
comment
Пожалуйста, снимите отметку с этого ответа как правильный? - person ; 21.07.2014
comment
@DanEsparza Спасибо за пример. Я опробую :) - person SearchForKnowledge; 13.10.2014
comment
При определенной ширине многоточие не работает. jsfiddle.net/ofrj55j4/28 Попробуйте изменить размер окна вывода ... - person SearchForKnowledge; 13.10.2014
comment
Я раздвоил это, чтобы добавить поддержку текстовых полей и логики аппроксимации (любезно предоставлено ответом Майки Джи): jsfiddle.net/gfullam/j29z7381 - person gfullam; 08.07.2015
comment
не забывайте, что в латинских языках и китайском используются разные символы для эллипсов ellipsesLatin = '\ u2026'; ellipsesChinese = '\ u22ef'; - person feech; 25.02.2020

Следующее единственное решение CSS для усечения текста в одной строке работает со всеми браузерами, перечисленными на https://www.caniuse.com/#search=ellipsis на момент написания, за исключением Firefox 6.0. Обратите внимание, что JavaScript совершенно не нужен, если вам не требуется поддержка переноса многострочного текста или более ранних версий Firefox.

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

Если вам нужна поддержка более ранних версий Firefox, ознакомьтесь с моим ответом на этот другой вопрос.

person Simon Lieschke    schedule 09.07.2009
comment
Это на несколько порядков быстрее, чем подход jQuery. Прекрасно работает в IE7 + и Chrome. - person JDB still remembers Monica; 28.12.2012
comment
Это хорошо работает и в старых браузерах. Мы успешно использовали его в Google примерно в 2004 году, когда от нас требовалось аккуратно поддерживать или снижать производительность некоторых действительно сложных браузеров. - person ElBel; 15.01.2013
comment
JS Fiddle для тех, кто хочет попробовать его в браузере - jsfiddle.net/r39Ad - person Deepak Bala; 26.08.2013
comment
@DilipRajkumar вам нужно будет предоставить более подробную информацию, например пример JSFiddle, демонстрирующий, что он не работает в IE 8. - person Simon Lieschke; 02.09.2013
comment
@SimonLieschke: Как мы можем определить номер символа, после которого мы хотим добавить многоточие ?? - person SharpCoder; 25.09.2014
comment
@SharpCoder вы этого не сделаете. Обрезание текста определяется шириной содержащего его элемента, то есть он обрезается, когда он выходит за пределы ширины элемента. - person Simon Lieschke; 26.09.2014
comment
Также необходимы: display: inline-block; ширина: 150 пикселей! важно; - person estinamir; 22.11.2019

Я создал этот код, используя ряд других сообщений, со следующими улучшениями:

  1. Он использует двоичный поиск, чтобы найти нужную длину текста.
  2. Он обрабатывает случаи, когда элемент (ы) многоточия изначально скрыт, настраивая одноразовое событие показа, которое повторно запускает код многоточия при первом отображении элемента. Это удобно для представлений основных подробностей или древовидных представлений, где некоторые элементы изначально не отображаются.
  3. При желании он добавляет атрибут заголовка с исходным текстом для эффекта наведения.
  4. В стиль добавлено display: block, поэтому интервалы работают
  5. Вместо трех точек используется символ многоточия.
  6. Он автоматически запускает скрипт для чего угодно с классом .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));
person Adam Tegen    schedule 30.01.2012
comment
Красивый. Браво за реализацию моего предложения о бинарном поиске. - person StanleyH; 19.04.2012
comment
Просто небольшое примечание ... стоит добавить .css ('max-width', 'none') в переменную tempElement ... Таким образом, вы можете использовать объявление max-width в своем css, что делает плагин гораздо более гибким (по крайней мере, для большинства случаев использования, которые у меня есть). В любом случае, хорошая работа. :) - person gordyr; 11.12.2012
comment
Это гораздо более быстрая реализация, чем принятый выше ответ. Если у вас есть несколько элементов .ellipsis и вы делаете с ними что-то динамическое, этот работает намного лучше. - person mjvotaw; 12.12.2012
comment
Не могли бы вы привести пример? Мой вопрос здесь: stackoverflow.com/questions/26344520/ - person SearchForKnowledge; 13.10.2014
comment
Двоичный поиск предпочтительнее, но не с очень маленькими наборами данных, и в этом случае он снижает производительность по сравнению с прямым линейным поиском, таким как indexOf () ... очевидно - person user1360809; 11.05.2017
comment
@ user1360809 В этом конкретном случае я бы не согласился. На каждом этапе двоичного поиска он создает подстроку, делает из нее HTML и измеряет ее. Измерение - дорогостоящая операция, которую следует свести к минимуму. - person Adam Tegen; 14.05.2017
comment
@AdamTegen: Спасибо за хороший плагин. есть вопрос, а если он нам понадобится для 4-й или 5-й строчки? пл. переиграть - person React Developer; 18.06.2019

На случай, если вы окажетесь здесь в 2013 году - вот чистый css-подход, который я нашел здесь: http://css-tricks.com/snippets/css/truncate-string-with-ellipsis/

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

Это работает хорошо.

person Joseph Juhnke    schedule 24.10.2013
comment
FWIW, text-overflow не работает с textarea элементами (по состоянию на 2015 год). Если вам нужна поддержка для textarea, вы можете добиться этого, изменив принятый ответ или используя его вилка. - person gfullam; 08.07.2015

Мой ответ поддерживает только однострочный текст. Ознакомьтесь с приведенным ниже комментарием gfullam для многострочной вилки, она выглядит многообещающей.

Я несколько раз переписывал код из первого ответа, и думаю, это должен быть самый быстрый.

Сначала он находит «примерную» длину текста, а затем добавляет или удаляет символ, пока ширина не станет правильной.

Логика, которую он использует, показана ниже:

введите описание изображения здесь

После того, как «приблизительная» длина текста найдена, символы добавляются или удаляются до тех пор, пока не будет достигнута желаемая ширина.

Я уверен, что это требует некоторой настройки, но вот код:

(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);
person Mikey G    schedule 24.02.2012
comment
Ваше решение может быть не лучшим, но оно очень хорошо объяснено. И мне нравится этот тип логики приближения. +1 :) - person Flater; 25.10.2013
comment
Я раздвоил это, чтобы добавить поддержку текстовых полей и многострочного (вертикального) усечения многоточия: jsfiddle.net/gfullam/j29z7381 (мне нравится логика приближения, кстати) - person gfullam; 08.07.2015

Я сделал действительно крутой плагин jQuery для обработки всех разновидностей многоточия в тексте, он называется ThreeDots @ http://tpgblog.com/threedots

Он намного более гибкий, чем подходы CSS, и поддерживает гораздо более продвинутое настраиваемое поведение и взаимодействия.

Наслаждаться.

person Jeremy Horn    schedule 26.12.2009

Более гибкий плагин jQuery, позволяющий сохранить элемент после многоточия (например, кнопку «читать дальше») и обновить onWindowResize. Он также работает с текстом с разметкой:

http://dotdotdot.frebsite.nl

person Matt    schedule 11.10.2011
comment
Я только что протестировал этот плагин, но не смог заставить его работать. Trunk8 был для меня лучшим выбором. - person Guilherme Garnier; 05.09.2012

Плагин trunk8 jQuery поддерживает несколько строк и может использовать любой HTML-код, а не только символы многоточия, в качестве суффикса усечения: https://github.com/rviscomi/trunk8

Демо здесь: http://jrvis.com/trunk8/

person Eliot Sykes    schedule 24.08.2012
comment
да, но это уже давно. похоже, что это не поддерживается? - person user2513846; 08.03.2016
comment
Похоже, он активно поддерживается - на момент написания (март 2016 г.) проблемы и PR показывают недавнюю активность с участием создателя проекта. - person Eliot Sykes; 09.03.2016

На самом деле есть довольно простой способ сделать это в CSS используя тот факт, что IE расширяет это за счет нестандартных, а FF поддерживает :after

Вы также можете сделать это в JS, если вы хотите, проверив scrollWidth цели и сравнив ее с шириной ее родителей, но imho это менее надежно.

Изменить: это, по-видимому, более развито, чем я думал. Поддержка CSS3 может скоро появиться, и вы можете попробовать некоторые несовершенные расширения.

Последнее - хорошее чтение.

person annakata    schedule 11.02.2009
comment
На самом деле я предпочитаю решение JS - потому что оно добавляет только ... если текст шире доступного места. - person BlaM; 11.02.2009

Недавно я сделал нечто подобное для клиента. Вот версия того, что я для них сделал (пример протестирован во всех последних версиях браузеров на Win Vista). Не идеален по всем параметрам, но может быть легко настроен.

Демо: http://enobrev.info/ellipsis/

Код:

<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>
person enobrev    schedule 11.02.2009

Ну, одно простое решение, которое не совсем добавляет «...», но предотвращает разрыв ‹h2› на две строки, - это добавить этот бит css:

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

Я подумал еще немного и придумал это решение: вам нужно обернуть текстовое содержимое вашего тега h2 другим тегом (например, span) (или, альтернативно, обернуть h2s чем-то, что имеет заданную высоту), а затем вы можете использовать этот тип javascript для фильтрации ненужных слов:

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;
                }
            }
        }
    }
person Ramuns Usovs    schedule 11.02.2009
comment
На самом деле я думал об использовании этого в качестве основы для возможного решения, но я понятия не имею, можно ли на основании этого узнать, отображается ли теперь весь текст или мне нужно его сократить и добавить. ... Просто отрезать это выглядело бы странно. - person BlaM; 11.02.2009

Вот еще одно решение для JavaScript. Работает очень хорошо и очень быстро.

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

Протестировано в Chrome, FF, IE на Windows и Mac.

person Adam Lukaszczyk    schedule 19.01.2012
comment
Хотя это не так автоматично, я считаю, что это более точное решение, чем ответ Адама Тегена. Этот сценарий требует, чтобы вместо предположения было указано максимальное количество строк текста. - person donut; 19.03.2015

Есть решение для многострочного текста с чистым CSS. Он называется line-clamp, но работает только в браузерах webkit. Однако есть способ имитировать это во всех современных браузерах (во всех более свежих, чем IE8). Кроме того, он будет работать только на сплошном фоне, потому что вам нужно фоновое изображение, чтобы скрыть последние слова последней строки. Вот как это происходит:

Учитывая этот html:

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

Вот 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 - изображение того же цвета, что и ваш фон, оно будет иметь ширину около 100 пикселей и такую ​​же высоту, что и ваша line-height.

Это не очень красиво, так как ваш текст может быть обрезан в середине буквы, но в некоторых случаях это может быть полезно.

Ссылка: http://www.css-101.org/articles/line-clamp/line-clamp_for_non_webkit-based_browsers.php

person Jules Colle    schedule 25.08.2013
comment
Это хорошо, но вы должны быть уверены, что ваш текст достаточно длинный, потому что этот CSS добавит ... даже если текст достаточно короткий, чтобы поместиться в доступное пространство. Кстати: такой же ответ был предоставлен Apopii около месяца назад;) - person BlaM; 30.08.2013
comment
@BlaM Вообще то же самое. Но я думаю, что уловка с градиентом - это изящно, и этот код в CSS вместо SASS, поэтому я думаю, что это заслуживает отдельного ответа. - person Jules Colle; 31.08.2013

Многострочный многострочный многострочный текст на чистом CSS для текстового содержимого:

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

Пожалуйста, проверьте фрагмент для живого примера.

person Jason Williams    schedule 19.06.2015

Это похоже на Alex, но делает это в логарифмическом режиме, а не в линейном режиме, и принимает параметр 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 + "...");
    }
  }
};
person Dave Aaron Smith    schedule 18.05.2010

Существует простое решение jQuery от Девона Говетта:

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

Чтобы использовать, просто вызовите многоточие () для объекта jQuery. Например:

$ ("промежуток"). многоточие ();

person BlaM    schedule 15.04.2009
comment
Я как раз собирался опубликовать ту же ссылку. :) - person Gumbo; 15.04.2009
comment
Ссылка в этом посте мертва. - person Justin Tanner; 11.03.2014
comment
Я добавил резервную ссылку - person BlaM; 12.03.2014

Я переписал функцию Алекса для использования в библиотеке MooTools. Я немного изменил его на переход по словам, а не добавлял многоточие в середине слова.

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();
    }
}
});
person iloveitaly    schedule 05.01.2011

Я не смог найти сценарий, который работал бы именно так, как я хотел, поэтому я сделал свой собственный для jQuery - довольно много вариантов, которые можно установить, и еще больше на их пути :)

https://github.com/rmorse/AutoEllipsis

person rmorse    schedule 25.10.2011

Хотя я был немного удивлен поведением css.

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

Если я не указал ширину элемента управления, к которому мне нужно было привязать многоточие, это не подтвердило мою причину. Является ли ширина обязательным свойством, которое нужно добавить ??? Пожалуйста, поделитесь своими мыслями.

person Premanshu    schedule 16.01.2012

СДЕЛАЙТЕ ЭЛЛИПСИС, ИСПОЛЬЗУЯ ТОЛЬКО 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>

* Этот код работает в большинстве современных браузеров. Если у вас возникли проблемы с Opera и IE (чего, вероятно, не будет), добавьте их в стиле:

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

* Эта функция является частью CSS3. Его полный синтаксис:

text-overflow: clip|ellipsis|string;
person Robin Rizvi    schedule 18.01.2012

Вот хорошая библиотека виджетов / плагинов, в которую встроено многоточие: http://www.codeitbetter.co.uk/widgets/ellipsis/ Все, что вам нужно сделать, это ссылка на библиотеку и вызов следующего:

<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>
person Tim    schedule 07.04.2012

вы можете сделать это намного проще с помощью только css, например: sass mode

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

а у вас многоточие;)

person Apopii Dumitru    schedule 27.06.2013

Как и в случае с @acSlater, я не смог найти то, что мне было нужно, поэтому я сделал свой собственный. Совместное использование, если кто-то еще может использовать:

Method:
ellipsisIfNecessary(mystring,maxlength);
Usage:
trimmedString = ellipsisIfNecessary(mystring,50);
Code and Demo Link: https://gist.github.com/cemerson/10368014
person Christopher D. Emerson    schedule 10.04.2014
comment
Две аннотации: a) Этот код не проверяет фактический размер элемента HTML. Вам нужно указать заданную длину - это может быть необходимой функциональностью, но на самом деле это тривиально. б) Вы просто добавляете ... в конец строки. Есть знак многоточия ... вы можете / должны использовать. - person BlaM; 11.04.2014
comment
Привет @BlaM - код действительно проверяет длину по параметру maxlength. По крайней мере, у меня это работает. Тем не менее - это просто моя скромная вещь для моей конкретной ситуации. Не стесняйтесь использовать любое из вышеперечисленных решений, если оно не работает в вашей ситуации. - person Christopher D. Emerson; 15.04.2014
comment
Да, работает с длиной, но не с шириной (размером в пикселях). - person BlaM; 15.04.2014
comment
Интересная идея - смело делайте обновленную версию с поддержкой этого. Сейчас мне это не нужно, но может пригодиться в будущем. - person Christopher D. Emerson; 17.04.2014