многоточие CSS на второй строке


208

CSS text-overflow: ellipsis на второй строке, это возможно? Я не могу найти это в сети.

пример:

что я хочу, это так:

I hope someone could help me. I need 
an ellipsis on the second line of...

но то, что происходит, это:

I hope someone could help me. I ... 

3
AFAIK многоточие появится и обрежет текст в конце ширины элемента. Это не будет переходить на следующую строку. Лучшим решением здесь было бы реализовать некоторый серверный или клиентский скрипт, который автоматически обрезает текст до определенного количества символов, а затем добавляет многоточие. Я предполагаю, что клиентский сценарий будет лучше, что позволит вам по-прежнему иметь весь доступный исходный текст, если вам это нужно.
FarligOpptreden

вот похожий вопрос: stackoverflow.com/questions/3922739/…
Евгений

tl; dr: возможно только в webkit
Евгений

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

Ответы:


105

Требование для text-overflow: ellipsis;работы - однострочная версия white-space( preи nowrapт. Д.). Это означает, что текст никогда не достигнет второй строки.

Ergo. Невозможно в чистом CSS.

Мой источник, когда я искал точно такую ​​же вещь только сейчас: http://www.quirksmode.org/css/textoverflow.html (Quirksmode ftw!)

РЕДАКТИРОВАТЬ Если хорошие боги CSS будут реализовывать http://www.w3.org/TR/css-overflow-3/#max-lines, мы можем сделать это в чистом CSS, используя fragments(новый) и max-lines(новый). Также немного больше информации на http://css-tricks.com/line-clampin/

EDIT 2 WebKit / Blink имеет line-clamp: -webkit-line-clamp: 2поставит многоточие на 2-й строке.


9
Держать часы, но пока кажется, что богов еще нет с нами: caniuse.com/#search=max-lines
Даниэль

1
Как добиться вышеописанной возможности с помощью saas? @Rudie
Bhoomi Bhalani

144

Это должно работать в браузерах webkit :

overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;

1
Обратите внимание, что на момент написания этого комментария -webkit-line-зажим не учитывает видимость: скрыто. bugs.webkit.org/show_bug.cgi?id=45399
Кевин,

1
Эй, кажется хорошим, но у меня не работает. Он просто помещает '...' в заданный фиксатор строки, но не вырезает остальную часть текста (даже с
атрибутом

3
Возможно, вам придется добавить, overflow: hiddenчтобы это работало.
Роберт,

Это не будет работать в Firefox, webkit не поддерживается в движке gecko
ZetaPR

Это должен быть принятый ответ. Вам не нужно добавлять отступы внизу элемента, к которому вы примените это, так как вы можете получить оставшуюся часть текста, просматривающего.
Tr1stan

34

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

$("#multilinedElement").dotdotdot();

Вот jsFiddle .


Этот плагин также предоставляет множество других утилит, таких как добавление ссылок «читать дальше», он также может анализировать URI и HTML-разметку. Хорошая находка!
Мартин Андерссон

2
Я попробовал jQuery dotdotdot 1.7.3 для интернет-магазина, чтобы ограничить названия продуктов на странице категории сетки двумя строками. После тщательного тестирования мы решили не использовать этот плагин, потому что иногда после обновления смещения макет страницы категории нарушается. YMMV. В конце мы пошли с очень простым ванильным JS-решением: если clientHeight элемента имени продукта меньше его scrollHeight, обрежьте текст до заданной границы и добавьте «...». Иногда некоторые названия продуктов могут быть слишком короткими из-за предустановленной границы, но они очень стабильны.
thdoan

1
Восток для реализации и прекрасно работает. Спасибо!
Рэйчел С

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

1
Кроме того, это не будет работать, если текст изменяется динамически после загрузки :(
Dejell

34

Я обнаружил, что ответа Скипа было недостаточно, и ему overflowтоже нужен был стиль:

overflow: hidden;
text-overflow: ellipsis;
-webkit-line-clamp: 2;
display: -webkit-box;
-webkit-box-orient: vertical;

18

если кто-то использует SASS / SCSS и натыкается на этот вопрос - возможно, этот миксин мог бы помочь:

@mixin line-clamp($numLines : 1, $lineHeight: 1.412) {
  overflow: hidden;
  text-overflow: -o-ellipsis-lastline;
  text-overflow: ellipsis;
  display: block;
  /* autoprefixer: off */
  display: -webkit-box;
  -webkit-line-clamp: $numLines;
  -webkit-box-orient: vertical;
  max-height: $numLines * $lineHeight + unquote('em');
}

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


1
Использование меньшего количества , мне пришлось изменить , /* autoprefixer: off */чтобы в /*! autoprefixer: off */противном случае -webkit-box-orient: vertical;было получение удален после компиляции , что означает многоточие никогда не показывал
Nathan

18

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

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


    @supports (-webkit-line-clamp: 2) {
      overflow: hidden;
      text-overflow: ellipsis;
      white-space: initial;
      display: -webkit-box;
      -webkit-line-clamp: 2;
      -webkit-box-orient: vertical;
    }
  }

1
пробел: начальный; спас меня
Джеймс

10

Как жаль, что вы не можете заставить его работать над двумя строками! Было бы здорово, если бы элемент был отображаемым блоком и имел высоту 2em или что-то еще, а при переполнении текста показывался бы многоточие!

Для одного лайнера вы можете использовать:

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

Для нескольких строк, возможно, вы могли бы использовать Polyfill, такой как jQuery autoellipsis, который находится на github http://pvdspek.github.com/jquery.autoellipsis/


Этот плагин слишком тяжел для того, что он делает. Это 5 лет. Скорее используйте dotdotdotупомянутое в другом посте.
adi518

10

Я не профессионал JS, но я выяснил пару способов, как вы могли бы сделать это.

HTML:

<p id="truncate">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi elementum consequat tortor et euismod. Nam commodo consequat libero vel lobortis. Morbi ac nisi at leo vehicula consectetur.</p>

Затем с помощью jQuery вы усекаете его до определенного количества символов, но оставляете последнее слово следующим образом:

// Truncate but leave last word
var myTag = $('#truncate').text();
if (myTag.length > 100) {
  var truncated = myTag.trim().substring(0, 100).split(" ").slice(0, -1).join(" ") + "…";
  $('#truncate').text(truncated);
}

Результат выглядит так:

Lorem Ipsum Dolor Sit Amet, Concetetur Adipiscing Elit. Морби
элементум следователь пыток и…

Или вы можете просто обрезать его до определенного количества символов, например:

// Truncate to specific character
var myTag = $('#truncate').text();
if (myTag.length > 15) {
  var truncated = myTag.trim().substring(0, 100) + "…";
  $('#truncate').text(truncated);
}

Результат выглядит так:

Lorem Ipsum Dolor Sit Amet, Concetetur Adipiscing Elit. Morbi
Elementum следуют за мучителями и Euismod…

Надеюсь, это немного поможет.

Вот jsFiddle .


7

Вот хороший пример в чистом CSS.

.container{
  width: 200px;
}
.block-with-text {
  overflow: hidden;
  position: relative; 
  line-height: 1.2em;
  max-height: 3.6em;
  text-align: justify;  
  margin-right: -1em;
  padding-right: 1em;
}
.block-with-text+.block-with-text{
  margin-top:10px;
}
.block-with-text:before {
  content: '...';
  position: absolute;
  right: 0;
  bottom: 0;
}
.block-with-text:after {
  content: '';
  position: absolute;
  right: 0;
  width: 1em;
  height: 1em;
  margin-top: 0.2em;
  background: white;
}
<div class="container">


<div class="block-with-text">
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a
</div>

<div class="block-with-text">
Lorem Ipsum is simply dummy text of the printing and typesetting industry
</div>


<div class="block-with-text">
Lorem Ipsum is simply
</div>

</div>


Довольно хорошее решение, просто оно обрезает тексты, даже если вторая строка слишком коротка, чтобы ее обрезать, но все равно, большие пальцы
Amin

6

Я использовал JQuery-Condense-плагин , который выглядит так, как будто он может делать то, что вы хотите. Если нет, есть различные плагины, которые могут удовлетворить ваши потребности.

Изменить: Сделал вам демо - обратите внимание, что я связал jquery.condense.js на демо, который делает чудо, так что полная заслуга автора этого плагина :)


4

Это нестандартный CSS, который не описан в текущей версии CSS (Firefox не поддерживает его). Попробуйте вместо этого использовать JavaScript.


4

Чистый CSS способ обрезки многострочного текста с помощью многоточия

Отрегулируйте высоту текстового контейнера, чтобы контрольная строка была разбита на -webkit-line-зажим: 2;

.block-ellipsis {
  display: block;
  display: -webkit-box;
  max-width: 100%;
  height: 30px;
  margin: 0 auto;
  font-size: 14px;
  line-height: 1;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  text-overflow: ellipsis;
}

3

Я встречал эту проблему раньше, и нет чистого решения CSS

Вот почему я разработал небольшую библиотеку для решения этой проблемы (среди прочих). Библиотека предоставляет объекты для моделирования и рендеринга текста на уровне букв. Например, вы можете эмулировать переполнение текста: многоточие с произвольным пределом (необязательно одна строка)

Узнайте больше на http://www.samuelrossille.com/home/jstext.html для скриншота, учебника и ссылки для скачивания.


3

Если кто-то пытается заставить работать линейный зажим во flexbox , это немного сложнее, особенно если вы пытаетесь тестировать пытки с очень длинными словами. Единственные реальные различия в этом фрагменте кода заключаются min-width: 0;в элементе flex, содержащем усеченный текст, и word-wrap: break-word;. Подсказка к https://css-tricks.com/flexbox-truncated-text/ для понимания. Отказ от ответственности: это все еще webkit, насколько я знаю.

.flex-parent {
  display: flex;
}

.short-and-fixed {
  width: 30px;
  height: 30px;
  background: lightgreen;
}

.long-and-truncated {
  margin: 0 20px;
  flex: 1;
  min-width: 0;/* Important for long words! */
}

.long-and-truncated span {
  display: inline;
  -webkit-line-clamp: 3;
  text-overflow: ellipsis;
  overflow: hidden;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  word-wrap: break-word;/* Important for long words! */
}
<div class="flex-parent">
  <div class="flex-child short-and-fixed">
  </div>
  <div class="flex-child long-and-truncated">
    <span>asdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasd</span>
  </div>
  <div class="flex-child short-and-fixed">
  </div>
</div>

http://codepen.io/AlgeoMA/pen/JNvJdx (версия codepen)


1

Все ответы здесь неверны, в них отсутствует важная часть, высота

.container{
    width:200px;
    height:600px;
    background:red
}
.title {
        overflow: hidden;
        line-height: 20px;
        height: 40px;
        text-overflow: ellipsis;
        display: -webkit-box;
        -webkit-line-clamp: 2;
        -webkit-box-orient: vertical;
    }
<div class="container">
    <div class="title">this is a long text you cant cut it in half</div>
</div>

0

чистый метод css основан на -webkit-line-зажим, который работает на webkit:

@-webkit-keyframes ellipsis {/*for test*/
    0% { width: 622px }
    50% { width: 311px }
    100% { width: 622px }
}
.ellipsis {
    max-height: 40px;/* h*n */
    overflow: hidden;
    background: #eee;

    -webkit-animation: ellipsis ease 5s infinite;/*for test*/
    /**
    overflow: visible;
    /**/
}
.ellipsis .content {
    position: relative;
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-box-pack: center;
    font-size: 50px;/* w */
    line-height: 20px;/* line-height h */
    color: transparent;
    -webkit-line-clamp: 2;/* max row number n */
    vertical-align: top;
}
.ellipsis .text {
    display: inline;
    vertical-align: top;
    font-size: 14px;
    color: #000;
}
.ellipsis .overlay {
    position: absolute;
    top: 0;
    left: 50%;
    width: 100%;
    height: 100%;
    overflow: hidden;

    /**
    overflow: visible;
    left: 0;
    background: rgba(0,0,0,.5);
    /**/
}
.ellipsis .overlay:before {
    content: "";
    display: block;
    float: left;
    width: 50%;
    height: 100%;

    /**
    background: lightgreen;
    /**/
}
.ellipsis .placeholder {
    float: left;
    width: 50%;
    height: 40px;/* h*n */

    /**
    background: lightblue;
    /**/
}
.ellipsis .more {
    position: relative;
    top: -20px;/* -h */
    left: -50px;/* -w */
    float: left;
    color: #000;
    width: 50px;/* width of the .more w */
    height: 20px;/* h */
    font-size: 14px;

    /**
    top: 0;
    left: 0;
    background: orange;
    /**/
}
<div class='ellipsis'>
    <div class='content'>
        <div class='text'>text text text text text text text text text text text text text text text text text text text text text </div>
        <div class='overlay'>
            <div class='placeholder'></div>
            <div class='more'>...more</div>
        </div>
    </div>
</div>



-6

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

Я сделал это так:

  1. примите приблизительную длину символа (в данном случае 200) и перейдите к функции вместе с вашим текстом
  2. разделить пробелы, чтобы у вас была одна длинная строка
  3. используйте jQuery, чтобы получить первый "" пробел после длины вашего символа
  4. присоединиться к оставшимся ...

код:

truncate = function(description){
        return description.split('').slice(0, description.lastIndexOf(" ",200)).join('') + "...";           
}

вот скрипка - http://jsfiddle.net/GYsW6/1/

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.