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

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.


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


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>

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?


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>


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;


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

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;

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;
 }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.