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: можна лише у веб-кікіті
Євген

Найближчим до мене для досягнення цього було додавання псевдоелемента "after" для еліпсису та розташування його в рядку безпосередньо після елемента, що містить текст. Але еліпсис зникає, якщо текст елемента занадто довгий, тому вам доведеться якось обрізати текст, щоб зробити це надійним.
Джонатан

Відповіді:


105

Вимога до text-overflow: ellipsis;праці є версією однієї лінії white-space( pre, і nowrapт.д.). Що означає, що текст ніколи не дійде до другого рядка.

Ерго. Неможливо в чистому CSS.

Моє джерело, коли я саме зараз шукав саме те саме: http://www.quirksmode.org/css/textoverflow.html (Quirksmode ftw!)

EDIT Якщо добрі боги CSS будуть реалізовувати http://www.w3.org/TR/css-overflow-3/#max-lines, ми можемо це зробити в чистому CSS, використовуючи fragments(new) та max-lines(new). Також більше інформації про http://css-tricks.com/line-clampin/

EDIT 2 WebKit / Blink має line-clamp: -webkit-line-clamp: 2поставить еліпсис на другий рядок.


9
Слідкуйте, але поки що, здається, богів ще немає з нами: caniuse.com/#search=max-lines
Даніель

1
Як досягти вищезгаданої особливості, що стосується saas? @Rudie
Bhoomi Bhalani

144

Це має працювати в веб-браузерах :

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

1
Зауважте, що за цим коментарем, -webkit-line-clamp не поважає видимість: приховано. bugs.webkit.org/show_bug.cgi?id=45399
Кевін

1
Гей - здається приємно, але не працює для мене. Він просто ставить "..." при заданому затисканні рядка, але не скорочує решту тексту (навіть з attr з пробілом)
lemoid

3
Можливо, вам доведеться додати overflow: hiddenдля цього роботу.
Роберт

Це не працюватиме у Firefox, веб-кайт не підтримується в gecko engine
ZetaPR

Це має бути прийнятою відповіддю. Ви не хочете, щоб у нижній частині елемента було застосовано будь-який елемент, який ви застосуєте до цього, оскільки ви можете отримати решту тексту, що переглядається.
Tr1stan

34

Як вже відповіли інші, чистого CSS рішення не існує. Є плагін jQuery, який дуже простий у використанні, він називається dotdotdot . Він використовує ширину та висоту контейнера, щоб обчислити, чи потрібно його скорочувати та додавати еліпсис.

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

Ось jsFiddle .


Цей плагін також надає безліч інших утиліт, таких як додавання посилань "читати більше"; він також може аналізувати URI та розмітку HTML. Гарна знахідка!
Мартін Андерссон

2
Я спробував jQuery dotdotdot 1.7.3 для магазину електронної комерції, щоб обмежити назви продуктів на сторінці категорії сітки до двох рядків. Після ретельного тестування ми вирішили не користуватися цим плагіном, оскільки іноді після зміни оновлення макет сторінки сторінки буде порушений. YMMV. Зрештою, ми розробили дуже просте рішення JS ванілі: якщо клієнтський елемент елемента імені продукту менший за його scrollHeight, усікайте текст за попередньо встановленою межею та додайте "...". Іноді кілька назв виробів можуть бути трохи завеликими через задану межу, але це дуже стабільно.
туан

1
Easty для втілення та прекрасної роботи. Дякую!
Рейчел S

Хоча це працює добре, на жаль, він страждає від проблем продуктивності. Якщо ваш проект вимагає декількох еліпсис, розгляньте інший варіант. Крім того, ось цитата із сховища: "Оскільки її продуктивність не може бути покращена, цей плагін більше не підтримується активно".
боймаринов

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');
}

це лише додає еліпсис у веб-браузерах. відпочинок просто відрізає його.


1
Використовуючи Менше, мені довелося змінити, /* autoprefixer: off */щоб /*! autoprefixer: off */інакше не -webkit-box-orient: vertical;було видалено після компіляції, що означає, що еліпсис ніколи не показувався
Натан

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;
}

Для декількох рядків, можливо, ви можете використати поліфіл, такий як autoellipsis jQuery, який знаходиться на 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, consectetur adipiscing elit. Morbi
elementum posleat tortor et…

Або ви можете просто скоротити його до певного числа символів, як це:

// 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, consectetur adipiscing elit. Morbi
elementum posleat toror et 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>


Досить вдале рішення, просто воно обрізає тексти, навіть якщо другий рядок занадто короткий, щоб бути усіченим, але все-таки великі пальці вгору
Амін

6

Раніше я використовував плагін jQuery-condens , який виглядає так, що він може робити те, що ви хочете. Якщо ні, то є різні плагіни, які можуть відповідати вашим потребам.

Редагувати: Зробив вам демонстрацію - зауважте, що я пов’язав jquery.condense.js на демонстраційній версії, яка робить магію, тому повний кредит автору цього плагіна :)


4

Це нестандартний CSS, який не охоплюється в поточній версії CSS (Firefox не підтримує його). Спробуйте скористатися JavaScript.


4

Чистий css спосіб обрізки багаторядкового тексту з еліпсисом

Відрегулюйте висоту текстового контейнера, контрольну лінію для розриву на -webkit-line-clamp: 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

Якщо хтось намагається змусити затискати лінійку для роботи у флексі , це трохи складніше - особливо коли ви піддаєте тестуванню катування справді довгими словами. Єдині реальні відмінності цього фрагмента коду полягають min-width: 0;у елементі flex, що містить усічений текст, та word-wrap: break-word;. Підказка на https://css-tricks.com/flexbox-truncated-text/ для ознайомлення. Відмова: це все ще вебкіт лише наскільки я знаю.

.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-clamp, який працює на 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>


-1

Немає реального простого способу зробити це. Використовуйте бібліотеку Clamp.js .

$clamp(myHeader, {clamp: 3});

-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.