Umschließen Sie einen Text innerhalb von nur zwei Zeilen mit div

84

Ich möchte einen Text innerhalb von nur zwei Zeilen innerhalb von div mit einer bestimmten Breite einschließen. Wenn der Text die Länge von zwei Zeilen überschreitet, möchte ich Elipsen anzeigen. Gibt es eine Möglichkeit, dies mit CSS zu tun?

z.B

Sample text showing wrapping
of text in only two line...

Vielen Dank

Mady
quelle

Antworten:

142

Das Beschränken der Ausgabe auf zwei Textzeilen ist mit CSS möglich, wenn Sie das line-heightund heightdes Elements festlegen und Folgendes festlegen overflow:hidden;:

#someDiv {
    line-height: 1.5em;
    height: 3em;       /* height is 2x line-height, so two lines will display */
    overflow: hidden;  /* prevents extra lines from being visible */
}

--- jsFiddle DEMO ---

Alternativ können Sie das CSS text-overflowund die white-spaceEigenschaften verwenden, um Ellipsen hinzuzufügen. Dies scheint jedoch nur für eine einzelne Zeile zu funktionieren.

#someDiv {
    line-height: 1.5em;
    height: 3em;
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
    width: 100%;
}

Und eine Demo:

--- jsFiddle DEMO ---

Das Erreichen mehrerer Textzeilen und Ellipsen scheint der Bereich von Javascript zu sein.

Jackwanders
quelle
11
Ich sehe aus irgendeinem Grund nur eine Zeile: /
SearchForKnowledge
7
Das zweite Beispiel enthält nur eine Zeile, wenn für die angeforderte Lösung zwei erforderlich sind.
Goyote
Das dritte Beispiel funktioniert bei mir nicht und wurde in Chrome und Firefox getestet.
Oliver Lorton
1
In diesem kaputten Beispiel white-space: nowrap;bricht es, wenn Sie es auskommentieren, funktioniert es.
Wilt
42

Eine weitere einfache und schnelle Lösung

.giveMeEllipsis {
   overflow: hidden;
   text-overflow: ellipsis;
   display: -webkit-box;
   -webkit-box-orient: vertical;
   -webkit-line-clamp: N; /* number of lines to show */
   line-height: X;        /* fallback */
   max-height: X*N;       /* fallback */
}

Der Verweis auf die ursprüngliche Frage und Antwort ist hier

Weinreben
quelle
3
Erstaunliche Lösung! Ich habe es nicht vollständig getestet, aber auf den ersten
Blick
4
@vinesh diese Lösung brennt! 🔥
PhillipJacobs
Scheint , box-orientist veraltet oder überholt .
Greg Herbowicz
Funktioniert! Getestet in einem mat-card-contentin aflexbox container
faizanjehangir
17

Das beste, das ich gesehen habe, das nur CSS ist und reagiert, stammt aus dem Mobify Developer Blog - CSS-Ellipse: So verwalten Sie mehrzeilige Ellipsen in reinem CSS :

JS Fiddle Beispiel

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

Html:

<div class="ellipsis">
    <div class="blah">
        <p>Call me Ishmael. Some years ago &ndash; never mind how long precisely &ndash; 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 &ndash; then, I account it high time to get to sea as soon as I can.</p>
    </div>
</div>
Erik Philips
quelle
Die beste Lösung, die ich bisher gesehen habe. Möglicherweise möchten Sie die Variable height (200px) in der Geige reduzieren. Bei meiner Bildschirmgröße ist der Text anfangs nicht übergelaufen.
Mike Fuchs
14

Ich glaube, dass die Nur-CSS-Lösung nur text-overflow: ellipsisfür eine Zeile gilt, sodass Sie diesen Weg nicht gehen können:

.yourdiv {

    line-height: 1.5em; /* Sets line height to 1.5 times text size */
    height: 3em; /* Sets the div height to 2x line-height (3 times text size) */
    width: 100%; /* Use whatever width you want */
    white-space: normal; /* Wrap lines of text */
    overflow: hidden; /* Hide text that goes beyond the boundaries of the div */
    text-overflow: ellipsis; /* Ellipses (cross-browser) */
    -o-text-overflow: ellipsis; /* Ellipses (cross-browser) */
}

Haben Sie http://tpgblog.com/threedots/ für jQuery ausprobiert ?

Eric Tjossem
quelle
Wie bereits erwähnt, scheint das Kombinieren von Ellipsen mit mehreren Textzeilen nicht zu funktionieren, zumindest nicht für mich in Chrome.
Jackwanders
Diese in meinem aktuellen Problem gearbeitet , nachdem ich hinzugefügt: display: blockund min-height: 13pxund max-height: 26pxfür die Höheneinstellung für eine<td>
Underverse
8

Nur CSS-Lösung für Webkit

// Only for DEMO
$(function() {

  $('#toggleWidth').on('click', function(e) {

    $('.multiLineLabel').toggleClass('maxWidth');

  });

})
.multiLineLabel {
  display: inline-block;
  box-sizing: border-box;
  white-space: pre-line;
  word-wrap: break-word;
}

.multiLineLabel .textMaxLine {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  overflow: hidden;
}


/* Only for DEMO */

.multiLineLabel.maxWidth {
  width: 100px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="multiLineLabel">
  <span class="textMaxLine">This text is going to wrap automatically in 2 lines in case the width of the element is not sufficiently wide.</span>
</div>
<br/>
<button id="toggleWidth">Toggle Width</button>

Ashish Singh
quelle
Dies ist die beste Lösung und muss als Antwort markiert werden. Vielen Dank.
QMaster
5

Nur CSS

    line-height: 1.5;
    white-space: normal;
    overflow: hidden;
    text-overflow: ellipsis;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
Asiddeen bn Muhammad
quelle
4

Versuchen Sie so etwas: http://jsfiddle.net/6jdj3pcL/1/

<p>Here is a paragraph with a lot of text ...</p>

p {
    line-height: 1.5em;
    height: 3em;
    overflow: hidden;
    width: 300px;
}

p::before {
   content: '...';
   float: right;
   margin-top: 1.5em;
}
Alexander Cheprasov
quelle
4

In der Regel ist ein einzeiliges Abschneiden recht einfach

.truncate-text {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

Das Abschneiden von zwei Zeilen ist etwas schwieriger, aber es kann mit CSS durchgeführt werden. Dieses Beispiel ist in Sass.

@mixin multiLineEllipsis($lineHeight: 1.2rem, $lineCount: 2, $bgColor: white, $padding-right: 0.3125rem, $width: 1rem, $ellipsis-right: 0) {
  overflow: hidden; /* hide text if it is more than $lineCount lines  */
  position: relative; /* for set '...' in absolute position */
  line-height: $lineHeight; /* use this value to count block height */
  max-height: $lineHeight * $lineCount; /* max-height = line-height * lines max number */
  padding-right: $padding-right; /* place for '...' */
  white-space: normal; /* overwrite any white-space styles */
  word-break: break-all; /* will break each letter in word */
  text-overflow: ellipsis; /* show ellipsis if text is broken */

  &::before {
    content: '...'; /* create the '...'' points in the end */
    position: absolute;
    right: $ellipsis-right;
    bottom: 0;
  }

  &::after {
    content: ''; /* hide '...'' if we have text, which is less than or equal to max lines and add $bgColor */
    position: absolute;
    right: 0;
    width: $width;
    height: 1rem * $lineCount;
    margin-top: 0.2rem;
    background: $bgColor; /* because we are cutting off the diff we need to add the color back. */
  }
}
ArturoRomero
quelle
2

Siehe http://jsfiddle.net/SWcCt/ .

Stellen Sie einfach line-heightdie Hälfte von height:

line-height:20px;
height:40px;

Um arbeiten zu können, text-overflow: ellipsisbenötigen Sie natürlich auch:

overflow:hidden;
white-space: pre;
Oriol
quelle
Diese Lösung ist nicht flexibel und erfordert einen manuellen Zeilenumbruch im Quelltext. Beachten Sie, dass jsfiddle.net/SWcCt/282 jedes Feld nur eine Textzeile enthält. Die gewünschte Lösung würde wie die 2. Box von jsfiddle.net/SWcCt/283 aussehen, außer mit einem Auslassungszeichen am Ende der 2. Zeile.
Joshua Coady
@JoshuaCoady Guter Punkt, text-overflow: ellipsisfunktioniert aber nur für Inline-Boxen, die die Line-Box überlaufen. Ohne white-space: prewürden sie einfach zur nächsten Zeilenbox gehen. Und dann ist ein manueller Zeilenumbruch erforderlich. Ich glaube nicht, dass es eine perfekte Lösung gibt.
Oriol
0

@Asiddeen bn Mohammeds Lösung funktionierte für mich mit einer kleinen Modifikation des CSS

    .text {
 line-height: 1.5;
  height: 6em; 
white-space: normal;
overflow: hidden;
text-overflow: ellipsis;
display: block;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
 }
Obyno Pac
quelle