Переполнение текста многоточием на двух строках


119

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

Возможно ли (не стесняйтесь сказать «нет») добиться того же эффекта, но позволить тексту переноситься более чем на одну строку?

Вот демо .

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

Как видите, текст заканчивается многоточием, когда он выходит за пределы ширины блока div. Тем не менее, все еще достаточно места для текста, чтобы обернуть его на второй строке и продолжить. Это прерывается white-space: nowrap, что необходимо для работы многоточия.

Любые идеи?

PS: Никаких JS-решений, по возможности чистый CSS.


Что определяет «есть пространство»? Все ли, включая высоту шрифта, заданы в пикселях? Что произойдет, если конечный пользователь увеличит размер шрифта в своем браузере?
Джоэл Этертон 09


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

Это может быть хорошим решением: stackoverflow.com/questions/6222616/…
ivy

Это действительно хорошее чтение hackingui.com/front-end/…
anandharshan

Ответы:


31

Я не уверен, видели ли вы ЭТО , но отличный CSS-Tricks.com Криса Койера недавно опубликовал ссылку на это, и это чистое решение 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, чтобы вы могли легко включить его в свой процесс.

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

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


Я просто щелкнул ссылку Codepen на телефоне Android, и она сработала в Firefox. На какой платформе / браузере он не работает?
dashard

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

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

@ MarcosPérezGude - меня не удивляет. Ссылаясь на это с помощью >> «Конечно, решение на чистом CSS означает, что оно также довольно сложное…» <<
dashard

140

Простые свойства CSS могут помочь. Следующее - для трехстрочного многоточия.

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

15
это не работает в firefox. только хром, сафари и опера
anyavacy

1
согласно caniuse , в нем говорится, что «маловероятно, что другие браузеры будут поддерживать свойство как есть». Так что, пожалуйста.
Матан Боби

гладкий чувак .. очень полезно
Валентино Перейра

4
Gr8

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
Это действительно круто, жаль, что это только webkit. Вот интересная статья по этому поводу: css-tricks.com/line-clampin
Тони Богданов

Почему вы объявляете два text-overflowи displayправила?
j08691 03

Большой WoooW. Я никогда раньше не видел зажима линии
Майк Арон,

1
К вашему сведению, сейчас это прекрасно работает и в Firefox. Отличное решение!
Athoxx

только 1 вопрос, когда у меня есть одна или две строки текста, я хочу, чтобы они были выровнены по центру, как мне это сделать, если я добавлю гибкий дисплей, я потеряю многоточие, похоже, это работает, только если установлено поле display: -webkit
PirateApp

10

Css ниже должен помочь.

После второй строки текст будет содержать ...

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

это сработало хорошо, но мне пришлось добавитьoverflow:hidden
timhysniu

4

Используйте это, если выше не работает

 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.
Gaʀʀʏ

@Garry, вы правы, в то время вам нужно было исправить JS, но теперь он работает нормально. caniuse.com/#search=webkit-line-clamp
VincentPerrin.com

1

Основываясь на ответе, который я видел в stackoveflow, я создал этот миксин LESS ( используйте эту ссылку для генерации кода 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; 
}

1

Для тех, кто работает в scss , вам нужно добавить !autoprefixerв начало комментария, чтобы он сохранился для postcss:

Я столкнулся с этой проблемой, поэтому разместил ее здесь

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

Ссылка


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

В моем приложении angular у меня работал следующий стиль, чтобы добиться многоточия при переполнении текста во второй строке :

 <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

Вы можете использовать эффект растворения вместо многоточия, чистый 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: jsfiddle.net/2wPNg
Сачин

-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
OP попросил решение CSS, а вы предложили jQuery?
dashard 07

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

Абсолютно согласен. В своем ответе я заметил, что с помощью JS этого добиться намного проще.
dashard 08

-3

Не знаете, какова ваша цель, но хотите ли вы, чтобы текст был во второй строке?

Вот ваш jsFiddle: http://jsfiddle.net/8kvWX/4/ только что удалил следующее:

     white-space:nowrap;  

Я не уверен, что вы это ищете или нет.

С Уважением,

Ми


1
Он хочет, чтобы в конце второй строки было многоточие, что не так-то просто сделать без JavaScript ...
Марк Одет

@MarcAudet точно :)
Тони Богданов

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

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