reticências css na segunda linha


208

CSS text-overflow: ellipsis na segunda linha, isso é possível? Não consigo encontrá-lo na rede.

exemplo:

o que eu quero é assim:

I hope someone could help me. I need 
an ellipsis on the second line of...

mas o que está acontecendo é o seguinte:

I hope someone could help me. I ... 

3
Após as reticências aparecerem e cortarem o texto no final da largura do elemento. Não passará para a próxima linha. A melhor solução aqui seria implementar algum script do lado do servidor ou do cliente que apara automaticamente o texto a uma certa quantidade de caracteres e, em seguida, acrescenta as reticências. Meu palpite é que um script do lado do cliente seria melhor, o que permitiria ainda ter todo o texto original disponível, se necessário.
FarligOpptreden 11/03/11

Aqui está uma pergunta semelhante: stackoverflow.com/questions/3922739/…
Evgeny 22/03

tl; dr: é possível apenas no webkit
Evgeny

O mais próximo que cheguei a isso foi adicionar um pseudoelemento 'after' para as elipses e posicioná-lo em linha, diretamente após o elemento que continha o texto. Mas as reticências desaparecem se o texto do elemento for muito longo, portanto, você precisará apará-lo de alguma forma, para torná-lo confiável.
Jonathan

Respostas:


105

Um requisito para text-overflow: ellipsis;trabalhar é uma versão de uma linha de white-space( pre,nowrap etc). O que significa que o texto nunca alcançará a segunda linha.

Ergo. Não é possível em CSS puro.

Minha fonte quando eu estava procurando exatamente a mesma coisa agora: http://www.quirksmode.org/css/textoverflow.html (Quirksmode ftw!)

EDIT Se os bons deuses do CSS implementarem http://www.w3.org/TR/css-overflow-3/#max-lines , podemos colocar isso em CSS puro usando fragments(novo) e max-lines(novo). Também mais algumas informações em http://css-tricks.com/line-clampin/

EDIT 2 O WebKit / Blink tem line-clamp: -webkit-line-clamp: 2colocará reticências na 2ª linha.


9
Manter um relógio, mas até agora é parece que os deuses não estão conosco ainda: caniuse.com/#search=max-lines
Daniel

1
Como conseguir o recurso acima que com saas? @Rudie
Bhoomi Bhalani

144

Isso deve funcionar nos navegadores do kit da web :

overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;

1
Observe que, a partir deste comentário, -webkit-line-clamp não respeita a visibilidade: oculto. bugs.webkit.org/show_bug.cgi?id=45399
Kevin

1
Ei - parece legal, mas não funciona para mim. Ele simplesmente puts '...' em determinada linha-clamp mas resto corte doesnt de texto (mesmo com attr-espaço em branco)
lemoid

3
Pode ser necessário adicionar overflow: hiddenpara que isso funcione.
Robert

Isso não funcionará no Firefox, o webkit não é suportado no mecanismo de lagartixas
ZetaPR 15/09/16

Essa deve ser a resposta aceita. Você não deseja nenhum preenchimento na parte inferior do elemento ao qual aplica isso, pois pode ver o restante do texto.
Tr1stan 02/12/19

34

Como outros já responderam, não existe uma solução CSS pura. Existe um plugin jQuery que é muito fácil de usar, chamado de dotdotdot . Ele usa a largura e a altura do contêiner para calcular se ele precisa truncar e adicionar reticências.

$("#multilinedElement").dotdotdot();

Aqui está um jsFiddle .


Este plug-in também oferece muitos outros utilitários, como adicionar links "leia mais", além de analisar URIs e marcação HTML. Boa descoberta!
Martin Andersson

2
Experimentei o jQuery dotdotdot 1.7.3 para uma loja de comércio eletrônico, para limitar os nomes de produtos em uma página de categoria de grade a duas linhas. Após um teste completo, decidimos não usar este plug-in porque, algumas vezes, após uma atualização de turno, o layout da página da categoria ficava quebrado. YMMV. No final, optamos por uma solução JS vanilla muito simples: se o clientHeight do elemento do nome do produto for menor que o scrollHeight, trunque o texto em um limite predefinido e acrescente "...". Às vezes, alguns nomes de produtos podem ser um pouco curtos devido ao limite predefinido, mas é super estável.
thdoan

1
Fácil de implementar e funciona lindamente. Obrigado!
Rachel S

Embora funcione bem, infelizmente sofre de problemas de desempenho. Se o seu projeto exigir vários usos de reticências, considere outra opção. Além disso, aqui está uma citação do repositório: "Como seu desempenho não pode ser melhorado, este plugin não é mais mantido ativamente.".
boyomarinov

1
Além disso, ele não funcionaria se o texto fosse alterado dinamicamente após o carregamento :(
Dejell 23/03

34

Descobri que a resposta de Skeep não era suficiente e também precisava de um overflowestilo:

overflow: hidden;
text-overflow: ellipsis;
-webkit-line-clamp: 2;
display: -webkit-box;
-webkit-box-orient: vertical;

18

se alguém estiver usando SASS / SCSS e se deparar com essa pergunta - talvez esse mixin possa ser útil:

@mixin line-clamp($numLines : 1, $lineHeight: 1.412) {
  overflow: hidden;
  text-overflow: -o-ellipsis-lastline;
  text-overflow: ellipsis;
  display: block;
  /* autoprefixer: off */
  display: -webkit-box;
  -webkit-line-clamp: $numLines;
  -webkit-box-orient: vertical;
  max-height: $numLines * $lineHeight + unquote('em');
}

isso adiciona apenas as reticências nos navegadores do kit da web. o resto apenas corta.


1
Usando menos, eu tive que mudar /* autoprefixer: off */para /*! autoprefixer: off */outra forma -webkit-box-orient: vertical;estava sendo removido após a compilação que significa que o reticências nunca mostrou
Nathan

18

Basta usar o grampo de linha nos navegadores que o suportam (navegadores mais modernos) e voltar a 1 linha para os mais antigos.

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


    @supports (-webkit-line-clamp: 2) {
      overflow: hidden;
      text-overflow: ellipsis;
      white-space: initial;
      display: -webkit-box;
      -webkit-line-clamp: 2;
      -webkit-box-orient: vertical;
    }
  }

1
espaço em branco: inicial; me salvou
James

10

Que pena que você não pode fazê-lo funcionar em duas linhas! Seria incrível se o elemento fosse bloco de exibição e tivesse uma altura definida para 2em ou algo assim, e quando o texto estourasse, mostraria uma elipse!

Para um único revestimento, você pode usar:

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

Para várias linhas, talvez você possa usar um Polyfill, como a autoellipsis do jQuery, que está no github http://pvdspek.github.com/jquery.autoellipsis/


Esse plugin é muito pesado para o que faz. Tem 5 anos. Prefiro usar dotdotdotmencionado em outro post.
Adi518

10

Eu não sou um profissional de JS, mas descobri algumas maneiras de fazer isso.

O HTML:

<p id="truncate">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi elementum consequat tortor et euismod. Nam commodo consequat libero vel lobortis. Morbi ac nisi at leo vehicula consectetur.</p>

Em seguida, com o jQuery, você o trunca para uma contagem de caracteres específica, mas deixa a última palavra como esta:

// Truncate but leave last word
var myTag = $('#truncate').text();
if (myTag.length > 100) {
  var truncated = myTag.trim().substring(0, 100).split(" ").slice(0, -1).join(" ") + "…";
  $('#truncate').text(truncated);
}

O resultado fica assim:

Lorem ipsum dolor sente-se no meio, consectetur elip adipiscing. Morbi
elementum consequat tortor et…

Ou você pode simplesmente truncá-lo para uma contagem de caracteres específica como esta:

// Truncate to specific character
var myTag = $('#truncate').text();
if (myTag.length > 15) {
  var truncated = myTag.trim().substring(0, 100) + "…";
  $('#truncate').text(truncated);
}

O resultado fica assim:

Lorem ipsum dolor sente-se no meio, consectetur elip adipiscing. Morbi
elementum consequat tortor et euismod…

Espero que ajude um pouco.

Aqui está o jsFiddle .


7

Aqui está um bom exemplo em CSS puro.

.container{
  width: 200px;
}
.block-with-text {
  overflow: hidden;
  position: relative; 
  line-height: 1.2em;
  max-height: 3.6em;
  text-align: justify;  
  margin-right: -1em;
  padding-right: 1em;
}
.block-with-text+.block-with-text{
  margin-top:10px;
}
.block-with-text:before {
  content: '...';
  position: absolute;
  right: 0;
  bottom: 0;
}
.block-with-text:after {
  content: '';
  position: absolute;
  right: 0;
  width: 1em;
  height: 1em;
  margin-top: 0.2em;
  background: white;
}
<div class="container">


<div class="block-with-text">
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a
</div>

<div class="block-with-text">
Lorem Ipsum is simply dummy text of the printing and typesetting industry
</div>


<div class="block-with-text">
Lorem Ipsum is simply
</div>

</div>


Solução muito boa, apenas ele trunca textos, mesmo que a segunda linha é muito curta para ser truncado, mas ainda assim, os polegares para cima
Amin


4

É um CSS não padrão, que não é coberto na versão atual do CSS (o Firefox não suporta). Tente usar JavaScript.


4

Modo CSS puro de aparar texto de múltiplas linhas com reticências

Ajuste a altura e a linha de controle do contêiner de texto para quebrar -webkit-line-clamp: 2;

.block-ellipsis {
  display: block;
  display: -webkit-box;
  max-width: 100%;
  height: 30px;
  margin: 0 auto;
  font-size: 14px;
  line-height: 1;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  text-overflow: ellipsis;
}

3

Eu já conheci esse problema antes e não há uma solução css pura

É por isso que desenvolvi uma pequena biblioteca para lidar com esse problema (entre outros). A biblioteca fornece objetos para modelar e executar a renderização de texto no nível da letra. Você pode, por exemplo, emular um excesso de texto: reticências com um limite arbitrário (não é necessária uma linha)

Leia mais em http://www.samuelrossille.com/home/jstext.html para obter uma captura de tela, tutorial e link para transferência.


3

Se alguém está tentando fazer com que o grampo de linha funcione no flexbox , é um pouco mais complicado - especialmente quando você faz testes de tortura com palavras muito longas. As únicas diferenças reais nesse trecho de código estão min-width: 0;no item flex que contém texto truncado e word-wrap: break-word;. Uma dica para https://css-tricks.com/flexbox-truncated-text/ para obter informações. Isenção de responsabilidade: este ainda é o webkit apenas até onde eu sei.

.flex-parent {
  display: flex;
}

.short-and-fixed {
  width: 30px;
  height: 30px;
  background: lightgreen;
}

.long-and-truncated {
  margin: 0 20px;
  flex: 1;
  min-width: 0;/* Important for long words! */
}

.long-and-truncated span {
  display: inline;
  -webkit-line-clamp: 3;
  text-overflow: ellipsis;
  overflow: hidden;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  word-wrap: break-word;/* Important for long words! */
}
<div class="flex-parent">
  <div class="flex-child short-and-fixed">
  </div>
  <div class="flex-child long-and-truncated">
    <span>asdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasd</span>
  </div>
  <div class="flex-child short-and-fixed">
  </div>
</div>

http://codepen.io/AlgeoMA/pen/JNvJdx (versão codepen)


1

Todas as respostas aqui estão erradas, faltam uma peça importante, a altura

.container{
    width:200px;
    height:600px;
    background:red
}
.title {
        overflow: hidden;
        line-height: 20px;
        height: 40px;
        text-overflow: ellipsis;
        display: -webkit-box;
        -webkit-line-clamp: 2;
        -webkit-box-orient: vertical;
    }
<div class="container">
    <div class="title">this is a long text you cant cut it in half</div>
</div>

0

uma base pura de método css no -webkit-line-clamp, que funciona no webkit:

@-webkit-keyframes ellipsis {/*for test*/
    0% { width: 622px }
    50% { width: 311px }
    100% { width: 622px }
}
.ellipsis {
    max-height: 40px;/* h*n */
    overflow: hidden;
    background: #eee;

    -webkit-animation: ellipsis ease 5s infinite;/*for test*/
    /**
    overflow: visible;
    /**/
}
.ellipsis .content {
    position: relative;
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-box-pack: center;
    font-size: 50px;/* w */
    line-height: 20px;/* line-height h */
    color: transparent;
    -webkit-line-clamp: 2;/* max row number n */
    vertical-align: top;
}
.ellipsis .text {
    display: inline;
    vertical-align: top;
    font-size: 14px;
    color: #000;
}
.ellipsis .overlay {
    position: absolute;
    top: 0;
    left: 50%;
    width: 100%;
    height: 100%;
    overflow: hidden;

    /**
    overflow: visible;
    left: 0;
    background: rgba(0,0,0,.5);
    /**/
}
.ellipsis .overlay:before {
    content: "";
    display: block;
    float: left;
    width: 50%;
    height: 100%;

    /**
    background: lightgreen;
    /**/
}
.ellipsis .placeholder {
    float: left;
    width: 50%;
    height: 40px;/* h*n */

    /**
    background: lightblue;
    /**/
}
.ellipsis .more {
    position: relative;
    top: -20px;/* -h */
    left: -50px;/* -w */
    float: left;
    color: #000;
    width: 50px;/* width of the .more w */
    height: 20px;/* h */
    font-size: 14px;

    /**
    top: 0;
    left: 0;
    background: orange;
    /**/
}
<div class='ellipsis'>
    <div class='content'>
        <div class='text'>text text text text text text text text text text text text text text text text text text text text text </div>
        <div class='overlay'>
            <div class='placeholder'></div>
            <div class='more'>...more</div>
        </div>
    </div>
</div>


-1

Não é uma maneira realmente fácil de fazer isso. Use a biblioteca Clamp.js .

$clamp(myHeader, {clamp: 3});

-6

Encontrei uma solução, no entanto, você precisa conhecer um tamanho aproximado de caractere que caiba na sua área de texto e, em seguida, junte um ... ao espaço anterior.

A maneira que eu fiz isso é:

  1. assuma um tamanho aproximado de caractere (neste caso, 200) e passe para uma função junto com o seu texto
  2. divida os espaços para que você tenha uma corda longa
  3. use jQuery para obter o primeiro espaço "" após o tamanho do seu caractere
  4. junte-se ao restante ...

código:

truncate = function(description){
        return description.split('').slice(0, description.lastIndexOf(" ",200)).join('') + "...";           
}

aqui está um violino - http://jsfiddle.net/GYsW6/1/

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.