Come avvolgere il testo in un pre tag?


721

pre i tag sono super utili per blocchi di codice in HTML e per il debug dell'output durante la scrittura di script, ma come faccio a racchiudere il testo anziché a stampare una riga lunga?

Risposte:


1010

La risposta, da questa pagina nel CSS:

pre {
    white-space: pre-wrap;       /* Since CSS 2.1 */
    white-space: -moz-pre-wrap;  /* Mozilla, since 1999 */
    white-space: -pre-wrap;      /* Opera 4-6 */
    white-space: -o-pre-wrap;    /* Opera 7 */
    word-wrap: break-word;       /* Internet Explorer 5.5+ */
}

7
white-space:pre-line;(e tutte le versioni compatibili con il browser) sembra più adeguato in alcuni casi (senza schede ad esempio) in quanto toglie lo spazio all'inizio della riga (se ce ne sono)
MediaVince

5
@ MediaVince, pre-linecomprime tutti gli spazi bianchi (non solo all'inizio della riga). developer.mozilla.org/en-US/docs/Web/CSS/white-space ha una tabella che riassume il comportamento dei white-spacevalori.
Paul,

1
word-wrap: break-wordnon fa ciò che la domanda chiede, fa sì che si verifichino avvolgimenti di riga anche tra le parole. Puoi eliminare quella riga. Sui browser moderni, non hai bisogno di nessuno dei -mozprefissi o di altri.
Flimm,

141

Funziona benissimo per avvolgere il testo e mantenere gli spazi bianchi all'interno del pretag:

pre {
    white-space: pre-wrap;
}

3
Questo perché è solo CSS 3: vedi la risposta di adambox per maggiore compatibilità.
Lorem Monkey,

60

Ho scoperto che saltare il pre tag e usare white-space: pre-wrap su un div è una soluzione migliore.

 <div style="white-space: pre-wrap;">content</div>

3
Più facile della risposta popolare. Grazie!
Ricky,

4
Nel mio caso, volevo mostrare un testo preformattato che conteneva delle schede per creare una tabella. Ho usato la vostra soluzione PLUS ho aggiunto un carattere monspace quindi tutte le colonne sono state allineate:style="white-space: pre-wrap; font-family:monospace;"
Jan

1
Sebbene ciò possa essere più semplice, potrebbe esserci più valore semantico nell'uso <pre>dei blocchi di codice.
Angelos Chalaris,

2
So che sono in ritardo in questo gioco, ma perché questa soluzione è meglio che impostarla una volta nel foglio di stile? Ho più div su una schermata di output HTML che avrebbe bisogno di questo. Sembra che una singola correzione per l'elemento nel foglio di stile risolva tutti i problemi.
webfrog

1
Sì, fare una classe .prewrap sarebbe la cosa migliore.
Mason240,

36

Più succintamente, questo costringe il contenuto ad avvolgersi all'interno di un tag "pre" senza rompere le parole. Saluti!

pre {
  white-space: pre-wrap;
  word-break: keep-all
}

Vedi esempio dal vivo qui .


20

Questo è quello di cui avevo bisogno. Evitava che le parole si spezzassero, ma consentiva una larghezza dinamica nell'area pre.

word-break: keep-all;

17

Suggerisco di dimenticare il pre e inserirlo in un'area di testo.

Il rientro rimarrà e il codice non verrà racchiuso tra parole nel mezzo di un percorso o qualcosa del genere.

È più facile selezionare l'intervallo di testo anche in un'area di testo se si desidera copiare negli Appunti.

Quello che segue è un estratto di php, quindi se non sei in php, il modo in cui impacchetterai i caratteri speciali html varierà.

<textarea style="font-family:monospace;" onfocus="copyClipboard(this);"><?=htmlspecialchars($codeBlock);?></textarea>

Per informazioni su come copiare il testo negli Appunti in js vedere: Come si copia negli Appunti in JavaScript? .

Però...

Ho appena ispezionato i blocchi di codice dello stackoverflow e sono stati inseriti in un tag <code> racchiuso in un tag <pre> con css ...

code {
  background-color: #EEEEEE;
  font-family: Consolas,Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace,serif;
}
pre {
  background-color: #EEEEEE;
  font-family: Consolas,Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace,serif;
  margin-bottom: 10px;
  max-height: 600px;
  overflow: auto;
  padding: 5px;
  width: auto;
}

Anche il contenuto dei blocchi di codice dello stackoverflow è evidenziato mediante la sintassi (credo) http://code.google.com/p/google-code-prettify/ .

È una buona configurazione, ma per ora sto solo usando textareas.


13
L'uso delle aree di testo per qualcosa di diverso dall'input non sarebbe semanticamente errato? Sembra una strana soluzione per me.
Josh M.,

2
Non semanticamente errato come l'aggiunta di un sacco di stili di formattazione a un tag "pre" quando "pre" suggerisce che il testo contenuto è preformattato e quindi non richiede formattazione aggiuntiva e deve piuttosto essere preso così com'è;) Suggerisco di non farlo dare la priorità "semantica" a "funzionale".
ekerner,

1
Non credo <pre>abbia alcun significato semantico (a differenza di <code>), significa semplicemente che le nuove linee e gli spazi multipli dovrebbero essere preservati.
Flimm,

1
È l'abbreviazione di "preformattato". Stai suggerendo che in realtà è l'abbreviazione di pre-formattato-newline-e-multiple-space-only?
ekerner,

Il tipo di contenuto deve essere specificato da un tag interno, a seconda del tipo di testo preformattato. Vorrei indirizzare i miei amici alla pagina wiki pre-tag di w3c: w3.org/wiki/HTML/Elements/pre
joshperry,

14

Ho combinato le risposte di @richelectron e @ user1433454.
Funziona molto bene e conserva la formattazione del testo.

<pre  style="white-space: pre-wrap; word-break: keep-all;">

</pre>

13

Puoi:

pre { white-space: normal; }

per mantenere il carattere monospace ma aggiungere la parola a capo automatico oppure:

pre { overflow: auto; }

che consentirà una dimensione fissa con scorrimento orizzontale per le linee lunghe.


Oh, grazie per il promemoria di overflow! Ottimo per display mobili.
XTL

6

Prova a usare

<pre style="white-space:normal;">. 

O meglio lanciare CSS.


questo sembra funzionare in IE 7 ma non 6. questo è l'unico suggerimento che sembrava promettente per IE ... tutti gli altri suggerimenti erano buoni per altri browser ...
topwik

nevermind deve essere stato un problema di memorizzazione nella cache del browser. riavviato IE 6 e tutto va bene. Saluti.
topwik,

2
Il problema con questa soluzione è che dissolverà anche i caratteri di nuova riga ... Ad esempio, qualsiasi separazione del testo in paragrafi andrà persa.
Chris W.,

4

Utilizzare white-space: pre-wrape alcuni prefissi per l'interruzione automatica della linea all'interno di pres.

Non usare word-wrap: break-word perché questo, ovviamente, rompe una parola a metà che probabilmente è qualcosa che non vuoi.


3

Il modo migliore Cross Browser ha funzionato per me per ottenere interruzioni di riga e mostra codice o testo esatti: (Chrome, Internet Explorer, Firefox)

CSS:

xmp{ white-space:pre-wrap; word-wrap:break-word; }

HTML:

<xmp> your text or code </xmp>

Ha funzionato alla grande per me :-)
Wesley Tuzza il

7
xmp è stato deprecato da HTML 3.2, è stato completamente rimosso da HTML5 e non ha mai funzionato correttamente all'inizio. Non è stato implementato in modo coerente tra i vari browser.
PeterToTheThird

Utilizzo di white-space: pre-wrap; e parola-a capo: parola d'ordine; nel mio css, mantiene il rientro di (json) snippet, pre line rimuove questo. (Chrome)
Peter Visser,

1

Quanto segue mi ha aiutato:

pre {
    white-space: normal;
    word-wrap: break-word;
}

Grazie


3
Penso che sia meglio usarlo white-space: pre-wrap;perché rispetta gli spazi bianchi
Ivan Ferrer Villa,

-1

Il <pre>-Element sta per "pre-formattato-text" e ha lo scopo di mantenere la formattazione del testo (o altro) tra le sue etichette. Pertanto, in realtà non si prevede di avere un ritorno a <pre>capo automatico o interruzioni di riga all'interno di -Tag

Il testo in un elemento viene visualizzato in un carattere a larghezza fissa (solitamente Courier) e conserva sia gli spazi che le interruzioni di riga .

fonte: w3schools.com , enfasi fatta da me stesso.


Indica semplicemente il fatto che è possibile eseguire il wrapping automatico del testo all'interno di un pre-tag sebbene non sia intenzione del pre-tag eseguire il wrapping automatico.
rob_st

Questa è l'unica risposta corretta alla domanda dell'autore. Qualsiasi altra risposta o possibile "soluzione" incoraggia l'uso improprio dell'elemento <pre>. In sostanza, se vuoi mettere il tipo all'interno di un elemento <pre> e farlo avvolgere, usa invece un tag <p> e lo stile come preferisci con una classe CSS.
Markus,

Non sono sicuro del motivo per cui le persone trovano utile dare questo tipo di consiglio "Sono più intelligente di te". No, un tag <p> non è un sostituto adatto: non conserva né spazi bianchi né interruzioni di riga. Un tag <pre> è utile per preservare le interruzioni di riga, ma a volte è necessario aggiungere un wrapping aggiuntivo, allo stesso modo in cui qualsiasi editor di codice può preservare sia le interruzioni di riga sia aggiungere il wrapping alle righe lunghe.
domenica
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.