Можно ли использовать переполнение текста: многоточие на многострочном тексте? - PullRequest
58 голосов
/ 04 июля 2011

У меня есть p -tag с конкретными width и height.Я хочу использовать text-overflow:ellipsis, чтобы получить ..., если текст в теге слишком длинный.Можно ли решить с помощью CSS на многострочном тексте?

Ответы [ 12 ]

37 голосов
/ 04 июля 2011

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

Я нашел text-overflow: -o-ellipsis-lastline, но работает только в Opera : http://people.opera.com/dstorey/text/text-overflow.html (зеркало: http://jsbin.com/exugux/)

Также существует аналогичное решение только для WebKit: http://dropshado.ws/post/1015351370/webkit-line-clamp

15 голосов
/ 10 октября 2013

Вы можете сделать это с помощью CSS.Он работает только в браузерах webkit, но имеет запасной вариант для остальных.

use:

display: -webkit-box;
-webkit-line-clamp: $lines-to-show;
-webkit-box-orient: vertical;
height: $font-size*$line-height*$lines-to-show; /* Fallback for non-webkit */

вместе с:

max-width: $maxwidth;
overflow: hidden;
text-overflow: ellipsis;

Вот скрипка: демо

12 голосов
/ 19 июня 2013

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

Техника включает в себя 4 элемента:

  • Контейнер уровня блока, который определяет максимальную высоту содержимого
  • Встроенная оболочка для текстового содержимого
  • Многоточие, содержащееся во встроенной оболочке
  • Элемент 'fill', также внутри встроенной оболочки, который закрывает многоточие, когда текстовое содержимое не превышает размеры контейнера

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

Структура HTML

<!-- The block level container. `clamped-2` for 2 lines height -->
<p class="clamped clamped-2">
  <!-- The inline wrapper -->
  <span class="text">
    Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy
    nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. 
    Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit
    lobortis nisl ut aliquip ex ea commodo consequat.
    <!-- The ellipsis, which can contain anything you want - 
         (a 'more' link, for example) -->
    <span class="ellipsis">
      &#133;
    </span>
    <!-- The fill, which covers the ellipsis when the text doesn't overflow -->
    <span class="fill"></span>
  </span>
</p>

CSS

body {
  /* We need a solid background or background-position: fixed */
  background: #fff;
  /* You'll need to know the line height to clamp on line breaks */
  line-height: 1.5;
}

.clamped {
  overflow: hidden;
  position: relative;
}

/* Clamp to 2 lines, ie line-height x 2:
   Obviously any number of these classes can be written as needed
 */
.clamped-2 {
  max-height: 3em;
}

/* The ellipsis is always at the bottom right of the container,
   but when the text doesn't reach the bottom right...
 */
.clamped .ellipsis {
  background: #fff;
  bottom: 0;
  position: absolute;
  right: 0;
}

/* ...It's obscured by the fill, which is positioned at the bottom right 
   of the text, and occupies any remaining space.
 */
.clamped .fill {
  background: #fff; 
  height: 100%;
  position: absolute;
  width: 100%;
}

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

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

5 голосов
/ 22 августа 2012

Я написал функцию javascript для решения проблемы многострочного многоточия

function ellipsizeTextBox(id) {

    var el = document.getElementById(id);
    var keep = el.innerHTML;
    while(el.scrollHeight > el.offsetHeight) {
        el.innerHTML = keep;
        el.innerHTML = el.innerHTML.substring(0, el.innerHTML.length-1);
        keep = el.innerHTML;
        el.innerHTML = el.innerHTML + "...";
    }   
}

надеюсь, это поможет!

4 голосов
/ 26 августа 2016

Я нашел решение для многострочного кросс-браузерного чистого многоточия CSS. Я перепробовал множество решений, и только это сработало только с использованием CSS. У меня был div с динамической шириной, и я должен был установить высоту.

Вот ссылка: http://hackingui.com/front-end/a-pure-css-solution-for-multiline-text-truncation/

3 голосов
/ 27 июля 2014

Модифицирована функция пользователем1152475 , поэтому она работает слово за словом (разделенный пробелом), а не символ за символом.

function ellipsizeTextBox(id) {
    var el = document.getElementById(id);
    var wordArray = el.innerHTML.split(' ');
    while(el.scrollHeight > el.offsetHeight) {
        wordArray.pop();
        el.innerHTML = wordArray.join(' ')  + '...';
    }   
}

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

1 голос
/ 17 мая 2012

HTML не предлагает такой возможности, и это очень расстраивает.

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

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

0 голосов
/ 25 января 2017

.minHeightg{
height:5.6rem !important;
  width:20%;
}
.productOverflow
{
     overflow: hidden;
   text-overflow: ellipsis;
   display: -webkit-box;
   line-height: 16px;     /* fallback */
   max-height: 3.6rem;      /* fallback */
   -webkit-line-clamp: 3; /* number of lines to show */
   -webkit-box-orient: vertical;
}



/*firefox*/
@-moz-document url-prefix() {
   
   .productOverflow
{
   overflow: hidden;
   text-overflow:ellipsis;
   display: -moz-box !important;
   
   line-height: 16px;     /* fallback */
   max-height: 3.6rem;      /* fallback */
   -moz-line-clamp: 3; /* number of lines to show */
   -moz-box-orient: vertical;
}
<div class="minHeightg">
    <p class="productOverflow">Some quick example text to build on the card title .</p>
    </div>
0 голосов
/ 26 августа 2016

Я поработал с большинством этих решений, и вам лучше всего использовать плагин solid зажим.js . Он работает во всех средах и имеет минимальный размер (3К).

0 голосов
/ 02 августа 2016

на всякий случай, если кто-то сюда доберется, может это решение для вас? чистый CSS кросс-браузер. http://codepen.io/issactomatotan/pen/LkJbjO

<div style="position:relative;width:100%;max-height:40px;overflow:hidden;font-size:16px;line-height:20px;border:1px solid red;">
<p class="pp">asd asdasd asd asd asdasd a asdasd a sdasd asdasd asdaasd asd asd d asasas das dasdd asddasd asdasd asdsdasd asd<span class="bb"></span></p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...