CSS overflow del testo: puntini di sospensione; non funziona?


368

Non so perché questo semplice CSS non funzioni ...

.app a {
  height: 18px;
  width: 140px;
  padding: 0;
  overflow: hidden;
  position: relative;
  margin: 0 5px 0 5px;
  text-align: center;
  text-decoration: none;
  text-overflow: ellipsis;
  white-space: nowrap;
  color: #000;
}
<div class="app">
  <a href="">Test Test Test Test Test Test</a>
</div>

Dovrebbe tagliare intorno al 4 "Test"




FF only- se filterapplicato, i puntini di sospensione non verranno visualizzati. bug aperto
vsync

1
Ho scritto un post sulla risoluzione dei problemi con text-overflow: brainlessdeveloper.com/2017/07/29/why-wont-my-text-overflow
Fausto NA

1
nel mio caso, rimuovere display: il flex dall'elemento ha aiutato
Eduard

Risposte:


909

text-overflow:ellipsis; funziona solo quando sono vere le seguenti condizioni:

  • La larghezza dell'elemento deve essere limitata in px(pixel). La larghezza in %(percentuale) non funzionerà.
  • L'elemento deve avere overflow:hiddene white-space:nowrapimpostare.

Il motivo per cui hai problemi qui è perché il widthtuo aelemento non è vincolato. Hai widthun'impostazione, ma poiché l'elemento è impostato display:inline(ovvero il valore predefinito) lo ignora e nient'altro ne limita la larghezza.

È possibile risolvere questo problema effettuando una delle seguenti operazioni:

  • Imposta l'elemento su display:inline-blocko display:block(probabilmente il primo, ma dipende dalle tue esigenze di layout).
  • Impostare uno dei suoi elementi contenitore su display:blocke assegnare a quell'elemento un valore fisso widtho max-width.
  • Impostare l'elemento su float:lefto float:right(probabilmente il primo, ma di nuovo, entrambi dovrebbero avere lo stesso effetto per quanto riguarda i puntini di sospensione).

Suggerirei display:inline-block, poiché ciò avrà il minimo impatto collaterale sul layout; funziona in modo molto simile a display:inlinequello attualmente in uso per quanto riguarda il layout, ma sentiti libero di sperimentare anche con gli altri punti; Ho provato a fornire quante più informazioni possibili per aiutarti a capire come queste cose interagiscono insieme; gran parte della comprensione dei CSS riguarda la comprensione di come diversi stili lavorano insieme.

Ecco uno snippet con il tuo codice, con uno display:inline-blockaggiunto, per mostrare quanto eri vicino.

.app a {
  height: 18px;
  width: 140px;
  padding: 0;
  overflow: hidden;
  position: relative;
  display: inline-block;
  margin: 0 5px 0 5px;
  text-align: center;
  text-decoration: none;
  text-overflow: ellipsis;
  white-space: nowrap;
  color: #000;
}
<div class="app">
  <a href="">Test Test Test Test Test Test</a>
</div>

Riferimenti utili:


12
Cosa succede se non riesco a utilizzare la larghezza impostata a causa del design reattivo?
SearchForKnowledge,

5
Si noti che funziona anche la larghezza massima. Questo mi ha aiutato perché avevo un'icona che doveva abbracciare la fine del testo indipendentemente dalla sua larghezza. (Altrimenti l'icona fluttuerebbe verso destra se il testo non occupasse l'intera larghezza dell'intervallo)
Kevin

2
Nota: in white-space: nowraprealtà non è necessario. Possiamo ancora vedere le ellissi anche senza di essa. Per più righe text-overflow, vedi questo SO
gfaceless

24
Non sono sicuro che si tratti di una modifica recente o meno, ma in Chrome 50 (beta) non è necessario impostare la larghezza su un valore px: anche "100%" funziona. white-space: nowrapè richiesto però.
thdoan

13
Non è necessario impostare un valore fisso width. Tutto quello che devi fare è impostare un white-space: nowrap;e funziona perfettamente.
adamj,

37

La risposta accettata è fantastica. Tuttavia, puoi comunque usare %larghezza e raggiungere text-overflow: ellipsis. La soluzione è semplice:

display: inline-block; /* for em, a, span, etc (inline by default) */
text-overflow: ellipsis;
width: calc (80%); /* The trick is here! */

Sembra che ogni volta che lo usi calc, il valore finale sia reso in pixel assoluti, che di conseguenza si converte 80%in qualcosa di simile 800pxa un 1000pxcontenitore -width. Pertanto, anziché utilizzare width: [YOUR PERCENT]%, utilizzare width: calc([YOUR PERCENT]%).


17

Quindi, se raggiungi questa domanda perché stai riscontrando problemi nel tentativo di far funzionare i puntini di sospensione all'interno di un display: flexcontenitore, prova ad aggiungere min-width: 0al contenitore più esterno che trabocca il suo genitore anche se hai già impostato overflow: hiddensu di esso e vedi come funziona per te.

Maggiori dettagli e un esempio funzionante su questo codice di aj-foster . Totalmente fatto il trucco nel mio caso.


2
Ottima soluzione: è anche l'unica pubblicata qui che funziona per un position: stickyelemento all'interno di un display: flexcontenitore.
James Dinsdale,

2
Penso che dovrebbe essere incluso nella risposta selezionata. Ha risolto il mio problema. Grazie!
j0nd0n7,

1
Lei, signore, è un genio.
Nathan Osman,

1
grazie amico, ha salvato la giornata
Umbrella l'

7

Assicurarsi inoltre che word-wrapsia impostato su normale per IE10 e versioni precedenti.

Gli standard indicati di seguito definiscono il comportamento di questa proprietà come dipendente dall'impostazione della proprietà "a capo automatico". Tuttavia, le impostazioni di WordWrap sono sempre efficaci in Windows Internet Explorer perché Internet Explorer non supporta la proprietà "text-wrap".

Quindi, nel mio caso, è word-wrapstato impostato su break-word (ereditato o per impostazione predefinita?) Causando il text-overflowfunzionamento in FF e Chrome, ma non in IE.

ms informazioni sulla proprietà a capo automatico


5

anchor, span... tag sono elementi inline per impostazione predefinita, in caso di elementi in linea widthproprietà non funziona. Quindi devi convertire il tuo elemento in uno inline-blocko in due block levelelementi


5

Includi le quattro righe scritte dopo le informazioni affinché le ellissi funzionino

.app a
{
 color: #fff;
 font: bold 15px/18px Arial;
 height: 18px;
 margin: 0 5px 0 5px;
 padding: 0;
 position: relative;
 text-align: center;
 text-decoration: none;
 width: 140px;

 /* 
 Note: The Below 4 Lines are necessary for ellipsis to work.
 */

 display: block;/* Change it as per your requirement. */
 overflow: hidden;
 text-overflow: ellipsis;
 white-space: nowrap;
}



1

In bootstrap 4 , puoi aggiungere una .text-truncateclasse per troncare il testo con i puntini di sospensione.

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>

<!-- Inline level -->
<span class="d-inline-block text-truncate" style="max-width: 250px;">
  The quick brown fox jumps over the lazy dog.
</span>


1

Deve contenere

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

NON DEVE contenere

display: inline

DOVREBBE contenere

position: sticky

0

Puoi anche aggiungere float: left; all'interno di questa classe #User_Apps_Content .DLD_App a


0

Ho dovuto fare alcune ellissi lunghe descrizioni (prendere solo una corsia) mentre ero reattivo, quindi la mia soluzione era quella di lasciare il testo a capo (invece di white-space: nowrap) e invece di larghezza fissa ho aggiunto altezza fissa:

span {
  display: inline-block;
  line-height: 1rem;
  height: 1rem;
  overflow: hidden;
  // OPTIONAL LINES
  width: 75%;
  background: green;
  //  white-space: normal; default
}
<span>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Commodi quia quod reprehenderit saepe sit. Animi deleniti distinctio dolorum iste molestias reiciendis saepe. Ea eius ex, ipsam iusto laudantium natus obcaecati quas rem repellat temporibus! A alias at, atque deserunt dignissimos dolor earum, eligendi eveniet exercitationem natus non, odit sint sit tempore voluptate. Commodi culpa ex facere id minima nihil nulla omnis praesentium quasi quia quibusdam recusandae repellat sequi ullam, voluptates. Aliquam commodi debitis delectus magnam nulla, omnis sequi sint unde voluptas voluptatum. Adipisci aliquam deserunt dolor enim facilis libero, maxime molestias, nemo neque non nostrum placeat reprehenderit, rerum ullam vel? A atque autem consectetur cum, doloremque doloribus fugiat hic id iste nemo nesciunt officia quaerat quibusdam quidem quisquam similique sit tempora vel. Accusamus aspernatur at au
</span>


0

Questo è il codice che consente che:

overflow: hidden;
text-overflow: ellipsis;

overflow: nascosto è richiesto


0

Ho riscontrato lo stesso problema e sembra che nessuna delle soluzioni di cui sopra funzioni per Safari. Per i browser non safari, funziona perfettamente:

display: block; /* or in-line block according to your requirement */
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;

Per Safari, questo è quello che funziona per me. Tieni presente che la media query per verificare se il browser è Safari potrebbe cambiare nel tempo, quindi cerca di modificare la query multimediale se non funziona per te. Con la line-clampproprietà, sarebbe anche possibile avere più linee nel web con i puntini di sospensione, vedere qui .

// Media-query for Safari-only browser.
@media not all and (min-resolution: 0.001dpcm) {
  @media {
    -webkit-line-clamp: 1;
    -webkit-box-orient: vertical;
    display: -webkit-box;
    white-space: normal;
  }
}

0

https://stackoverflow.com/a/53784508/5626747

Non posso commentare a causa della reputazione, quindi sto facendo un'altra risposta:

In questo caso dovrai anche rimuovere la display: block;proprietà generalmente suggerita dall'elemento su cui hai attivato text-overflow: ellipsis;, altrimenti verrà tagliata senza ... alla fine.


-1

Scrivi questi nella tua regola CSS.

display: block; /* or in-line block according to your requirement */
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;

Puoi anche dare un'occhiata a questo, jsfiddle.net/ManiAnand/5v6pfy9w
Mani Abi Anand

Se è possibile specificare la larghezza, la risposta non è sbagliata. Tutto ciò che hai appena aggiunto al display block nella mia risposta, ho scritto uno snippet, non i codici interi, quindi altre cose possono essere aggiunte ma non hanno nulla a che fare con il problema !! Potete per favore specificare come la mia risposta non è corretta?
Siraj Alam,

1
È necessario specificare la larghezza e il display. Se la larghezza è in percentuale o non specificata e non impostata su unità rigide, l'overflow non sarà vincolato e non funzionerà. Vedi la risposta accettata
jlesse,

La larghezza è già stata impostata dall'op. Ho dato lo snippet da aggiungere nei suoi codici
Siraj Alam il
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.