Усечение длинных строк с помощью CSS: возможно ли?

Есть ли хороший способ обрезать текст с помощью обычного HTML и CSS, чтобы динамическое содержимое могло уместиться в макете с фиксированной шириной и высотой?

Я усекал на стороне сервера логическую ширину (то есть количество символов, которое было угадано вслепую), но поскольку 'w' шире, чем 'i', это имеет тенденцию быть неоптимальным, а также требует, чтобы я повторно угадал (и продолжал настраивать) количество символов для каждой фиксированной ширины. В идеале усечение должно происходить в браузере, которому известна физическая ширина отображаемого текста.

Я обнаружил, что IE имеет свойство text-overflow: ellipsis, которое делает именно то, что я хочу, но мне нужно, чтобы оно было кроссбраузерным. Это свойство кажется (в некоторой степени?) Стандартным, но не поддерживается Firefox. Я нашел различные обходные пути на основе overflow: hidden, но они либо не отображать многоточие (я хочу, чтобы пользователь знал, что контент был усечен) или отображать его все время (даже если контент не был усечен).

Есть ли у кого-нибудь хороший способ уместить динамический текст в фиксированный макет, или усечение на стороне сервера по логической ширине так же хорошо, как я собираюсь сейчас получить?


person Sam Stokes    schedule 29.04.2009    source источник
comment
2014: см. Актуальный ответ stackoverflow.com/questions/802175/   -  person Adrien Be    schedule 18.08.2014
comment
связанные: Применение многострочного текста к многострочному тексту   -  person Michael Benjamin    schedule 24.10.2015
comment
Возможный дубликат Вставьте многоточие (...) в тег HTML, если содержание слишком велико   -  person Naeem Shaikh    schedule 15.02.2016


Ответы (5)


Обновление: text-overflow: ellipsis теперь поддерживается в Firefox 7 (выпущенном 27 сентября 2011 г.). Ура! Мой первоначальный ответ является историческим свидетельством.

У Джастина Максвелла есть кроссбраузерное решение CSS. Однако у него есть обратная сторона - запрет на выбор текста в Firefox. Ознакомьтесь с его гостевым постом в блоге Мэтта Снайдера для получения полной информации о как это работает.

Обратите внимание, что этот метод также предотвращает обновление содержимого узла в JavaScript с помощью свойства innerHTML в Firefox. См. В конце этого сообщения обходной путь.

CSS

.ellipsis {
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    -o-text-overflow: ellipsis;
    -moz-binding: url('assets/xml/ellipsis.xml#ellipsis');
}

ellipsis.xml содержимое файла

<?xml version="1.0"?>
<bindings
  xmlns="http://www.mozilla.org/xbl"
  xmlns:xbl="http://www.mozilla.org/xbl"
  xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
>
    <binding id="ellipsis">
        <content>
            <xul:window>
                <xul:description crop="end" xbl:inherits="value=xbl:text"><children/></xul:description>
            </xul:window>
        </content>
    </binding>
</bindings>

Обновление содержимого узла

Чтобы обновить содержимое узла способом, который работает в Firefox, используйте следующее:

var replaceEllipsis(node, content) {
    node.innerHTML = content;
    // use your favorite framework to detect the gecko browser
    if (YAHOO.env.ua.gecko) {
        var pnode = node.parentNode,
            newNode = node.cloneNode(true);

        pnode.replaceChild(newNode, node);
    }
};

См. Сообщение Мэтта Снайдера для объяснения того, как это работает.

person Simon Lieschke    schedule 09.07.2009
comment
Это здорово, спасибо, что указали на это! Невыбираемый текст и ограничения на то, какой контент может помещаться в усеченный div, - это позор, но в целом это выглядит как хорошее решение. - person Sam Stokes; 09.07.2009
comment
Единственное настоящее разочарование, которое я испытал, это то, что пробелы отображаются как, поэтому отступы на самом деле невозможны ... = / - person Matchu; 11.08.2009
comment
Я тоже столкнулся с этой проблемой. Я не могу поверить, что Firefox еще не поддерживает это в той или иной форме. - person mcjabberz; 24.08.2009
comment
работает ли этот подход для всех, кто работает с элементами OPTION элементов управления SELECT в Webkit и IE8. Webkit, похоже, ничего не делает для меня, а IE8 просто обрезает его без многоточия. - person Rajat; 10.04.2010
comment
В документации Microsoft для text-overflow не указана поддержка элементов option (см. Раздел Применимо к на странице msdn.microsoft.com/en-us/library/ms531174 (VS.85) .aspx). - person Simon Lieschke; 10.04.2010
comment
Просто предупреждаем, что взлом XUL в настоящее время не работает в Firefox 4.0 (который находится в разработке на момент написания). Я буду держать людей в курсе. bugzilla.mozilla.org/show_bug.cgi?id=312156#c94 - person Simon Lieschke; 22.09.2010
comment
ETA для поддержки Firefox для этого (на момент написания) Firefox 6. - person Simon Lieschke; 13.04.2011
comment
Работает отлично! Я не реализовал Firefox для своего проекта, потому что это меня раздражало. К черту пользователей Firefox :) - person Sam Soffes; 11.05.2011
comment
Не работает для ячеек таблицы, которые я заметил. Вам нужно обернуть содержимое внутри DIV и применить стиль к DIV, а не к ячейке таблицы (по крайней мере, в Chrome / Webkit). - person Simon East; 05.02.2012
comment
@Simon также см. этот ответ. - person Simon Lieschke; 07.02.2012

2014 март: усечение длинных строк с помощью CSS: новый ответ, ориентированный на поддержку браузеров

Демо на http://jsbin.com/leyukama/1/ (я использую jsbin, потому что он поддерживает старые версия IE).

<style type="text/css">
    span {
        display: inline-block;
        white-space: nowrap;
        overflow: hidden;
        text-overflow: ellipsis;     /** IE6+, Firefox 7+, Opera 11+, Chrome, Safari **/
        -o-text-overflow: ellipsis;  /** Opera 9 & 10 **/
        width: 370px; /* note that this width will have to be smaller to see the effect */
    }
</style>

<span>Some very long text that should be cut off at some point coz it's a bit too long and the text overflow ellipsis feature is used</span>

Свойство CSS -ms-text-overflow не обязательно: это синоним свойства CSS text-overflow, но версии IE с 6 по 11 уже поддерживают свойство CSS text-overflow.

Успешно протестировано (на Browserstack.com) в ОС Windows для веб-браузеров:

  • IE6 to IE11
  • Opera 10.6, Opera 11.1, Opera 15.0, Opera 20.0
  • Хром 14, Хром 20, Хром 25
  • Safari 4.0, Safari 5.0, Safari 5.1
  • Firefox 7.0, Firefox 15

Firefox: как указал Саймон Лишке (в другом ответе), Firefox поддерживает свойство CSS переполнения текста только начиная с Firefox 7 (выпущено 27 сентября 2011 года).

Я дважды проверил это поведение в Firefox 3.0 и Firefox 6.0 (переполнение текста не поддерживается).

Потребуется дополнительное тестирование в веб-браузерах Mac OS.

Примечание: вы можете отображать всплывающую подсказку при наведении курсора мыши, когда применяется многоточие, это можно сделать с помощью javascript, см. Следующие вопросы: Обнаружение многоточия при переполнении текста HTML и HTML - как показать всплывающую подсказку ТОЛЬКО при активированном многоточии

Ресурсы:

person Adrien Be    schedule 02.04.2014
comment
@chiragpatel попробуйте сами, отредактировав эту живую демонстрацию jsbin.com/leyukama/1 - person Adrien Be; 05.09.2016
comment
Для всех, кому интересно, FF7 ‹составляет 0,05% пользователей Firefox в настоящее время - person Tom Tom; 26.05.2017

Если вас устраивает решение JavaScript, есть подключаемый модуль jQuery для кроссбраузерности - см. http://azgtech.wordpress.com/2009/07/26/text-overflow-ellipsis-for-firefox-via-jquery/

person RichieHindle    schedule 29.04.2009
comment
Это определенно полезно, спасибо! Похоже, что все браузеры, кроме Firefox, поддерживают свойство CSS, поэтому с этим плагином он не будет работать только для пользователей Firefox, которые отключили Javascript - и это в любом случае изящная деградация. Есть идеи, каковы последствия для производительности? - person Sam Stokes; 29.04.2009
comment
Нет, извините ... Я не использовал код в реальной жизни, просто играл с демо. Было бы легко взять демонстрацию и скопировать ее сотни раз на одну и ту же страницу. - person RichieHindle; 29.04.2009
comment
JavaScript truncate () (будь то точечная строка для jQuery или Prototype или что-то еще) - это только промежуточное решение, потому что они не принимают во внимание ширину символа. Итак, если вы хотите обрезать текст из-за заранее определенного ограниченного пространства, эти функции надежно работают только при использовании моноширинных шрифтов. Любое серьезное решение должно работать с глифами, а не с подсчетом символов. - person Matthias; 26.08.2009
comment
@Matthias: Возможно, код был обновлен с тех пор, как вы его тестировали, но я только что посмотрел демонстрацию, и она отлично работает со шрифтом переменной ширины. - person RichieHindle; 29.07.2010

Хорошо, Firefox 7 реализовал text-overflow: ellipsis так же, как text-overflow: "string". Финальный релиз запланирован на 27 сентября 2011 г.

person j.j.    schedule 09.07.2011

Еще одним решением проблемы может быть следующий набор правил CSS:

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

.ellipsis:after{
  content:'...';
}

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

Мои два цента. Снимаю шляпу перед оригинальной техникой Джастина Максвелла

person Rajat    schedule 09.04.2010
comment
Проблема с псевдокодом в том, что ... по-прежнему обрезается или скрывается, если текст переполняется. Я надеялся, что если текст переполнится, он обязательно ... будет показан. Ясно, что это не так :( - person Antony; 22.03.2012
comment
@Antony Просто поместите псевдоэлемент: position: absolute; right: 0; (и не забудьте position: relative на реальном элементе, чтобы он работал). Он будет перекрывать текст, поэтому вы также можете добавить цвет фона. - person last-child; 17.06.2013