Еліпсис переповнення тексту у двох рядках


117

Я знаю, що ви можете використовувати комбінацію правил CSS, щоб закінчити текст еліпсісом (...), коли настав час переповнювати (виходити з меж батьків).

Чи можливо (не соромтеся просто сказати, ні) досягти такого ж ефекту, але нехай текст обертається на більш ніж один рядок?

Ось демонстрація .

div {
  width: 300px; 
  height: 42px; 
  overflow: hidden; 
  text-overflow: ellipsis; 
  white-space: nowrap;
}

Як бачите, текст закінчується еліпсисом, коли він виходить ширшим за ширину діва. Однак, все ще є достатньо місця, щоб текст перетворився на другий рядок і продовжувався. Це переривається тим white-space: nowrap, що потрібно для роботи еліпсису.

Якісь ідеї?

PS: Жодних рішень JS, чистий CSS, якщо це можливо.


Що визначає "є простір"? Чи все, включаючи висоту шрифту, у встановлених пікселях? Що буде, якщо кінцевий користувач збільшить розмір шрифту у своєму браузері?
Джоел Етертон


@JoelEtherton Я вважаю, що браузер повинен вирішити, і так, у моєму випадку все в пікселях.
Тоні Богданов

Це може бути хорошим рішенням: stackoverflow.com/questions/6222616/…
плющ

Це дійсно приємне прочитання hackingui.com/front-end/…
anandharshan

Відповіді:


31

Я не впевнений , якщо ви бачили ЦЕ , але відмінно CSS-Tricks.com Кріса Coyier, розміщеної посилання на цю деякий час назад , і це чистий CSS рішення , яке виконує саме те , що ви шукаєте.

(Клацніть для перегляду на CodePen)

HTML:

<div class="ellipsis">
    <div>
        <p>
            Call me Ishmael. Some years ago – never mind how long precisely – having
            little or no money in my purse, and nothing particular to interest me on
            shore, I thought I would sail about a little and see the watery part of the
            world. It is a way I have of driving off the spleen, and regulating the
            circulation. Whenever I find myself growing grim about the mouth; whenever it
            is a damp, drizzly November in my soul; whenever I find myself involuntarily
            pausing before coffin warehouses, and bringing up the rear of every funeral I
            meet; and especially whenever my hypos get such an upper hand of me, that it
            requires a strong moral principle to prevent me from deliberately stepping
            into the street, and methodically knocking people's hats off – then, I account
            it high time to get to sea as soon as I can.
        </p>
    </div>
</div>

CSS:

html,body,p {
    margin: 0;
    padding: 0;
    font-family: sans-serif;
}
.ellipsis {
    overflow: hidden;
    height: 200px;
    line-height: 25px;
    margin: 20px;
    border: 5px solid #AAA;
}
.ellipsis:before {
    content: "";
    float: left;
    width: 5px;
    height: 200px;
}
.ellipsis > *:first-child {
    float: right;
    width: 100%;
    margin-left: -5px;
}
.ellipsis:after {
    content: "\02026";
    box-sizing: content-box;
    -webkit-box-sizing: content-box;
    -moz-box-sizing: content-box;
    float: right;
    position: relative;
    top: -25px;
    left: 100%;
    width: 3em;
    margin-left: -3em;
    padding-right: 5px;
    text-align: right;
    background-size: 100% 100%;/* 512x1 image,gradient for IE9. Transparent at 0% -> white at 50% -> white at 100%.*/
    background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAABCAMAAACfZeZEAAAABGdBTUEAALGPC/xhBQAAAwBQTFRF////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wDWRdwAAAP90Uk5TgsRjMZXhS30YrvDUP3Emow1YibnM9+ggOZxrBtpRRo94gxItwLOoX/vsHdA2yGgL8+TdKUK8VFufmHSGgAQWJNc9tk+rb5KMCA8aM0iwpWV6dwP9+fXuFerm3yMs0jDOysY8wr5FTldeoWKabgEJ8RATG+IeIdsn2NUqLjQ3OgBDumC3SbRMsVKsValZplydZpZpbJOQco2KdYeEe36BDAL8/vgHBfr2CvTyDu8R7esU6RcZ5ecc4+Af3iLcJSjZ1ivT0S/PMs3LNck4x8U7wz7Bv0G9RLtHuEq1TbJQr1OtVqqnWqRdoqBhnmSbZ5mXapRtcJGOc4t2eYiFfH9AS7qYlgAAARlJREFUKM9jqK9fEGS7VNrDI2+F/nyB1Z4Fa5UKN4TbbeLY7FW0Tatkp3jp7mj7vXzl+4yrDsYoVx+JYz7mXXNSp/a0RN25JMcLPP8umzRcTZW77tNyk63tdprzXdmO+2ZdD9MFe56Y9z3LUG96mcX02n/CW71JH6Qmf8px/cw77ZvVzB+BCj8D5vxhn/vXZh6D4uzf1rN+Cc347j79q/zUL25TPrJMfG/5LvuNZP8rixeZz/mf+vU+Vut+5NL5gPOeb/sd1dZbTs03hBuvmV5JuaRyMfk849nEM7qnEk6IHI8/qn049hB35QGHiv0yZXuMdkXtYC3ebrglcqvYxoj1muvC1nDlrzJYGbpcdHHIMo2FwYv+j3QAAOBSfkZYITwUAAAAAElFTkSuQmCC);
    background: -webkit-gradient(linear,left top,right top,
        from(rgba(255,255,255,0)),to(white),color-stop(50%,white));
        background: -moz-linear-gradient(to right,rgba(255,255,255,0),white 50%,white);
        background: -o-linear-gradient(to right,rgba(255,255,255,0),white 50%,white);
        background: -ms-linear-gradient(to right,rgba(255,255,255,0),white 50%,white);
        background: linear-gradient(to right,rgba(255,255,255,0),white 50%,white);
    }

Звичайно, бути чистим рішенням CSS означає, що воно теж досить складне, але воно працює чисто і елегантно. Я вважаю, що Javascript не підлягає сумніву, оскільки це набагато простіше досягти (і, можливо, більш зруйновано) за допомогою Javascript.

В якості додаткового бонусу є завантажений zip-файл повного процесу (якщо ви хочете зрозуміти це і все), а також файл SASS mixin, щоб ви могли легко скласти його у свій процес.

Сподіваюся, це допомагає!

http://www.mobify.com/blog/multiline-ellipsis-in-pure-css/


Я просто натиснув ваше посилання Codepen на телефоні Android, і воно працювало в Firefox. На якій платформі / браузері він не працює?
dashard

uploady.com/#!/download/kAwBXv1CqXg/PU68wrP6QzGgydlS Я використовую хром і в попередньому перегляді немає еліпсису. Продовжуйте додавати рядки тексту, нічого не відбувається. Через скільки ліній почне показувати еліпсис?
coding_idiot

У посиланні для завантаження, яке ви опублікували, текст явно ще не перелив контейнер. Тексту повинно бути занадто багато, щоб фіксований контейнер відображався до появи еліпсів. Просто продовжуйте додавати текст, щоб побачити ефект.
dashard

@ MarcosPérezGude - мене не дивує. На це згадується >> "Звичайно, бути чистим рішенням CSS означає, що це теж досить складне ..." <<
dashard

137

Легкі властивості CSS можуть зробити трюк. Далі йде трилінійний еліпсис.

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

15
це не працює у firefox. лише хром, сафарі та опера
anyavacy

1
За словами каніуси , він говорить, що "навряд чи інші веб-переглядачі підтримуватимуть властивість як є". Тож голови вгору.
Матан Бобі

гладкий чувак .. дуже корисно
Валентино Перейра

4
Працює gr8 і у firefox
Nisharg Shah

4
Зараз, здається, є велика підтримка: caniuse.com/#search=line-clamp
Жоао

52

Погляньте на цю чисту версію css: http://codepen.io/martinwolf/pen/qlFdp

display: -webkit-box;
max-width: 400px;
height: 109.2px;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
line-height: 1.625;

7
Це дійсно круто, дуже погано, це лише веб-кайт. Ось цікава стаття з цього питання: css-tricks.com/line-clampin
Тоні Богданов

Чому ви оголошуєте два text-overflowі displayправила?
j08691

Великий WoooW. Я ніколи не бачив раніше затиску рядків
Майк Арон

1
Просто FYI, це добре працює і в Firefox в наші дні. Чудове рішення!
Athoxx

лише 1 запитання, коли у мене є один рядок або два рядки тексту, я хочу, щоб їх було по центру, як це зробити, якщо я додаю
флекс-

10

Css нижче повинен зробити трюк.

Після другого рядка текст буде містити ...

line-height: 1em;
max-height: 2em;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;

це працювало чудово, але мені довелося додатиoverflow:hidden
timhysniu

3

Використовуйте це, якщо вище не працює

 display: block;
 display: -webkit-box;
 max-width: 100%;
 margin: 0 auto;
 -webkit-line-clamp: 2;
 /* autoprefixer: off */
 -webkit-box-orient: vertical;
 /* autoprefixer: on */
 overflow: hidden;
 text-overflow: ellipsis;

2

Моє рішення повторно використовує рішення amcdnl, але мій запасний варіант полягає у використанні висоти для текстового контейнера:

.my-caption h4 {
    display: -webkit-box;
    margin: 0 auto;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
    text-overflow: ellipsis;

    height: 40px;/* Fallback for non-webkit */
}

-webkit-line-clampне працює для IE11, Edge або Firefox.
Гаʀʀʏ

@Garry, ти маєш рацію, на той час тобі знадобився б виправлення JS, але зараз це працює чудово. caniuse.com/#search=webkit-line-clamp
VincentPerrin.com

1

Базуючись на відповіді, яку я бачив у stackoveflow, я створив цей МІННІЙ міксин ( використовуйте це посилання для створення CSS-коду ):

.max-lines(@lines: 3; @line-height: 1.2) {
  overflow: hidden;
  text-overflow: ellipsis;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: @lines;
  line-height: @line-height;
  max-height: @line-height * @lines;
}

Використання

.example-1 {
    .max-lines();
}

.example-2 {
    .max-lines(3);
}

.example-3 {
    .max-lines(3, 1.5);
}

1

Здається більш елегантним поєднання двох класів. Ви можете скинути two-linesклас, якщо потрібно переглянути лише один рядок:

.ellipse {
          white-space: nowrap;
          display:inline-block;
          overflow: hidden;
          text-overflow: ellipsis;
       }
      .two-lines {
          -webkit-line-clamp: 2;
          display: -webkit-box;
          -webkit-box-orient: vertical;
          white-space: normal;
      }
      .width{
          width:100px;
          border:1px solid hotpink;
      }
        <span class='width ellipse'>
          some texts some texts some texts some texts some texts some texts some texts
       </span>

       <span class='width ellipse two-lines'>
          some texts some texts some texts some texts some texts some texts some texts
       </span>


1

Обмеження кількох рядків буде працювати майже у всіх браузерах, але еліпсис (3 крапки) не відображатиметься у Firefox & IE. Демо - http://jsfiddle.net/ahzo4b91/1/

div {
width: 300px;
height: 2.8em;
line-height: 1.4em;
display: flex;
-webkit-line-clamp: 2;
display: -webkit-box;
-webkit-box-orient: vertical;
overflow: hidden; 
}

0
          text-overflow: ellipsis;
          overflow: hidden;
          text-overflow: ellipsis;
          display: -webkit-box;
          line-height: 36px;
          max-height: 18px;
          -webkit-line-clamp: 2;
          -webkit-box-orient: vertical;

Я знайшов комбінацію як лінійного затиску, так і висоти ліній: D


0

У моєму кутовому додатку для мене працював такий стиль, щоб досягти еліпсису над переливом тексту у другому рядку :

 <div style="height:45px; overflow: hidden; position: relative;">
     <span class=" block h6 font-semibold clear" style="overflow: hidden;
        text-overflow: ellipsis;
        display: -webkit-box; 
        line-height: 20px; /* fallback */
        max-height: 40px; /* fallback */
        -webkit-line-clamp: 2; /* number of lines to show */
        -webkit-box-orient: vertical;">
        {{ event?.name}} </span>
 </div>

Сподіваюся, це комусь допоможе.


0

Для тих, хто працює у scss , потрібно додати!autoprefixer до початку, щоб він був збережений для postcss:

Я зіткнувся з цим питанням, тому розміщую його тут

line-height: 1em;
max-height: 2em;
display: -webkit-box;
/*! autoprefixer: off */
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;

Довідково


0

Ви можете використовувати розчинений ефект замість еліпсису, чистий CSS і виглядає більш професійно:

    <div style="width: 293px; height:48px; overflow: hidden; ">
        More than two line of text goes here-More than two line of text goes here
    </div>
    <div style="position: relative; top: -24px; width: 293px; height:24px; 
             background: linear-gradient(90deg, rgba(255,0,0,0) 40%, rgba(255,255,255,1) 99%);">
    </div>

Тут я припустив, що ваш колір тла - білий.


-1

Це тотальний злом, але він працює:

http://jsfiddle.net/2wPNg/

div {
    width: 30%;
    float: left;
    margin-right: 2%;
    height: 94px;
    overflow: hidden;
    position: relative;
}

div:after {
     display: block;
      content: '...';
      width: 1em;
  height: 1.5em;
  background: #fff;
  position: absolute;
  bottom: -6px;
  right: 0;
    }

У нього є проблеми .... він може незручно відрізати лист, і він, ймовірно, матиме якісь дивні результати на чуйному сайті.


5
Це не буде правильним рішенням, оскільки якщо вміст менший, то в кінці кінців додається "...". Fiddle
Sachin

-1

Ось простий скрипт для управління еліпсисом за допомогою jQuery. Він перевіряє реальну висоту елемента і створює прихований початковий вузол і усічений вузол. Коли користувач натискає кнопку, він перемикається між двома версіями.

Однією з великих переваг є те, що «еліпсис» знаходиться поруч із останнім словом, як і очікувалося.

Якщо ви використовуєте чисті CSS-рішення, три крапки здаються далекими від останнього слова.

function manageShortMessages() {

        $('.myLongVerticalText').each(function () {
            if ($(this)[0].scrollHeight > $(this)[0].clientHeight)
                $(this).addClass('ellipsis short');
        });

        $('.myLongVerticalText.ellipsis').each(function () {
            var original = $(this).clone().addClass('original notruncation').removeClass('short').hide();
            $(this).after(original);

            //debugger;
            var shortText = '';
            shortText = $(this).html().trim().substring(0, 60) + '...';
            $(this).html(shortText);
        });
        
        $('.myLongVerticalText.ellipsis').click(function () {
            $(this).hide();

            if ($(this).hasClass('original'))
            {
                $(this).parent().find('.short').show();
            }
            else
            {
                $(this).parent().find('.original').show();
            }
        });
    }
	
  manageShortMessages();
div {
 border:1px solid red;
 margin:10px;
}

div.myLongVerticalText {
  height:30px;
  width:450px;
}

div.myLongVerticalText.ellipsis {
 cursor:pointer;
}

div.myLongVerticalText.original {
  display:inline-block;
  height:inherit;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<body>
<div class="myLongVerticalText">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse sit amet quam hendrerit, sagittis augue vel, placerat erat. Aliquam varius porta posuere. Aliquam erat volutpat. Phasellus ullamcorper malesuada bibendum. Etiam fringilla, massa vitae pulvinar vehicula, augue orci mollis lorem, laoreet viverra massa eros id est. Phasellus suscipit pulvinar consectetur. Proin dignissim egestas erat at feugiat. Aenean eu consectetur erat. Nullam condimentum turpis eu tristique malesuada.

Aenean sagittis ex sagittis ullamcorper auctor. Sed varius commodo dui, nec consectetur ante condimentum et. Donec nec blandit mi, vitae blandit elit. Phasellus efficitur ornare est facilisis commodo. Donec convallis nunc sed mauris vehicula, non faucibus neque vehicula. Donec scelerisque luctus dui eu commodo. Integer eu quam sit amet dui tincidunt pharetra eu ac quam. Quisque tempus pellentesque hendrerit. Sed orci quam, posuere eu feugiat at, congue sed felis. In ut lectus gravida, volutpat urna vitae, cursus justo. Nam suscipit est ac accumsan consectetur. Donec rhoncus placerat metus, ut elementum massa facilisis eget. Donec at arcu ac magna viverra tincidunt.
</div>


<div class="myLongVerticalText">
One Line Lorem ipsum dolor sit amet.  
</div>
</body>


Якщо ви підтримали це рішення, поясніть, будь ласка, чому тут, я буду вдячний.
Маттео Конта

1
ОП попросило рішення CSS, і ви запропонували jQuery?
dashard

Я пропустив, що це сувора вимога відсутності javascript, в моєму випадку чисте рішення CSS представило проблеми з рендерінгом, рішення jQuery дало мені більше контролю над остаточним візуалізацією та положенням еліпсису.
Маттео Конта

Абсолютно згідний. У своїй відповіді я зазначив, що цього досягти нескінченно легше.
dashard

-3

Не впевнені, яка ваша мета, але чи хочете ви, щоб текст надходив на другий рядок?

Ось ваш jsFiddle: http://jsfiddle.net/8kvWX/4/ щойно видалив таке:

     white-space:nowrap;  

Я не впевнений, це те, що ви шукаєте чи ні.

З повагою,

Мей


1
Він хоче еліпсису в кінці другого рядка, що не так просто зробити без JavaScript ...
Marc Audet

@MarcAudet саме :)
Тоні Богданов

Правильно, як я знайшов іншу людину з проханням мати рядки на другому рядку та його CSS був майже таким же, як і ваш, але натомість клас вказував на ul тег. У всякому разі, вибач Тоні. Я перегляну його ще раз і оновлю свою відповідь, якщо я досягну успіху.
Mee

добре, я думаю, що найкращим рішенням є рішення від @Itay Gal. Наскільки я бачив, що один працює.
Mee
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.