Textüberlauf-Auslassungspunkte in zwei Zeilen

117

Ich weiß, dass Sie eine Kombination von CSS-Regeln verwenden können, um Text mit Auslassungspunkten (...) zu beenden, wenn es Zeit zum Überlaufen ist (außerhalb der Grenzen der Eltern).

Ist es möglich (Sie können einfach Nein sagen), den gleichen Effekt zu erzielen, aber lassen Sie den Text in mehr als einer Zeile umbrechen?

Hier ist eine Demo .

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

Wie Sie sehen können, endet der Text mit Auslassungspunkten, wenn er breiter als die Breite des Divs ist. Es ist jedoch noch genügend Platz für den Text vorhanden, um ihn in eine zweite Zeile zu setzen und fortzufahren. Dies wird durch unterbrochen white-space: nowrap, was erforderlich ist, damit die Auslassungspunkte funktionieren.

Irgendwelche Ideen?

PS: Keine JS-Lösungen, wenn möglich reines CSS.

Tony Bogdanov
quelle
Was bestimmt "es gibt Raum"? Ist alles einschließlich der Schrifthöhe in festgelegten Pixeln? Was würde passieren, wenn ein Endbenutzer die Schriftgröße in seinem Browser erhöhen würde?
Joel Etherton
@JoelEtherton Ich nehme an, das muss der Browser entscheiden und ja, in meinem Fall ist alles in Pixel.
Tony Bogdanov
Dies kann eine gute Lösung sein: stackoverflow.com/questions/6222616/…
Ivy
Dies ist eine wirklich schöne Lektüre hackingui.com/front-end/…
anandharshan

Antworten:

31

Ich bin mir nicht sicher, ob Sie DIESES gesehen haben , aber Chris Coyier ausgezeichnete CSS-Tricks.com hat einen Link zu diesem einer Weile zurück , und es ist eine reine CSS - Lösung , die genau erfüllt , was Sie suchen.

(Klicken, um auf CodePen anzuzeigen)

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

Eine reine CSS-Lösung zu sein bedeutet natürlich, dass sie auch ziemlich kompliziert ist, aber sie funktioniert sauber und elegant. Ich gehe davon aus, dass Javascript nicht in Frage kommt, da dies mit Javascript viel einfacher zu erreichen (und wahrscheinlich abbaubarer) ist.

Als zusätzlichen Bonus gibt es eine herunterladbare Zip-Datei des gesamten Prozesses (wenn Sie alles verstehen wollen), aber auch eine SASS-Mixin-Datei, damit Sie sie einfach in Ihren Prozess einbinden können.

Hoffe das hilft!

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

dashard
quelle
Ich habe gerade auf einem Android-Handy auf Ihren Codepen-Link geklickt und es hat in Firefox funktioniert. Auf welcher Plattform / in welchem ​​Browser funktioniert es nicht?
dashard
uploady.com/#!/download/kAwBXv1CqXg/PU68wrP6QzGgydlS Ich verwende Chrome und die Vorschau enthält keine Auslassungspunkte. Fügen Sie weitere Textzeilen hinzu, es passiert nichts. Nach wie vielen Zeilen wird die Ellipse angezeigt?
Coding_idiot
In dem von Ihnen geposteten Upload-Link war der Text eindeutig noch nicht über den Container gelaufen. Der Text muss zu groß sein, damit der feste Container angezeigt werden kann, bevor die Ellipsen angezeigt werden. Fügen Sie einfach weiter Text hinzu, um den Effekt zu sehen.
dashard
@ MarcosPérezGude - überrascht mich nicht. Darauf angespielt mit >> "Natürlich bedeutet eine reine CSS-Lösung, dass es auch eine ziemlich komplizierte ist ..." <<
dashard
135

Einfache CSS-Eigenschaften können den Trick machen. Das Folgende gilt für eine dreizeilige Ellipse.

display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
pxthxk
quelle
15
Dies funktioniert nicht in Firefox. nur Chrom, Safari und Oper
Anyavacy
1
Laut caniuse heißt es: "Es ist unwahrscheinlich, dass andere Browser die Eigenschaft unverändert unterstützen." Also Kopf hoch.
Matan Bobi
glatter Kerl .. sehr hilfreich
Valentino Pereira
4
Funktioniert gr8 auch in Firefox
Nisharg Shah
4
Scheint jetzt großartige Unterstützung zu haben: caniuse.com/#search=line-clamp
Joao
51

Schauen Sie sich diese reine CSS-Version an: 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;
amcdnl
quelle
7
Das ist wirklich cool, schade, dass es nur ein Webkit ist. Hier ist ein interessanter Artikel zu diesem Thema: css-tricks.com/line-clampin
Tony Bogdanov
Warum deklarierst du zwei text-overflowund displayRegeln?
j08691
Ein großes WoooW. Ich habe noch nie zuvor Line-Clamp gesehen
Mike Aron
1
Nur zu Ihrer Information, dies funktioniert heutzutage auch in Firefox einwandfrei. Tolle Lösung!
Athoxx
Nur eine Frage: Wenn ich eine oder zwei Textzeilen habe, die zentriert werden sollen, wie mache ich das? Wenn ich Display-Flex hinzufüge, verliere ich die Auslassungspunkte. Dies scheint nur zu funktionieren, wenn Anzeige: -webkit-Box gesetzt ist
PirateApp
10

CSS unten sollte den Trick machen.

Nach der zweiten Zeile enthält der Text ...

line-height: 1em;
max-height: 2em;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
Anandharshan
quelle
das hat gut funktioniert, aber ich musste hinzufügenoverflow:hidden
timhysniu
2

Meine Lösung verwendet die von amcdnl wieder, aber mein Fallback besteht darin, eine Höhe für den Textcontainer zu verwenden:

.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 */
}
VincentPerrin.com
quelle
-webkit-line-clampfunktioniert nicht für IE11, Edge oder Firefox.
Gaʀʀʏ
@Garry, Sie haben Recht, zu dem Zeitpunkt, als Sie einen JS-Fix benötigt hätten, aber jetzt funktioniert es einwandfrei. caniuse.com/#search=webkit-line-clamp
VincentPerrin.com
2

Verwenden Sie dies, wenn oben nicht funktioniert

 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;
Vikas Verma
quelle
1

Basierend auf einer Antwort, die ich in stackoveflow gesehen habe, habe ich dieses WENIGER-Mixin erstellt ( verwenden Sie diesen Link, um den CSS-Code zu generieren ):

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

Verwendung

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

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

.example-3 {
    .max-lines(3, 1.5);
}
Nabil Kadimi
quelle
1

Es scheint eleganter, zwei Klassen zu kombinieren. Sie können die two-linesKlasse löschen , wenn nur eine Zeile angezeigt werden muss:

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

Jugend kippt um
quelle
1

Das Beschränken auf wenige Zeilen funktioniert in fast allen Browsern, aber in Firefox & IE wird kein Auslassungszeichen (3 Punkte) angezeigt. Demo - 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; 
}
Nikith Reddy
quelle
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;

Ich habe eine Kombination aus Line-Clamp- und Line-Height-Arbeiten gefunden: D.

jimmyNames
quelle
0

In meiner eckigen App hat der folgende Stil für mich funktioniert, um Auslassungspunkte für den Textüberlauf in der zweiten Zeile zu erzielen :

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

Hoffe es hilft jemandem.

Nodirabegimxonoyim
quelle
0

Für diejenigen, die in scss arbeiten , müssen Sie !autoprefixerden Anfang des Kommentars hinzufügen , damit er für postcss erhalten bleibt:

Ich habe mich diesem Problem gestellt, deshalb habe ich es hier gepostet

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

Referenz

Awais
quelle
0

Sie können einen aufgelösten Effekt anstelle von Auslassungspunkten verwenden, reines CSS und sieht professioneller aus:

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

Hier habe ich angenommen, dass Ihre Hintergrundfarbe weiß ist.

Mahan Lamei
quelle
-1

Dies ist ein totaler Hack, aber es funktioniert:

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

Es hat Probleme ... es könnte einen Brief unangenehm abschneiden und es wird wahrscheinlich einige seltsame Ergebnisse auf einer reaktionsfähigen Site haben.

Morgan Kay
quelle
5
Dies ist keine richtige Lösung, denn wenn der Inhalt kleiner ist, wird am Ende auch '...' hinzugefügt. Geige: jsfiddle.net/2wPNg
Sachin
-1

Hier ist ein einfaches Skript zum Verwalten der Auslassungspunkte mit jQuery. Es überprüft die tatsächliche Höhe des Elements und erstellt einen ausgeblendeten ursprünglichen Knoten und einen abgeschnittenen Knoten. Wenn der Benutzer auf klickt, wechselt er zwischen den beiden Versionen.

Einer der großen Vorteile ist, dass die "Ellipse" erwartungsgemäß nahe am letzten Wort liegt.

Wenn Sie reine CSS-Lösungen verwenden, erscheinen die drei Punkte vom letzten Wort entfernt.

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>

Matteo Conta
quelle
Wenn Sie diese Lösung ablehnen, erklären Sie bitte hier, warum, ich werde es schätzen.
Matteo Conta
1
OP hat nach einer CSS-Lösung gefragt und Sie haben jQuery angeboten?
Dashard
Ich vermisste, dass es eine starke Anforderung war, dass kein Javascript vorhanden war. In meinem Fall stellte die reine CSS-Lösung Rendering-Probleme dar. Die jQuery-Lösung gab mir mehr Kontrolle über das endgültige Rendering und die Ellipsenposition.
Matteo Conta
Absolute Zustimmung. In meiner Antwort stellte ich fest, dass dies mit JS unendlich einfacher zu erreichen war.
Dashard
-3

Sie sind sich nicht sicher, was Ihr Ziel ist, aber möchten Sie, dass der Text in die zweite Zeile kommt?

Hier ist Ihre jsFiddle: http://jsfiddle.net/8kvWX/4/ hat gerade Folgendes entfernt:

     white-space:nowrap;  

Ich bin mir nicht sicher, ob Sie danach suchen oder nicht.

Grüße,

Mee

Mee
quelle
1
Er will die Auslassungspunkte am Ende der zweiten Zeile, was ohne JavaScript nicht so einfach ist ...
Marc Audet
@MarcAudet genau :)
Tony Bogdanov
Richtig, als ich eine andere Person fand, die darum bat, die Zeilen in der zweiten Zeile zu haben, und sein CSS so ziemlich dasselbe war wie deins, aber die Klasse zeigte stattdessen auf ein ul-Tag. Wie auch immer, sorry Tony. Ich werde es mir noch einmal ansehen und meine Antwort aktualisieren, wenn ich erfolgreich bin.
Mee
Nun, ich denke, dass die beste Lösung die von @Itay Gal ist. Soweit ich gesehen habe, funktioniert einer.
Mee