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?

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

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;
}

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>

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 .


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;

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.


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>

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.


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.


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.


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>

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


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.