Comment encapsuler du texte dans une balise pré?

721

pre les balises sont super utiles pour les blocs de code en HTML et pour le débogage de la sortie lors de l'écriture de scripts, mais comment puis-je faire le retour à la ligne du texte au lieu d'imprimer une longue ligne?

adambox
la source

Réponses:

1010

La réponse, à partir de cette page en 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+ */
}
adambox
la source
7
white-space:pre-line;(et toutes les versions compatibles avec le navigateur) semble plus adéquat dans certains cas (sans onglets par exemple) car il enlève de l'espace au début de la ligne (s'il y en a)
MediaVince
5
@MediaVince, pre-lineréduit tous les espaces (pas seulement au début de la ligne). developer.mozilla.org/en-US/docs/Web/CSS/white-space dispose d'un tableau résumant le comportement des white-spacevaleurs.
Paul
1
word-wrap: break-wordne fait pas ce que la question demande, il provoque des sauts de ligne même entre les mots. Vous pouvez supprimer cette ligne. Sur les navigateurs modernes, vous n'avez besoin d'aucun -mozou d'autres préfixes.
Flimm
141

Cela fonctionne très bien pour encapsuler le texte et maintenir l'espace blanc dans le pre-tag:

pre {
    white-space: pre-wrap;
}
Richard McKechnie
la source
3
C'est parce que c'est uniquement CSS 3 - voir la réponse d'Adambox pour plus de compatibilité.
lorem monkey
60

J'ai trouvé que sauter la balise pre et utiliser l'espace blanc: pré-envelopper sur une div est une meilleure solution.

 <div style="white-space: pre-wrap;">content</div>
Mason240
la source
3
Plus simple que la réponse populaire. Merci!
Ricky
4
Dans mon cas, je voulais montrer un texte pré formaté qui contenait des onglets pour constituer un tableau. J'ai utilisé votre solution PLUS J'ai ajouté une police monspace donc toutes les colonnes ont été alignées:style="white-space: pre-wrap; font-family:monospace;"
Jan
1
Bien que cela puisse être plus facile, l'utilisation <pre>de blocs de code peut être plus sémantique .
Angelos Chalaris
2
Je sais que je suis en retard dans ce jeu, mais pourquoi cette solution est-elle meilleure que de la définir une fois dans la feuille de style? J'ai plusieurs divs sur un écran de sortie HTML qui en auraient besoin. Il semble qu'une seule correction de l'élément dans la feuille de style résout tous les problèmes.
webfrogs
1
@webfrogs Oui, il serait préférable de créer une classe .prewrap.
Mason240
36

Plus succinctement, cela force le contenu à s'enrouler à l'intérieur d'une balise «pré» sans casser les mots. À votre santé!

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

Voir l'exemple en direct ici .

Erin Delacroix
la source
20

Voilà ce dont j'avais besoin. Il empêchait les mots de se casser mais permettait une largeur dynamique dans la zone de pré.

word-break: keep-all;
user1433454
la source
17

Je suggère d'oublier le pré et de le mettre dans une zone de texte.

Votre retrait restera et votre code ne sera pas enveloppé de mots au milieu d'un chemin ou quelque chose.

Sélectionnez plus facilement la plage de texte dans une zone de texte si vous souhaitez la copier dans le presse-papiers.

Ce qui suit est un extrait de php, donc si vous n'êtes pas en php, la façon dont vous emballerez les caractères spéciaux html variera.

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

Pour plus d'informations sur la façon de copier du texte dans le presse-papiers en js, voir: Comment copier dans le presse-papiers en JavaScript? .

Toutefois...

Je viens d'inspecter les blocs de code stackoverflow et ils enveloppent dans une balise <code> enveloppée dans une balise <pre> avec 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;
}

De plus, le contenu des blocs de code stackoverflow est la syntaxe mise en évidence en utilisant (je pense) http://code.google.com/p/google-code-prettify/ .

C'est une bonne configuration mais je vais juste avec des zones de texte pour l'instant.

ekerner
la source
13
L'utilisation de zones de texte pour autre chose que la saisie ne serait-elle pas sémantiquement incorrecte? Cela me semble une solution bizarre.
Josh M.
2
Pas aussi sémantiquement incorrect que l'ajout d'un tas de styles de mise en forme à une balise "pre" lorsque "pre" suggère que le texte contenu est pré-formaté et ne nécessite donc pas de mise en forme supplémentaire et doit plutôt être pris tel quel;) Je suggère de ne pas privilégier la "sémantique" par rapport à la "fonctionnelle".
ekerner
1
Je ne pense pas <pre>avoir de sens sémantique (contrairement <code>), cela signifie simplement que les nouvelles lignes et les espaces multiples doivent être préservés.
Flimm
1
Son abréviation de "pré-formaté". Vous suggérez que c'est en fait court pour les nouvelles lignes et les espaces multiples pré-formatés uniquement?
ekerner
Le type de contenu est censé être spécifié par une balise interne, selon le type de texte pré-formaté. Je recommanderais mes amis à la page wiki du pré-tag w3c: w3.org/wiki/HTML/Elements/pre
joshperry
14

J'ai combiné les réponses @richelectron et @ user1433454.
Cela fonctionne très bien et préserve la mise en forme du texte.

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

</pre>
vovahost
la source
13

Vous pouvez soit:

pre { white-space: normal; }

pour conserver la police monospace mais ajouter un retour à la ligne, ou:

pre { overflow: auto; }

ce qui permettra une taille fixe avec défilement horizontal pour les longues lignes.

Bobby Jack
la source
Oh, merci pour le rappel de débordement! Idéal pour les écrans mobiles.
XTL
6

Essayez d'utiliser

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

Ou mieux jeter CSS.

Eduardo Campañó
la source
celui-ci semble fonctionner dans IE 7 mais pas 6. c'est la seule suggestion qui semblait prometteuse pour IE ... toutes les autres suggestions étaient bonnes pour les autres navigateurs ...
topwik
nevermind doit avoir été une chose de mise en cache du navigateur. redémarré IE 6 et tout va bien. à votre santé.
topwik
2
Le problème avec cette solution est qu'elle dissoudra également les caractères de nouvelle ligne ... Par exemple, toute séparation de texte en paragraphes sera perdue.
Chris W.18
4

Utilisez white-space: pre-wrapet certains préfixes pour le saut de ligne automatique à l'intérieur de pres.

Ne l'utilisez pas, word-wrap: break-wordcar cela brise bien sûr un mot en deux, ce qui est probablement quelque chose que vous ne voulez pas.

FryingggPannn
la source
3

Le meilleur moyen de navigation croisée a fonctionné pour moi pour obtenir des sauts de ligne et affiche le code ou le texte exact: (Chrome, Internet Explorer, Firefox)

CSS:

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

HTML:

<xmp> your text or code </xmp>
feacco
la source
Fonctionne très bien pour moi :-)
Wesley Tuzza
7
xmp est obsolète depuis HTML 3.2, a été complètement supprimé de HTML5 et n'a jamais fonctionné correctement au départ. Il n'a pas été implémenté de manière cohérente entre les différents navigateurs.
PeterToTheThird
Utilisation de l'espace blanc: pré-emballage; et retour à la ligne: break-word; dans mon css, conserve l'indentation des extraits (json), la pré-ligne supprime cela. (Chrome)
Peter Visser
1

Ce qui m'a aidé:

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

Merci

prashant2402
la source
3
Je pense qu'il vaut mieux l'utiliser white-space: pre-wrap;car il respecte les espaces blancs
Ivan Ferrer Villa
-1

Le <pre>-Element signifie « pré-formaté texte » et est destiné à maintenir la mise en forme du texte (ou autre) entre ses balises. Par conséquent, il n'est en fait pas prévu d'avoir un retour automatique à la ligne ou des sauts de ligne dans le <pre>-Tag

Le texte d'un élément est affiché dans une police à largeur fixe (généralement Courier) et il préserve les espaces et les sauts de ligne .

source: w3schools.com , souligne le fait par moi-même.

rob_st
la source
Il indique simplement le fait qu'il est possible d'encapsuler automatiquement le texte dans une pré-étiquette, bien que l'intention de la pré-étiquette ne soit pas automatiquement enveloppée.
rob_st
C'est la seule réponse correcte à la question de l'auteur. Toute autre réponse ou "solution" possible encourage l'utilisation abusive de l'élément <pre>. Essentiellement, si vous souhaitez mettre du type à l'intérieur d'un élément <pre> et le faire encapsuler, utilisez plutôt une balise <p> et stylisez-le comme vous le souhaitez avec une classe CSS.
Markus
Je ne sais pas pourquoi les gens trouvent utile de donner ce genre de conseil "Je suis plus intelligent que toi". Non, une balise <p> n'est pas un remplacement approprié: elle ne préserve ni les espaces ni les sauts de ligne. Une balise <pre> est utile pour préserver les sauts de ligne, mais il est parfois nécessaire d'ajouter un habillage supplémentaire, de la même manière que n'importe quel éditeur de code peut à la fois conserver les sauts de ligne et ajouter l'habillage aux longues lignes.
dwk