Puntini di sospensione del testo su due righe


117

So che puoi usare una combinazione di regole CSS per far terminare il testo con i puntini di sospensione (...) quando è il momento di traboccare (uscire dai limiti del genitore).

È possibile (sentiti libero di dire semplicemente no) ottenere lo stesso effetto, ma lasciare che il testo vada a capo su più di una riga?

Ecco una demo .

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

Come puoi vedere, il testo termina con i puntini di sospensione quando è più largo della larghezza del div. Tuttavia, c'è ancora spazio sufficiente per il testo per andare a capo su una seconda riga e andare avanti. Questo viene interrotto da white-space: nowrap, che è necessario per il funzionamento dei puntini di sospensione.

Qualche idea?

PS: nessuna soluzione JS, puro CSS se possibile.


Cosa determina "c'è spazio"? Tutto include l'altezza del carattere nei pixel impostati? Cosa succederebbe se un utente finale aumentasse la dimensione del carattere nel proprio browser?
Joel Etherton


@ JoelEtherton Suppongo che spetti al browser decidere e sì, tutto è in pixel nel mio caso.
Tony Bogdanov

Questa può essere una buona soluzione: stackoverflow.com/questions/6222616/…
ivy

Questa è davvero una bella lettura hackingui.com/front-end/…
anandharshan

Risposte:


31

Non sono sicuro che tu abbia visto QUESTO , ma l'eccellente CSS-Tricks.com di Chris Coyier ha pubblicato un collegamento a questo un po 'di tempo fa ed è una pura soluzione CSS che realizza esattamente ciò che cerchi.

(Fare clic per visualizzare su 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);
    }

Ovviamente, essere una pura soluzione CSS significa che è anche piuttosto complicata, ma funziona in modo pulito ed elegante. Presumo che Javascript sia fuori discussione perché è molto più facile da ottenere (e probabilmente più degradabile) con Javascript.

Come bonus aggiuntivo, c'è un file zip scaricabile del processo completo (se vuoi capirlo e tutto il resto), ma anche un file mixin SASS in modo che tu possa piegarlo nel tuo processo facile.

Spero che questo ti aiuti!

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


Ho appena fatto clic sul tuo collegamento Codepen su un telefono Android e ha funzionato in Firefox. Su quale piattaforma / browser non funziona?
dashard

uploady.com/#!/download/kAwBXv1CqXg/PU68wrP6QzGgydlS Sto usando Chrome e non ci sono puntini di sospensione nell'anteprima. Continua ad aggiungere righe di testo, non succede nulla. Dopo quante righe inizierà a mostrare i puntini di sospensione?
coding_idiot

Nel link uploady che hai pubblicato, il testo chiaramente non aveva ancora superato il contenitore. Il testo deve essere troppo grande per visualizzare il contenitore fisso prima che appaiano i puntini di sospensione. Continua ad aggiungere testo per vedere l'effetto.
dashard

@ MarcosPérezGude - non mi sorprende. Alluso a questo con >> "Ovviamente, essere una pura soluzione CSS significa che è anche piuttosto complicata ..." <<
dashard

137

Semplici proprietà CSS possono fare il trucco. Quanto segue è per un'ellissi di tre righe.

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

15
questo non funziona in Firefox. solo chrome, safari e opera
anyavacy

1
secondo caniuse , si dice che "è improbabile che altri browser supportino la proprietà così com'è". Quindi attenzione.
Matan Bobi

tizio liscio .. molto disponibile
Valentino Pereira

4
Funziona con gr8 anche in Firefox
Nisharg Shah

4
Sembra avere un grande supporto ora: caniuse.com/#search=line-clamp
Joao

52

Dai un'occhiata a questa versione 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
È davvero fantastico, peccato che sia solo webkit. Ecco un articolo interessante sull'argomento: css-tricks.com/line-clampin
Tony Bogdanov

Perché ne dichiari due text-overflowe displayregole?
j08691

Un grande WoooW. Non ho mai visto prima il line-clamp
Mike Aron

1
FYI, questo funziona bene anche in Firefox in questi giorni. Ottima soluzione!
Athoxx

solo 1 domanda, quando ho una o due righe di testo le voglio centrate, come faccio, se aggiungo display flex perdo i puntini di sospensione, sembra che funzioni solo se display: -webkit box è impostato
PirateApp

10

Css sotto dovrebbe fare il trucco.

Dopo la seconda riga, il testo conterrà ...

line-height: 1em;
max-height: 2em;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;

questo ha funzionato bene ma ho dovuto aggiungereoverflow:hidden
timhysniu

3

Usa questo se sopra non funziona

 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;

2

La mia soluzione riutilizza quella di amcdnl, ma il mio fallback consiste nell'usare un'altezza per il contenitore di testo:

.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-clampnon funziona per IE11, Edge o Firefox.
Gaʀʀʏ

@ Garry, hai ragione, all'epoca avresti avuto bisogno di una correzione JS, ma ora funziona bene. caniuse.com/#search=webkit-line-clamp
VincentPerrin.com

1

Basandomi su una risposta che ho visto in stackoveflow, ho creato questo mixin MENO ( usa questo link per generare il codice 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

Sembra più elegante combinare due classi. Puoi abbandonare la two-linesclasse se solo una riga deve vedere:

.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

La limitazione a poche righe funzionerà in quasi tutti i browser, ma i puntini di sospensione (3 punti) non verranno visualizzati in Firefox e 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;

Ho trovato una combinazione di entrambi i lavori line-clamp e line-height: D


0

Nella mia app angolare, il seguente stile ha funzionato per me per ottenere i puntini di sospensione sull'overflow del testo sulla seconda riga :

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

Spero che aiuti qualcuno.


0

Per coloro che lavorano in scss , è necessario aggiungere !autoprefixerall'inizio del commento in modo che sia conservato per postcss:

Ho affrontato questo problema, ecco perché pubblicarlo qui

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

Riferimento


0

Puoi utilizzare un effetto dissolto invece di puntini di sospensione, puro CSS e un aspetto più professionale:

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

Qui ho supposto che il tuo colore di sfondo sia bianco.


-1

Questo è un trucco totale, ma funziona:

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

Ha problemi ... potrebbe troncare una lettera goffamente e probabilmente avrà alcuni strani risultati su un sito reattivo.


5
Questa non sarà la soluzione giusta perché se il contenuto è più piccolo, alla fine viene aggiunto anche "...". Violino
Sachin

-1

Ecco un semplice script per gestire i puntini di sospensione utilizzando jQuery. Ispeziona l'altezza reale dell'elemento e crea un nodo originale nascosto e un nodo troncato. Quando l'utente fa clic, passa tra le due versioni.

Uno dei grandi vantaggi è che i "puntini di sospensione" sono vicini all'ultima parola, come previsto.

Se utilizzi soluzioni CSS pure i tre punti appaiono distanti dall'ultima parola.

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 dai un voto negativo a questa soluzione, spiega perché qui, lo apprezzerò.
Matteo Conta

1
OP ha chiesto una soluzione CSS e tu hai offerto jQuery?
dashard

Mi mancava che fosse un requisito forte l'assenza di javascript, nel mio caso la soluzione CSS pura presentava problemi di rendering, la soluzione jQuery mi dava più controllo sul rendering finale e sulla posizione dei puntini di sospensione.
Matteo Conta

Assolutamente d'accordo. Nella mia risposta ho notato che questo era infinitamente più facile da ottenere con JS.
dashard

-3

Non sei sicuro di quale sia il tuo obiettivo, ma vuoi che il testo compaia sulla seconda riga?

Ecco il tuo jsFiddle: http://jsfiddle.net/8kvWX/4/ ha appena rimosso quanto segue:

     white-space:nowrap;  

Non sono sicuro se questo sia ciò che stai cercando o meno.

Saluti,

mee


1
Vuole i puntini di sospensione alla fine della seconda riga, cosa non facile da fare senza JavaScript ...
Marc Audet

@MarcAudet esattamente :)
Tony Bogdanov

Esatto, poiché ho trovato un'altra persona che chiedeva di avere le righe sulla seconda riga e il suo CSS era più o meno lo stesso del tuo, ma la classe puntava invece a un tag ul. Comunque, mi dispiace Tony. Lo rivedrò e aggiornerò la mia risposta se avrò successo.
Mee

beh, penso che la soluzione migliore sia quella di @Itay Gal. Per quanto ho visto, quello funziona.
Mee
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.