2012-08-16 13 views
42

Voglio racchiudere un testo all'interno di due sole righe all'interno di una larghezza specifica. Se il testo va oltre la lunghezza di due righe, allora voglio mostrare gli ellissi. C'è un modo per farlo usando i CSS?Avvolgere un testo all'interno di solo due righe all'interno div

ad es.

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

Grazie

risposta

75

limitando la produzione a due righe di testo è possibile con i CSS, se si imposta la line-height e height dell'elemento, e impostare 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 ---

In alternativa, è possibile utilizzare il CSS text-overflow e white-space corretto legami per aggiungere ellissi, ma questo sembra funzionare solo per una singola riga.

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

e una demo:

--- jsFiddle DEMO ---

Il raggiungimento di entrambi i più righe di testo e di ellissi sembra essere il regno di javascript.

+8

vedo solo una linea che attraversa per qualche motivo:/ – SearchForKnowledge

+0

È questo é piú attuale? – rclai

+0

Il secondo esempio non funziona in IE ... – Weggo

8

credo che la soluzione CSS-only text-overflow: ellipsis si applica ad un solo linea, quindi non sarà possibile percorrere questa rotta:

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

Hai provato http://tpgblog.com/threedots/ per jQuery?

+0

come ho detto, la combinazione di ellissi con più righe di testo non sembra funzionare, almeno non per me in Chrome. – jackwanders

+0

Questo ha funzionato nel mio problema corrente dopo aver aggiunto: 'display: block' e' min-height: 13px' e 'max-height: 26px' per l'impostazione height per un' ' – Underverse

2

Vedere http://jsfiddle.net/SWcCt/.

Basta impostare un line-height la metà del height:

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

Naturalmente, al fine di rendere text-overflow: ellipsis lavoro è inoltre necessario:

overflow:hidden; 
white-space: pre; 
+0

Questa soluzione non è flessibile e richiede una linea manuale rompere il testo sorgente. Nota che http://jsfiddle.net/SWcCt/282/ ogni casella contiene solo una riga di testo. La soluzione desiderata apparirebbe come la seconda casella di http://jsfiddle.net/SWcCt/283/ tranne che con un'ellissi alla fine della seconda riga. –

+0

@JoshuaCoady Un buon punto, ma 'overflow del testo: ellissi 'funziona solo per caselle in linea che superano la casella di riga. Senza 'white-space: pre' andrebbero semplicemente nella casella di riga successiva. E quindi è necessaria una interruzione di linea manuale. Non penso che ci sia una soluzione perfetta. – Oriol

11

Il migliore che ho visto che sono i CSS only and responsive comes from Mobify Developer Blog - CSS Ellipsis: How to Manage Multi-Line Ellipsis in Pure CSS:

JS Fiddle Example

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

La soluzione migliore che ho visto finora. Si potrebbe voler ridurre la variabile di altezza (200px) nel violino, per le mie dimensioni dello schermo inizialmente il testo non ha overflow. –

6

Un'altra soluzione semplice e veloce

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

Il riferimento alla domanda iniziale e la risposta è here

+1

la soluzione migliore è qui! –

2

provare qualcosa lik e questo: 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; 
} 
1

In genere una sola linea di troncare è abbastanza semplice

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

Due linea di troncare è un po 'più difficile, ma può essere fatto con i CSS questo esempio è in 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. */ 
    } 
} 
0

CSS soluzione solo per 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>

Problemi correlati