O texto transborda reticências em duas linhas

117

Eu sei que você pode usar uma combinação de regras CSS para fazer o texto terminar com reticências (...) quando for hora de estourar (sair dos limites dos pais).

É possível (fique à vontade para apenas dizer não) obter o mesmo efeito, mas deixar o texto quebrar em mais de uma linha?

Aqui está uma demonstração .

div {
  width: 300px; 
  height: 42px; 
  overflow: hidden; 
  text-overflow: ellipsis; 
  white-space: nowrap;
}

Como você pode ver, o texto termina com reticências quando é mais largo que a largura do div. No entanto, ainda há espaço suficiente para o texto quebrar em uma segunda linha e continuar. Isso é interrompido por white-space: nowrap, que é necessário para que as reticências funcionem.

Alguma ideia?

PS: Sem soluções JS, CSS puro se possível.

Tony Bogdanov
fonte
O que determina "há espaço"? Está tudo incluindo a altura da fonte em pixels definidos? O que aconteceria se um usuário final aumentasse o tamanho da fonte em seu navegador?
Joel Etherton,
@JoelEtherton Suponho que cabe ao navegador decidir e sim, tudo está em pixels no meu caso.
Tony Bogdanov,
Esta pode ser uma boa solução: stackoverflow.com/questions/6222616/…
ivy
Esta é uma boa leitura hackingui.com/front-end/…
anandharshan

Respostas:

31

Não tenho certeza se você viu ISTO , mas o excelente CSS-Tricks.com de Chris Coyier postou um link para isso há algum tempo e é uma solução CSS pura que realiza exatamente o que você procura.

(Clique para visualizar no CodePen)

HTML:

<div class="ellipsis">
    <div>
        <p>
            Call me Ishmael. Some years ago – never mind how long precisely – 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 – then, I account
            it high time to get to sea as soon as I can.
        </p>
    </div>
</div>

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-size: 100% 100%;/* 512x1 image,gradient for IE9. Transparent at 0% -> white at 50% -> white at 100%.*/
    background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAABCAMAAACfZeZEAAAABGdBTUEAALGPC/xhBQAAAwBQTFRF////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wDWRdwAAAP90Uk5TgsRjMZXhS30YrvDUP3Emow1YibnM9+ggOZxrBtpRRo94gxItwLOoX/vsHdA2yGgL8+TdKUK8VFufmHSGgAQWJNc9tk+rb5KMCA8aM0iwpWV6dwP9+fXuFerm3yMs0jDOysY8wr5FTldeoWKabgEJ8RATG+IeIdsn2NUqLjQ3OgBDumC3SbRMsVKsValZplydZpZpbJOQco2KdYeEe36BDAL8/vgHBfr2CvTyDu8R7esU6RcZ5ecc4+Af3iLcJSjZ1ivT0S/PMs3LNck4x8U7wz7Bv0G9RLtHuEq1TbJQr1OtVqqnWqRdoqBhnmSbZ5mXapRtcJGOc4t2eYiFfH9AS7qYlgAAARlJREFUKM9jqK9fEGS7VNrDI2+F/nyB1Z4Fa5UKN4TbbeLY7FW0Tatkp3jp7mj7vXzl+4yrDsYoVx+JYz7mXXNSp/a0RN25JMcLPP8umzRcTZW77tNyk63tdprzXdmO+2ZdD9MFe56Y9z3LUG96mcX02n/CW71JH6Qmf8px/cw77ZvVzB+BCj8D5vxhn/vXZh6D4uzf1rN+Cc347j79q/zUL25TPrJMfG/5LvuNZP8rixeZz/mf+vU+Vut+5NL5gPOeb/sd1dZbTs03hBuvmV5JuaRyMfk849nEM7qnEk6IHI8/qn049hB35QGHiv0yZXuMdkXtYC3ebrglcqvYxoj1muvC1nDlrzJYGbpcdHHIMo2FwYv+j3QAAOBSfkZYITwUAAAAAElFTkSuQmCC);
    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);
    }

Claro, ser uma solução CSS pura significa que também é bastante complicada, mas funciona de forma limpa e elegante. Assumirei que Javascript está fora de questão porque é muito mais fácil de conseguir (e possivelmente mais degradável) com Javascript.

Como um bônus adicional, há um arquivo zip para download do processo completo (se você quiser entendê-lo e tudo), mas também um arquivo mixin SASS para que você possa dobrá-lo em seu processo facilmente.

Espero que isto ajude!

http://www.mobify.com/blog/multiline-ellipsis-in-pure-css/

dashard
fonte
Acabei de clicar no link do Codepen em um telefone Android e funcionou no Firefox. Em qual plataforma / navegador ele não está funcionando?
dashard
uploady.com/#!/download/kAwBXv1CqXg/PU68wrP6QzGgydlS Estou usando o Chrome e não há reticências na visualização. Continue adicionando linhas de texto, nada acontece. Depois de quantas linhas ele começará a mostrar reticências?
coding_idiot
No link de upload que você postou, o texto claramente ainda não havia estourado o contêiner. O texto deve ser muito grande para o recipiente fixo exibir antes que as reticências apareçam. Continue adicionando texto para ver o efeito.
dashard
@MarcosPérezGude - não me surpreende. Aludido a isso com >> "Claro, ser uma solução CSS pura significa que também é muito complicada ..." <<
dashard
136

Propriedades CSS fáceis podem resolver o problema. O seguinte é para reticências de três linhas.

display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
pxthxk
fonte
15
isso não funciona no firefox. apenas chrome, safari e opera
anyavacy
1
de acordo com caniuse , ele diz que "é improvável que outros navegadores suportem a propriedade como está". Então, atenção.
Matan Bobi
bom cara .. muito útil
Valentino Pereira
4
Funciona gr8 no firefox também
Nisharg Shah
4
Parece ter um ótimo suporte agora: caniuse.com/#search=line-clamp
João
51

Dê uma olhada nesta versão css pura: http://codepen.io/martinwolf/pen/qlFdp

display: -webkit-box;
max-width: 400px;
height: 109.2px;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
line-height: 1.625;
amcdnl
fonte
7
Isso é muito legal, uma pena que é apenas webkit. Aqui está um artigo interessante sobre o assunto: css-tricks.com/line-clampin
Tony Bogdanov
Por que você declara duas regras text-overflowe display?
j08691
Um grande WoooW. Nunca vi antes pinça de linha
Mike Aron
1
Para sua informação, isso também funciona bem no Firefox atualmente. Ótima solução!
Athoxx
apenas 1 pergunta, quando eu tenho uma linha ou duas linhas de texto eu quero centralizá-las, como faço isso, se eu adicionar display flex, eu perco as reticências, parece que isso funciona apenas se display: -webkit box está definido
PirateApp
10

O CSS abaixo deve resolver o problema.

Após a segunda linha, o texto conterá ...

line-height: 1em;
max-height: 2em;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
anandharshan
fonte
funcionou bem, mas eu tive que adicionaroverflow:hidden
timhysniu
2

Minha solução reutiliza a de amcdnl, mas meu substituto consiste em usar uma altura para o contêiner de texto:

.my-caption h4 {
    display: -webkit-box;
    margin: 0 auto;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
    text-overflow: ellipsis;

    height: 40px;/* Fallback for non-webkit */
}
VincentPerrin.com
fonte
-webkit-line-clampnão funciona para IE11, Edge ou Firefox.
Gaʀʀʏ
@Garry, você está certo, na época você precisaria de uma correção de JS, mas agora funciona bem. caniuse.com/#search=webkit-line-clamp
VincentPerrin.com
2

Use isto se acima não estiver funcionando

 display: block;
 display: -webkit-box;
 max-width: 100%;
 margin: 0 auto;
 -webkit-line-clamp: 2;
 /* autoprefixer: off */
 -webkit-box-orient: vertical;
 /* autoprefixer: on */
 overflow: hidden;
 text-overflow: ellipsis;
Vikas Verma
fonte
1

Com base em uma resposta que vi no stackoveflow, criei este mixin MENOS ( use este link para gerar o código CSS ):

.max-lines(@lines: 3; @line-height: 1.2) {
  overflow: hidden;
  text-overflow: ellipsis;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: @lines;
  line-height: @line-height;
  max-height: @line-height * @lines;
}

Uso

.example-1 {
    .max-lines();
}

.example-2 {
    .max-lines(3);
}

.example-3 {
    .max-lines(3, 1.5);
}
Nabil Kadimi
fonte
1

Parece mais elegante combinar duas classes. Você pode abandonar a two-linesaula se apenas uma linha precisar ver:

.ellipse {
          white-space: nowrap;
          display:inline-block;
          overflow: hidden;
          text-overflow: ellipsis;
       }
      .two-lines {
          -webkit-line-clamp: 2;
          display: -webkit-box;
          -webkit-box-orient: vertical;
          white-space: normal;
      }
      .width{
          width:100px;
          border:1px solid hotpink;
      }
        <span class='width ellipse'>
          some texts some texts some texts some texts some texts some texts some texts
       </span>

       <span class='width ellipse two-lines'>
          some texts some texts some texts some texts some texts some texts some texts
       </span>

Reviravolta da juventude
fonte
1

Restringir a poucas linhas funcionará em quase todos os navegadores, mas reticências (3 pontos) não serão exibidas no Firefox e no IE. Demo - http://jsfiddle.net/ahzo4b91/1/

div {
width: 300px;
height: 2.8em;
line-height: 1.4em;
display: flex;
-webkit-line-clamp: 2;
display: -webkit-box;
-webkit-box-orient: vertical;
overflow: hidden; 
}
Nikith Reddy
fonte
0
          text-overflow: ellipsis;
          overflow: hidden;
          text-overflow: ellipsis;
          display: -webkit-box;
          line-height: 36px;
          max-height: 18px;
          -webkit-line-clamp: 2;
          -webkit-box-orient: vertical;

Eu encontrei uma combinação de obras de grampo de linha e altura de linha: D

JimmyNames
fonte
0

Em meu aplicativo angular, o seguinte estilo funcionou para eu conseguir reticências no excesso de texto na segunda linha :

 <div style="height:45px; overflow: hidden; position: relative;">
     <span class=" block h6 font-semibold clear" style="overflow: hidden;
        text-overflow: ellipsis;
        display: -webkit-box; 
        line-height: 20px; /* fallback */
        max-height: 40px; /* fallback */
        -webkit-line-clamp: 2; /* number of lines to show */
        -webkit-box-orient: vertical;">
        {{ event?.name}} </span>
 </div>

Espero que ajude alguém.

Nodirabegimxonoyim
fonte
0

Para aqueles que trabalham em scss , você precisa adicionar !autoprefixerao início do comentário para que seja preservado para postcss:

Eu enfrentei esse problema, é por isso que postá-lo aqui

line-height: 1em;
max-height: 2em;
display: -webkit-box;
/*! autoprefixer: off */
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;

Referência

Awais
fonte
0

Você pode usar um efeito dissolvido em vez de reticências, CSS puro e parece mais profissional:

    <div style="width: 293px; height:48px; overflow: hidden; ">
        More than two line of text goes here-More than two line of text goes here
    </div>
    <div style="position: relative; top: -24px; width: 293px; height:24px; 
             background: linear-gradient(90deg, rgba(255,0,0,0) 40%, rgba(255,255,255,1) 99%);">
    </div>

Aqui, presumi que sua cor de fundo é branca.

Mahan Lamei
fonte
-1

Este é um hack total, mas funciona:

http://jsfiddle.net/2wPNg/

div {
    width: 30%;
    float: left;
    margin-right: 2%;
    height: 94px;
    overflow: hidden;
    position: relative;
}

div:after {
     display: block;
      content: '...';
      width: 1em;
  height: 1.5em;
  background: #fff;
  position: absolute;
  bottom: -6px;
  right: 0;
    }

Ele tem problemas ... pode cortar uma carta sem jeito e provavelmente terá alguns resultados estranhos em um site responsivo.

Morgan Kay
fonte
5
Esta não é a solução certa porque se o conteúdo for menor, também será adicionado '...' no final. Fiddle: jsfiddle.net/2wPNg
Sachin
-1

Aqui está um script simples para gerenciar as reticências usando jQuery. Ele inspeciona a altura real do elemento e cria um nó original oculto e um nó truncado. Quando o usuário clica, ele alterna entre as duas versões.

Um dos grandes benefícios é que a "reticência" fica próxima da última palavra, conforme o esperado.

Se você usar soluções CSS puras, os três pontos aparecerão distantes da última palavra.

function manageShortMessages() {

        $('.myLongVerticalText').each(function () {
            if ($(this)[0].scrollHeight > $(this)[0].clientHeight)
                $(this).addClass('ellipsis short');
        });

        $('.myLongVerticalText.ellipsis').each(function () {
            var original = $(this).clone().addClass('original notruncation').removeClass('short').hide();
            $(this).after(original);

            //debugger;
            var shortText = '';
            shortText = $(this).html().trim().substring(0, 60) + '...';
            $(this).html(shortText);
        });
        
        $('.myLongVerticalText.ellipsis').click(function () {
            $(this).hide();

            if ($(this).hasClass('original'))
            {
                $(this).parent().find('.short').show();
            }
            else
            {
                $(this).parent().find('.original').show();
            }
        });
    }
	
  manageShortMessages();
div {
 border:1px solid red;
 margin:10px;
}

div.myLongVerticalText {
  height:30px;
  width:450px;
}

div.myLongVerticalText.ellipsis {
 cursor:pointer;
}

div.myLongVerticalText.original {
  display:inline-block;
  height:inherit;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<body>
<div class="myLongVerticalText">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse sit amet quam hendrerit, sagittis augue vel, placerat erat. Aliquam varius porta posuere. Aliquam erat volutpat. Phasellus ullamcorper malesuada bibendum. Etiam fringilla, massa vitae pulvinar vehicula, augue orci mollis lorem, laoreet viverra massa eros id est. Phasellus suscipit pulvinar consectetur. Proin dignissim egestas erat at feugiat. Aenean eu consectetur erat. Nullam condimentum turpis eu tristique malesuada.

Aenean sagittis ex sagittis ullamcorper auctor. Sed varius commodo dui, nec consectetur ante condimentum et. Donec nec blandit mi, vitae blandit elit. Phasellus efficitur ornare est facilisis commodo. Donec convallis nunc sed mauris vehicula, non faucibus neque vehicula. Donec scelerisque luctus dui eu commodo. Integer eu quam sit amet dui tincidunt pharetra eu ac quam. Quisque tempus pellentesque hendrerit. Sed orci quam, posuere eu feugiat at, congue sed felis. In ut lectus gravida, volutpat urna vitae, cursus justo. Nam suscipit est ac accumsan consectetur. Donec rhoncus placerat metus, ut elementum massa facilisis eget. Donec at arcu ac magna viverra tincidunt.
</div>


<div class="myLongVerticalText">
One Line Lorem ipsum dolor sit amet.  
</div>
</body>

Matteo Conta
fonte
Se você downvote esta solução, explique o motivo aqui, eu agradecerei.
Matteo Conta
1
OP pediu uma solução CSS e você ofereceu o jQuery?
dashard de
Perdi que era um requisito forte a ausência de javascript, no meu caso a solução CSS puro apresentava problemas de renderização, a solução jQuery me deu mais controle sobre a renderização final e a posição das reticências.
Matteo Conta
Concordo absolutamente. Em minha resposta, observei que isso era infinitamente mais fácil de conseguir com JS.
dashard
-3

Não tem certeza de qual é o seu destino, mas deseja que o texto apareça na segunda linha?

Aqui está seu jsFiddle: http://jsfiddle.net/8kvWX/4/ acaba de remover o seguinte:

     white-space:nowrap;  

Não tenho certeza se é isso que você está procurando ou não.

Saudações,

Mee

Mee
fonte
1
Ele quer reticências no final da segunda linha, o que não é tão fácil de fazer sem JavaScript ...
Marc Audet
@MarcAudet exatamente :)
Tony Bogdanov
Certo, como eu encontrei outra pessoa pedindo as linhas na segunda linha e seu CSS era praticamente o mesmo que o seu, mas a classe estava apontando para uma tag ul. De qualquer forma, desculpe Tony. Vou dar uma olhada nele novamente e atualizar minha resposta se tiver êxito.
Mee,
bom eu acho que a melhor solução é a da @Itay Gal. Pelo que vi, aquele está funcionando.
Mee,