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


210

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

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

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

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




Ответы:


187

Обновление: 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);
    }
};

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


Это круто, спасибо за указание на это! Невыбираемый текст и ограничения на то, что контент может помещаться в усеченный div - это позор, но в целом это выглядит как хорошее решение.
Сэм Стоукс

Единственное настоящее разочарование, с которым я столкнулся, это то, что пробелы отображаются как & nbsp ;, поэтому отступы на самом деле невозможны ... = /
Matchu

Я тоже столкнулся с этой проблемой. Я не могу поверить, что Firefox пока не поддерживает это в какой-то форме.
mcjabberz

работает ли этот подход для всех, кто использует элементы OPTION элементов управления SELECT в Webkit и IE8. Webkit, кажется, ничего не делает для меня, и IE8 просто обрезает это без многоточия.
Раджат

Документация Microsoft для text-overflowне указывает на поддержку optionэлементов (см. Раздел « Применяется к » на msdn.microsoft.com/en-us/library/ms531174(VS.85).aspx ).
Симон Лишке

45

Март 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 до IE11
  • Опера 10.6, Опера 11.1, Опера 15.0, Опера 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 - как показать подсказку ТОЛЬКО при активированном многоточии

Ресурсы:


@chiragpatel попробуйте сами, отредактировав это живое демо jsbin.com/leyukama/1
Adrien Be

Для тех, кто заинтересован, FF7 <составляет 0,05% пользователей Firefox в настоящее время
Том Том

19

Если у вас все в порядке с решением JavaScript, есть плагин jQuery для этого в кросс-браузерном режиме - см. Http://azgtech.wordpress.com/2009/07/26/text-overflow-ellipsis-for -Firefox-через-JQuery /


Это определенно полезно, спасибо! Похоже, что все браузеры, кроме Firefox, поддерживают свойство CSS, поэтому с этим плагином не будут работать только пользователи Firefox, которые отключили Javascript - и это в любом случае является изящной деградацией. Любая идея, каковы последствия производительности?
Сэм Стоукс

Нет, извините ... Я не использовал код в реальной жизни, просто играл с демо. Было бы легко взять демо и вырезать и вставить его сто раз на одну и ту же страницу.
RichieHindle

2
JavaScript truncate () (будь то точка-строка для jQuery или Prototype или что-то еще) - это лишь промежуточное решение, потому что они не учитывают ширину символа. Итак, если вы хотите обрезать текст из-за предопределенного ограниченного пространства, эти функции надежно работают только при использовании моноширинных шрифтов. Любое серьезное решение должно работать с глифами, а не с количеством символов.
Матиас

@Matthias: Возможно, код был обновлен с тех пор, как вы его протестировали, но я только что посмотрел демо, и он отлично работает со шрифтом переменной ширины.
RichieHindle

7

ОК, Firefox 7 реализован text-overflow: ellipsisтак же, как и text-overflow: "string". Окончательный выпуск запланирован на 2011-09-27.


6

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

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

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

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

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


Проблема с псевдокодом заключается в том, что «...» по-прежнему обрезается или скрывается, если текст переполняется. Я надеялся, что, если текст переполнится, он обязательно покажет «...». Очевидно, что это не так :(
Антоний

@Antony Просто поместите псевдоэлемент: position: absolute; right: 0;(и не забудьте position: relativeо реальном элементе, чтобы он работал). Он будет перекрываться с текстом, поэтому вы можете также добавить цвет фона.
последний ребенок
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.