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.


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/


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;

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;

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;

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

-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;

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);
}

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>


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; 
}

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


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.


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


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.


-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.


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>


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


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,
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.