Ограничить длину текста до n строк, используя CSS - PullRequest
424 голосов
/ 13 октября 2010

Можно ли ограничить длину текста до "n" строк с помощью CSS (или обрезать ее при переполнении по вертикали).

text-overflow: ellipsis; работает только для 1-строчного текста.

оригинальный текст:

Ultrices natoque mus mattis, aliquam, авария в pellentesque
tincidunt elit purus lectus, Vel ut aliquet, elementum nunc
nunc rhoncus placerat urna!Сиди есть сед!Ut penatibus turpis
mus tincidunt!Dapibus sed aenean, magna sagittis, lorem Velit

желаемый результат (2 строки):

Ultrices natoque mus mattis, aliquam, авария в pellentesque
tincidunt elit puruslectus, vel ut aliquet, elementum ...

Ответы [ 12 ]

493 голосов
/ 18 декабря 2012

Есть способ, но он предназначен только для веб-наборов. Однако, если вы объедините это с line-height: X; и max-height: X*N;, оно также будет работать в других браузерах, только без эллипсов.

.giveMeEllipsis {
   overflow: hidden;
   text-overflow: ellipsis;
   display: -webkit-box;
   -webkit-box-orient: vertical;
   -webkit-line-clamp: N; /* number of lines to show */
   line-height: X;        /* fallback */
   max-height: X*N;       /* fallback */
}

Демо: http://jsfiddle.net/csYjC/1131/

85 голосов
/ 02 марта 2013

Вы можете сделать следующее:

.max-lines {
  display: block; /* or inline-block */
  text-overflow: ellipsis;
  word-wrap: break-word;
  overflow: hidden;
  max-height: 3.6em;
  line-height: 1.8em;
}

, где max-height: = line-height: × <number-of-lines> in em.

31 голосов
/ 17 ноября 2016

Кросс-браузерное решение

Эта проблема мучает нас всех в течение многих лет ...

Чтобы помочь во всех случаях, я выложил CSSтолько подход, и подход jQuery в случае, если cssats представляют проблему.

Вот решение CSS only , которое я придумала, оно работает при любых обстоятельствах, с несколькими незначительными оговорками.

Основы просты: он скрывает переполнение пролета и устанавливает максимальную высоту на основе высоты строки, как это предложил Евгений Ха.

Затем после содержащего псевдоклассаDiv, который помещает многоточие красиво.

Предостережения

Это решение всегда помещает многоточие, независимо от того, есть ли в нем необходимость.

Если последняя строка заканчивается конечным предложением, вы получите четыре точки ....

Вам нужно быть довольным выравниванием текста по правому краю.

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

код + фрагмент

jsfiddle

.text {
  position: relative;
  font-size: 14px;
  color: black;
  width: 250px; /* Could be anything you like. */
}

.text-concat {
  position: relative;
  display: inline-block;
  word-wrap: break-word;
  overflow: hidden;
  max-height: 3.6em; /* (Number of lines you want visible) * (line-height) */
  line-height: 1.2em;
  text-align:justify;
}

.text.ellipsis::after {
  content: "...";
  position: absolute;
  right: -12px; 
  bottom: 4px;
}

/* Right and bottom for the psudo class are px based on various factors, font-size etc... Tweak for your own needs. */
<div class="text ellipsis">
  <span class="text-concat">
Lorem ipsum dolor sit amet, nibh eleifend cu his, porro fugit mandamus no mea. Sit tale facete voluptatum ea, ad sumo altera scripta per, eius ullum feugait id duo. At nominavi pericula persecuti ius, sea at sonet tincidunt, cu posse facilisis eos. Aliquid philosophia contentiones id eos, per cu atqui option disputationi, no vis nobis vidisse. Eu has mentitum conclusionemque, primis deterruisset est in.

Virtute feugait ei vim. Commune honestatis accommodare pri ex. Ut est civibus accusam, pro principes conceptam ei, et duo case veniam. Partiendo concludaturque at duo. Ei eirmod verear consequuntur pri. Esse malis facilisis ex vix, cu hinc suavitate scriptorem pri.
  </span>
</div>

jQuery Approach

На мой взгляд, это лучшее решение, но не каждый может использовать JS.По сути, jQuery проверит любой элемент .text, и если число символов превышает заданное значение max var, оно обрежет все остальные и добавит многоточие.

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

1) Он перепишет внутренний html элементов .text.нужен ли или нет.2) Не проверяется, что внутренний html не имеет вложенных элементов - поэтому вы очень полагаетесь на автора, чтобы правильно использовать .text.

Отредактировано

Спасибо за улов @ markzzz

Код и фрагмент

jsfiddle

setTimeout(function()
{
	var max = 200;
  var tot, str;
  $('.text').each(function() {
  	str = String($(this).html());
  	tot = str.length;
    str = (tot <= max)
    	? str
      : str.substring(0,(max + 1))+"...";
    $(this).html(str);
  });
},500); // Delayed for example only.
.text {
  position: relative;
  font-size: 14px;
  color: black;
  font-family: sans-serif;
  width: 250px; /* Could be anything you like. */
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p class="text">
Old men tend to forget what thought was like in their youth; they forget the quickness of the mental jump, the daring of the youthful intuition, the agility of the fresh insight. They become accustomed to the more plodding varieties of reason, and because this is more than made up by the accumulation of experience, old men think themselves wiser than the young.
</p>

<p class="text">
Old men tend to forget what thought was like in their youth;
</p>
 <!-- Working Cross-browser Solution

This is a jQuery approach to limiting a body of text to n words, and end with an ellipsis -->
30 голосов
/ 13 октября 2010

Насколько я понимаю, это было бы возможно только при использовании height: (some em value); overflow: hidden, и даже тогда не было бы фантастического ... в конце.

Если это не вариант, я думаю, что это невозможно без предварительной обработки на стороне сервера (сложно, потому что поток текста невозможно предсказать надежно) или jQuery (возможно, но, вероятно, сложно).

15 голосов
/ 31 июля 2013

Решение от этой темы заключается в использовании плагина jquery dotdotdot . Не CSS-решение, но оно дает вам много возможностей для ссылок «читать дальше», динамического изменения размера и т. Д.

9 голосов
/ 19 мая 2017

следующий класс CSS помог мне в получении двухстрочного многоточия.

  .two-line-ellipsis {
        padding-left:2vw;
        text-overflow: ellipsis;
        overflow: hidden;
        width: 325px;
        line-height: 25px;
        display: -webkit-box;
        -webkit-line-clamp: 2;
        -webkit-box-orient: vertical;
        padding-top: 15px;
    }
5 голосов
/ 18 января 2011

В настоящее время вы не можете, но в будущем вы сможете использовать text-overflow:ellipis-lastline.В настоящее время он доступен с префиксом поставщика в Opera 10.60+: пример

3 голосов
/ 23 мая 2013

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

Разметка:

<td>
    <div class="fade-container" title="content goes here">
         content goes here
         <div class="fade">
    </div>
</td>

CSS:

.fade-container { /*two lines*/
    overflow: hidden;
    position: relative;
    line-height: 18px; 
    /* height must be a multiple of line-height for how many rows you want to show (height = line-height x rows) */
    height: 36px;
    -ms-hyphens: auto;
    -webkit-hyphens: auto;
    hyphens: auto;
    word-wrap: break-word;
}

.fade {
        position: absolute;
        top: 50%;/* only cover the last line. If this wrapped to 3 lines it would be 33% or the height of one line */
        right: 0;
        bottom: 0;
        width: 26px;
        background: linear-gradient(to right,  rgba(255,255,255,0) 0%,rgba(255,255,255,1) 100%);
}

сообщение в блоге: http://salzerdesign.com/blog/?p=453

пример страницы: http://salzerdesign.com/test/fade.html

0 голосов
/ 31 мая 2019

Если вы хотите сосредоточиться на каждом letter, вы можете сделать это, я имею в виду этот вопрос

function truncate(source, size) {
  return source.length > size ? source.slice(0, size - 1) + "…" : source;
}

var text = truncate('Truncate text to fit in 3 lines', 14);
console.log(text);

Если вы хотите сосредоточиться на каждом word, вы можете сделать это + пробел

const truncate = (title, limit = 14) => {  // 14 IS DEFAULT ARGUMENT 
    const newTitle = [];
    if (title.length > limit) {
        title.split(' ').reduce((acc, cur) => {
            if (acc + cur.length <= limit) {
                newTitle.push(cur);
            }
            return acc + cur.length;
        }, 0);

        return newTitle.join(' ') + '...'
    }
    return title;
}

var text = truncate('Truncate text to fit in 3 lines', 14);
console.log(text);

Если вы хотите сосредоточиться на каждом word, вы можете сделать это + без пробела

const truncate = (title, limit = 14) => {  // 14 IS DEFAULT ARGUMENT 
    const newTitle = [];
    if (title.length > limit) {
        Array.prototype.slice.call(title).reduce((acc, cur) => {
            if (acc + cur.length <= limit) {
                newTitle.push(cur);
            }
            return acc + cur.length;
        }, 0);

        return newTitle.join('') + '...'
    }
    return title;
}

var text = truncate('Truncate text to fit in 3 lines', 14);
console.log(text);
0 голосов
/ 16 сентября 2016

Базовый пример кода, научиться писать легко. Проверьте стиль CSS комментариев.

table tr {
  display: flex;
}
table tr td {
  /* start */
  display: inline-block; /* <- Prevent <tr> in a display css */
  text-overflow: ellipsis;
  white-space: nowrap;
  /* end */
  padding: 10px;
  width: 150px; /* Space size limit */
  border: 1px solid black;
  overflow: hidden;
}
<table>
  <tbody>
    <tr>
      <td>
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla egestas erat ut luctus posuere. Praesent et commodo eros. Vestibulum eu nisl vel dui ultrices ultricies vel in tellus.
      </td>
      <td>
        Praesent vitae tempus nulla. Donec vel porta velit. Fusce mattis enim ex. Mauris eu malesuada ante. Aenean id aliquet leo, nec ultricies tortor. Curabitur non mollis elit. Morbi euismod ante sit amet iaculis pharetra. Mauris id ultricies urna. Cras ut
        nisi dolor. Curabitur tellus erat, condimentum ac enim non, varius tempor nisi. Donec dapibus justo odio, sed consequat eros feugiat feugiat.
      </td>
      <td>
        Pellentesque mattis consequat ipsum sed sagittis. Pellentesque consectetur vestibulum odio, aliquet auctor ex elementum sed. Suspendisse porta massa nisl, quis molestie libero auctor varius. Ut erat nibh, fringilla sed ligula ut, iaculis interdum sapien.
        Ut dictum massa mi, sit amet interdum mi bibendum nec.
      </td>
    </tr>
    <tr>
      <td>
        Sed viverra massa laoreet urna dictum, et fringilla dui molestie. Duis porta, ligula ut venenatis pretium, sapien tellus blandit felis, non lobortis orci erat sed justo. Vivamus hendrerit, quam at iaculis vehicula, nibh nisi fermentum augue, at sagittis
        nibh dui et erat.
      </td>
      <td>
        Nullam mollis nulla justo, nec tincidunt urna suscipit non. Donec malesuada dolor non dolor interdum, id ultrices neque egestas. Integer ac ante sed magna gravida dapibus sit amet eu diam. Etiam dignissim est sit amet libero dapibus, in consequat est
        aliquet.
      </td>
      <td>
        Vestibulum mollis, dui eu eleifend tincidunt, erat eros tempor nibh, non finibus quam ante nec felis. Fusce egestas, orci in volutpat imperdiet, risus velit convallis sapien, sodales lobortis risus lectus id leo. Nunc vel diam vel nunc congue finibus.
        Vestibulum turpis tortor, pharetra sed ipsum eu, tincidunt imperdiet lorem. Donec rutrum purus at tincidunt sagittis. Quisque nec hendrerit justo.
      </td>
    </tr>
  </tbody>
</table>
...