CSS può forzare un'interruzione di riga dopo ogni parola in un elemento?


159

Sto costruendo un sito multilingue, con il proprietario che mi aiuta con alcune traduzioni. Alcune delle frasi visualizzate richiedono interruzioni di riga per mantenere lo stile del sito.

Sfortunatamente, il proprietario non è un ragazzo di computer, quindi se vede foo<br />barc'è la possibilità che modificherà i dati in qualche modo mentre sta traducendo.

Esiste una soluzione CSS (oltre a modificare la larghezza) da applicare a un elemento che si spezzerebbe dopo ogni parola?

(So ​​di poterlo fare in PHP, ma mi chiedo se esiste un trucco ingegnoso che non conosco nei CSS per realizzare la stessa cosa, forse nelle funzionalità di CJK.)

MODIFICARE

Proverò a rappresentare ciò che sta accadendo:

----------------          ----------------
| Short Word   |          | Gargantuan   |
|              |          | Word         |
----------------          ----------------

La parola lunga si spezza automaticamente, la parola breve no. Voglio che assomigli a questo:

----------------          ----------------
| Short        |          | Gargantuan   |
| Word         |          | Word         |
----------------          ----------------

2
In HTML, gli elementi si rompono dopo ogni parola, quando la larghezza di un dato elemento lo richiede. Intendi con parole?
Paul D. Waite,

@Paul - No, ho bisogno di una soluzione che non si basi sul fissare la larghezza. Il problema è che alcune frasi sono più lunghe e si spezzano automaticamente (come descrivi tu) e alcune frasi sono più brevi e non si rompono, facendo una presentazione incoerente.
Ben

@Paul - Sì, è come descrivi esattamente. Non danneggiare davvero il layout, ma potrebbe avere un aspetto migliore.
Ben

potresti usare la spaziatura delle parole ma influirebbe su tutte le parole. Penso che non puoi andare in giro avvolgendo quelle parole in elementi di span.
giovedì

@meo - Sembra così, grazie per il pensiero
Ben

Risposte:


261

Uso

.one-word-per-line {
    word-spacing: <parent-width>; 
}

.your-classname{
    width: min-intrinsic;
    width: -webkit-min-content;
    width: -moz-min-content;
    width: min-content;
    display: table-caption;
    display: -ms-grid;
    -ms-grid-columns: min-content;
}

dove <parent-width>è la larghezza dell'elemento genitore (o un valore alto arbitrario che non rientra in una riga). In questo modo puoi essere sicuro che c'è anche un'interruzione di riga dopo una singola lettera. Funziona con Chrome / FF / Opera / IE7 + (e probabilmente anche IE6 poiché supporta anche la spaziatura delle parole).


Questa è sicuramente la migliore risposta imho
Hezad,

31
@ToniMichelCaubet La risposta è davvero difficile da interpretare, ma significa: .parent { word-spacing: 100px; }dov'è 100pxla larghezza dell'elemento genitore. Il problema è che questa soluzione non funziona se si dispone di un genitore fluido.
John Kurlak,

5
Basta impostare un valore molto elevato per la spaziatura delle parole come word-spacing: 100000pxe non dovrai preoccuparti che il genitore sia fluido in termini di larghezza. L'impostazione di una spaziatura delle parole del 100% avrebbe avuto senso (sarebbe stata del 100% della larghezza del genitore), ma i valori espressi in percentuale non sono supportati per quella proprietà css.
sboisse,

1
Questo è stato molto utile. L'ho usato in una situazione reattiva, dove ad una larghezza voglio che il testo nelle schede si avvolga in modo che siano tutti della stessa altezza: word-spacing: 2em; e a una larghezza mobile voglio che siano a riga singola:word-spacing: unset;
Will

1
Questo è fantastico Da anni in futuro, grazie mille :)
Lucas Medina,

124

La risposta fornita da @HursVanBloob funziona solo con un contenitore padre a larghezza fissa, ma non riesce in caso di contenitori larghezza fluido .

Ho provato molte proprietà, ma nulla ha funzionato come previsto. Alla fine sono giunto alla conclusione che dare word-spacingun valore enorme funziona perfettamente.

p { word-spacing: 9999999px; }

oppure, per i browser moderni è possibile utilizzare l' vwunità CSS (larghezza visiva in% della dimensione dello schermo).

p { word-spacing: 100vw; }

questo è quello che cercherò di fare!
Vaskort,

Questa è un'ottima soluzione!
Joe Conlin,

Si interrompe completamente con & nbsp; anche se.
Matt Fletcher,

2
Beh, non funziona per me che rende la larghezza del fluido del contenitore molto alta.
Onza,

@Onza puoi condividere un link violino, che mostra il tuo problema?
Deepak Yadav il

37

Una soluzione alternativa è descritta sulla frase separata per una parola per riga , applicando display:table-caption;all'elemento


Questo in realtà raggruppa solo le parole in base alla larghezza della parola più lunga.
James South

1
Sebbene questo possa raggruppare le parole su una linea, funziona davvero bene in molte situazioni e non sembra così confuso come la massiccia opzione di spaziatura delle parole.
Dale,

1
Questo è quello che ha funzionato perfettamente per me, bello!
Matt Fletcher,

1
Non dà alcun risultato
jafarbtech

32

Prova a usare white-space: pre-line;. Crea un'interruzione di riga ovunque venga visualizzata un'interruzione di riga nel codice, ma ignora gli spazi bianchi extra (tabulazioni e spazi ecc.).

Innanzitutto, scrivi le tue parole su righe separate nel tuo codice:

<div>Short
Word</div>

Quindi applica lo stile all'elemento che contiene le parole.

div { white-space: pre-line; }

Fai attenzione , ogni interruzione di riga nel codice all'interno dell'elemento creerà un'interruzione di riga. Quindi la scrittura di quanto segue comporterà un'interruzione di riga aggiuntiva prima della prima parola e dopo l'ultima parola:

<div>
    Short
    Word
</div>

C'è un ottimo articolo su Trucchi CSS che spiega gli altri attributi degli spazi bianchi.


Dovresti spiegare come white-spacepuò essere usato per rispondere alla domanda. Scusa, ma non vedo come.
jlgrall,

2
Bene, l'articolo su CSS Tricks lo spiega completamente, quindi ho pensato che sarebbe bastato un link, piuttosto che cercare di rigurgitare la risposta qui.
Nass

Ok, quindi suggerisci di inserire interruzioni di riga reali nell'origine e di utilizzare il " white-space: pre;" CSS per visualizzare quelle interruzioni di riga come <pre>farebbe un tag? Ciò potrebbe funzionare e un'interruzione di linea dovrebbe sembrare più naturale per i traduttori di a <br />. Proverò a modificare la tua risposta per aggiungerla :)
jlgrall

Esattamente. Bene, in realtà, white-space: pre-line;sarebbe probabilmente più appropriato, poiché ignora gli spazi bianchi extra nel tuo codice. Aggiornerò la risposta.
Nass

Bene, forse aggiungi solo white-space: pre;per IE 7.
jlgrall

12

Se vuoi essere in grado di scegliere tra diverse soluzioni, oltre alle risposte fornite ...

Un metodo alternativo è quello di dare al contenitore una larghezza di 0 e assicurarsi che l'overflow sia visibile. Quindi ogni parola traboverà da essa e sarà sulla sua stessa riga.

div {
  width: 0;
  overflow: visible;
}
<div>Short Word</div>
<hr>
<div>Gargantuan Word</div>

Oppure puoi usare uno di quei widthvalori appena proposti , purché esistano ancora quando leggi questo.

div {
  width: min-intrinsic;       /* old Chrome, Safari */
  width: -webkit-min-content; /* less old Chrome, Safari */
  width: -moz-min-content;    /* current Firefox */
  width: min-content;         /* current Chrome, Safari; not IE or Edge */
}
<div>Short Word</div>
<hr>
<div>Gargantuan Word</div>


4

Non puoi scegliere come target ogni parola nei CSS. Tuttavia, con un po 'di jQuery probabilmente potresti.

Con jQuery puoi racchiudere ogni parola in a <span>e quindi impostare CSS span sudisplay:block cui inserirla su una propria riga.

In teoria ovviamente: P


Sì, ne avevo paura. Potrebbe farlo anche in PHP ma sembra una brutta soluzione. Stavo pensando che potrebbe esserci qualche :first-childtrucco o qualcosa là fuori ...
Ben

@Steve: no, i selettori CSS attualmente consentono solo di selezionare elementi HTML, non nodi di testo. Ho dato un'occhiata al modulo di testo CSS 3 , ma non sembra esserci nulla che costringa una pausa dopo ogni parola in un elemento. La soluzione di Mark è la soluzione migliore.
Paul D. Waite,

@Paul, @Mark - Se uno di voi ragazzi vuole il rappresentante, potreste dare una risposta e io accetterò. Lo segnerò come senza risposta (per ora) per meta.stackoverflow.com/questions/48013/… .
Ben

Penso che Mark abbia già fatto una risposta, tutto il rappresentante è suo per quanto mi riguarda.
Paul D. Waite,

@Paul - +1 giocatore di squadra dà al ragazzo un distintivo o qualcosa del genere :)
Ben

2

https://jsfiddle.net/bm3Lfcod/1/

Per coloro che cercano una soluzione che funzioni all'interno di un contenitore padre flessibile con un figlio flessibile in entrambe le dimensioni. per esempio. pulsanti della barra di navigazione.

//the parent (example of what it may be)
div {
  display:flex;
  width: 100%;
}

//The children
a {
  display: inline-block;
}

//text wrapper
span {
  display: table-caption;
}

Prova a dare a quell'intervallo qualsiasi altra CSSproprietà che puoi dare. Di 'una proprietà che potrebbe causarebrowser reflow
Deepak Yadav il

1
riflusso del browser?
Onza,

2

Ho affrontato lo stesso problema e nessuna delle opzioni qui mi ha aiutato. Alcuni servizi di posta non supportano stili specifici. Ecco la mia versione, che ha risolto il problema e funziona ovunque ho controllato:

<table>
    <tr>
        <td width="1">Gargantuan Word</td>
    </tr>
</table>

O usando CSS:

<table>
    <tr>
        <td style="width:1px">Gargantuan Word</td>
    </tr>
</table>

2

La migliore soluzione è la word-spacingproprietà.

Aggiungi <p>in un contenitore con una dimensione specifica (esempio 300px) e dopo aver aggiunto quella dimensione come valore nella spaziatura di parole.

HTML

<div>
 <p>Sentence Here</p>
</div>

CSS

div {
 width: 300px;
}

p {
 width: auto;
 text-align: center;
 word-spacing: 300px;
}

In questo modo, la tua frase sarà sempre spezzata e impostata in una colonna, ma il punto del paragrafo sarà dinamico.

Ecco un esempio Codepen


-1

Nel mio caso,

    word-break: break-all;

ha funzionato alla perfezione, spero che aiuti qualsiasi altro nuovo arrivato come me.


A -1 da parte mia perché questa è una risposta errata. Questo interrompe la linea di ogni personaggio SE necessario.
Emobe
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.