Quebra um texto em apenas duas linhas dentro de div

87

Quero quebrar um texto em apenas duas linhas dentro de div de largura específica. Se o texto ultrapassar o comprimento de duas linhas, quero mostrar elipses. Existe uma maneira de fazer isso usando CSS?

por exemplo

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

obrigado

Madame
fonte

Respostas:

147

Limitar a saída a duas linhas de texto é possível com CSS, se você definir o line-heighte heightdo elemento e definir 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 ---

Como alternativa, você pode usar o CSS text-overflowe as white-spacepropriedades para adicionar elipses, mas isso parece funcionar apenas para uma única linha.

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

E uma demonstração:

--- jsFiddle DEMO ---

Alcançar várias linhas de texto e reticências parece ser o domínio do javascript.

jackwanders
fonte
11
Só vejo uma linha cruzando por algum motivo: /
SearchForKnowledge
7
O segundo exemplo possui apenas uma linha, quando a solução solicitada requer duas.
goyote de
O terceiro exemplo não funciona para mim, testado no Chrome e Firefox.
Oliver Lorton
1
Nesse exemplo quebrado, white-space: nowrap;quebra, se você comentar, funciona.
Wilt
46

Outra solução simples e rápida

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

A referência à pergunta e resposta original está aqui

Vinesh
fonte
3
Solução incrível! Eu não testei totalmente, mas na primeira tentativa, funciona muito bem
Gambai
4
@vinesh, essa solução está pegando fogo! 🔥
PhillipJacobs
Parece que box-orientestá preterido ou obsoleto .
Greg Herbowicz,
Trabalho! Testado dentro de um mat-card-contentem umflexbox container
faizanjehangir
17

O melhor que já vi, que é apenas CSS e responsivo, vem do Mobify Developer Blog - CSS Ellipsis: How to Manage Multi-Line Ellipsis in Pure CSS :

Exemplo 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
fonte
A melhor solução que já vi até agora. Você pode querer reduzir a variável de altura (200px) no violino, para o tamanho da minha tela, o texto não transbordou inicialmente.
Mike Fuchs
14

Acredito que a solução CSS-only text-overflow: ellipsisse aplica a apenas uma linha, então você não será capaz de seguir este caminho:

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

Você já tentou http://tpgblog.com/threedots/ para jQuery?

Eric Tjossem
fonte
como mencionei, combinar elipses com várias linhas de texto não parece funcionar, pelo menos não para mim no Chrome.
jackwanders de
Isso funcionou no meu problema atual depois acrescentei: display: blocke min-height: 13pxe max-height: 26pxpara definir a altura para um<td>
Underverse
9

Solução CSS apenas para 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
fonte
Esta é a melhor solução e deve ser marcada como resposta. Obrigado.
QMaster 01 de
7

Somente 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
fonte
4

Tente algo assim: 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
fonte
4

Normalmente, um truncamento de uma linha é bastante simples

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

O truncamento de duas linhas é um pouco mais complicado, mas pode ser feito com css. Este exemplo está em 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
fonte
2

Consulte http://jsfiddle.net/SWcCt/ .

Basta definir line-heighta metade de height:

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

Claro, para fazer text-overflow: ellipsisfuncionar você também precisa:

overflow:hidden;
white-space: pre;
Oriol
fonte
Esta solução não é flexível e requer uma quebra de linha manual no texto fonte. Observe que jsfiddle.net/SWcCt/282 cada caixa contém apenas uma linha de texto. A solução desejada seria semelhante à 2ª caixa de jsfiddle.net/SWcCt/283, exceto com reticências no final da 2ª linha.
Joshua Coady de
@JoshuaCoady Bom argumento, mas text-overflow: ellipsissó funciona para caixas embutidas que ultrapassam a caixa de linha. Sem white-space: preeles simplesmente iriam para a próxima caixa de linha. E então uma quebra de linha manual é necessária. Não acho que haja uma solução perfeita.
Oriol
0

A solução de @Asiddeen bn Muhammad funcionou para mim com algumas modificações no 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
fonte