Zawiń tekst w zaledwie dwóch wierszach wewnątrz elementu div

85

Chcę zawinąć tekst tylko w dwóch wierszach wewnątrz elementu div o określonej szerokości. Jeśli tekst przekracza długość dwóch wierszy, chcę pokazać elipsy. Czy jest na to sposób za pomocą CSS?

na przykład

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

Dzięki

Mady
źródło

Odpowiedzi:

143

Ograniczenie wyjścia do dwóch wierszy tekstu jest możliwe w CSS, jeśli ustawisz line-heightand heightelementu i ustawisz 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 ---

Alternatywnie możesz użyć CSS text-overflowi white-spacewłaściwości, aby dodać elipsy, ale wydaje się, że działa to tylko dla jednej linii.

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

I demo:

--- jsFiddle DEMO ---

Wydaje się, że dziedziną javascript jest uzyskiwanie zarówno wielu wierszy tekstu, jak i wielokropków.

jackwanders
źródło
11
Z jakiegoś powodu widzę tylko jedną linię: /
SearchForKnowledge
7
Drugi przykład ma tylko jedną linię, gdy żądane rozwiązanie wymaga dwóch.
gojot
Trzeci przykład nie działa u mnie, przetestowany w Chrome i Firefox.
Oliver Lorton
1
W tym zepsutym przykładzie white-space: nowrap;zepsuje, jeśli to skomentujesz, to działa.
Wilt
42

Kolejne proste i szybkie rozwiązanie

.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 */
}

Odniesienie do pierwotnego pytania i odpowiedzi jest tutaj

winorośl
źródło
3
Niesamowite rozwiązanie! Nie przetestowałem go w pełni, ale na pierwszy
rzut oka
4
@vinesh to rozwiązanie się pali! 🔥
PhillipJacobs
Wydaje się, że box-orientjest przestarzały lub przestarzały .
Greg Herbowicz
Pracuje! Przetestowałem to mat-card-contentw aflexbox container
faizanjehangir
17

Najlepszy, jaki widziałem, który jest tylko CSS i responsywny, pochodzi z bloga Mobify Developer Blog - CSS Ellipsis: How to Manage Multi-Line Ellipsis in Pure CSS :

Przykład JS Fiddle

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
źródło
Najlepsze rozwiązanie, jakie do tej pory widziałem. Możesz chcieć zmniejszyć zmienną wysokości (200px) na skrzypcach, ponieważ dla mojego rozmiaru ekranu tekst początkowo nie był przepełniony.
Mike Fuchs
14

Uważam, że rozwiązanie oparte tylko na CSS text-overflow: ellipsisdotyczy tylko jednej linii, więc nie będziesz w stanie przejść tej trasy:

.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) */
}

Czy próbowałeś http://tpgblog.com/threedots/ dla jQuery?

Eric Tjossem
źródło
jak wspomniałem, łączenie elips z wieloma wierszami tekstu nie wydaje się działać, przynajmniej nie dla mnie w Chrome.
jackwanders
To działało w moim obecnym problemem po I dodaje: display: blocki min-height: 13pxi max-height: 26pxustalania wysokości do<td>
Underverse
8

Jedyne rozwiązanie CSS dla 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
źródło
To najlepsze rozwiązanie i należy je zaznaczyć jako odpowiedź. Dzięki.
QMaster
6

Tylko 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
źródło
4

Spróbuj czegoś takiego: 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
źródło
4

Zwykle obcięcie w jednym wierszu jest dość proste

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

Obcięcie dwóch wierszy jest trochę trudniejsze, ale można to zrobić za pomocą css, w tym przykładzie jest w 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
źródło
2

Zobacz http://jsfiddle.net/SWcCt/ .

Wystarczy ustawić line-heightpołowę z height:

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

Oczywiście, aby wykonać text-overflow: ellipsispracę, potrzebujesz również:

overflow:hidden;
white-space: pre;
Oriol
źródło
To rozwiązanie nie jest elastyczne i wymaga ręcznego podziału wiersza w tekście źródłowym. Zauważ, że jsfiddle.net/SWcCt/282 każde pudełko zawiera tylko jedną linię tekstu. Pożądane rozwiązanie wyglądałoby jak drugie pudełko jsfiddle.net/SWcCt/283 z wyjątkiem wielokropka na końcu drugiego wiersza.
Joshua Coady
@JoshuaCoady Dobra uwaga, ale text-overflow: ellipsisdziała tylko w przypadku pól liniowych, które przepełniają pole linii. Bez white-space: prenich po prostu przeszliby do następnej linii. A potem potrzebny jest ręczny podział wiersza. Myślę, że nie ma idealnego rozwiązania.
Oriol
0

Rozwiązanie @Asiddeen bn Muhammada zadziałało dla mnie z niewielką modyfikacją 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
źródło