¿Cómo envuelvo el texto en una etiqueta previa?


721

pre Las etiquetas son súper útiles para bloques de código en HTML y para depurar la salida al escribir scripts, pero ¿cómo hago para que el texto se ajuste en lugar de imprimir una línea larga?

Respuestas:


1010

La respuesta, de esta página 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+ */
}

77
white-space:pre-line;(y todos los sabores compatibles con el navegador) parece más adecuado en algunos casos (sin pestañas, por ejemplo), ya que quita el espacio al comienzo de la línea (si hay algunos)
MediaVince

55
@MediaVince, pre-linecontrae todos los espacios en blanco (no solo al comienzo de la línea). developer.mozilla.org/en-US/docs/Web/CSS/white-space tiene una tabla que resume el comportamiento de los white-spacevalores.
Paul

1
word-wrap: break-wordno hace lo que pide la pregunta, hace que se formen líneas entre las palabras. Puedes borrar esa línea. En los navegadores modernos, no necesita ninguno de los -mozotros prefijos.
Flimm

141

Esto funciona muy bien para ajustar texto y mantener espacios en blanco dentro de la preetiqueta:

pre {
    white-space: pre-wrap;
}

3
Esto se debe a que solo es CSS 3: consulte la respuesta de adambox para obtener más compatibilidad.
lorem monkey

60

Descubrí que omitir la etiqueta previa y usar espacios en blanco: preenvolver en un div es una mejor solución.

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

3
Más fácil que la respuesta popular. ¡Gracias!
Ricky

44
En mi caso, quería mostrar texto preformateado que contuviera pestañas para formar una tabla. Usé su solución ADEMÁS, agregué una fuente monspace para que todas las columnas estuvieran alineadas:style="white-space: pre-wrap; font-family:monospace;"
Jan

1
Si bien esto podría ser más fácil, podría haber más valor semántico en el uso <pre>de bloques de código.
Angelos Chalaris

2
Sé que llego tarde a este juego, pero ¿por qué esta solución es mejor que configurarla una vez en la hoja de estilo? Tengo múltiples divs en una pantalla de salida HTML que necesitaría esto. Parece que una única solución al elemento en la hoja de estilo soluciona todos los problemas.
webfrogs

1
@webfrogs Sí, sería mejor hacer una clase .prewrap.
Mason240

36

Más sucintamente, esto obliga al contenido a envolverse dentro de una etiqueta "pre" sin romper palabras. ¡Salud!

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

Ver ejemplo en vivo aquí .


20

Esto es lo que necesitaba. Evitó que las palabras se rompieran, pero permitió un ancho dinámico en el área previa.

word-break: keep-all;

17

Sugiero olvidar el pre y simplemente ponerlo en un área de texto.

Su sangría permanecerá y su código no se incluirá en el medio de una ruta o algo así.

También es más fácil seleccionar el rango de texto en un área de texto si desea copiar al portapapeles.

El siguiente es un extracto de php, por lo que si no está en php, la forma de empaquetar los caracteres especiales html variará.

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

Para obtener información sobre cómo copiar texto al portapapeles en js, consulte: ¿Cómo copio al portapapeles en JavaScript? .

Sin embargo...

Acabo de inspeccionar los bloques de código de stackoverflow y se envuelven en una etiqueta <code> envuelta en la etiqueta <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;
}

Además, el contenido de los bloques de código stackoverflow se sintaxis resaltada usando (creo) http://code.google.com/p/google-code-prettify/ .

Es una buena configuración, pero solo voy con textareas por ahora.


13
¿No sería semánticamente incorrecto usar áreas de texto para algo que no sea la entrada? Parece una solución extraña para mí.
Josh M.

2
No es semánticamente incorrecto como agregar un montón de estilos de formato a una etiqueta "pre" cuando "pre" sugiere que el texto contenido está preformateado y, por lo tanto, no requiere formato adicional y debe tomarse tal cual;) Sugiero no Dar prioridad a la "semántica" sobre "funcional".
ekerner

1
No creo que <pre>tenga ningún significado semántico (a diferencia de <code>), simplemente significa que se deben preservar las nuevas líneas y los espacios múltiples.
Flimm

1
Es la abreviatura de "preformateado". ¿Está sugiriendo que en realidad es la abreviatura de nuevas líneas preformateadas y solo espacios múltiples?
ekerner

El tipo de contenido debe especificarse mediante una etiqueta interna, según el tipo de texto preformateado. Recomendaría a
joshperry el

14

Combiné @richelectron y @ user1433454 respuestas.
Funciona muy bien y conserva el formato del texto.

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

</pre>

13

Tu también puedes:

pre { white-space: normal; }

para mantener la fuente monoespacio pero agregar ajuste de texto, o:

pre { overflow: auto; }

lo que permitirá un tamaño fijo con desplazamiento horizontal para líneas largas.


¡Oh, gracias por el recordatorio de desbordamiento! Ideal para pantallas móviles.
XTL

6

Intenta usar

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

O mejor lanzar CSS.


éste parece funcionar en IE 7, pero no 6. ésta es la única sugerencia que parecía prometedor para el IE ... todas las otras sugerencias fueron buenos para otros navegadores ...
topwik

no importa debe haber sido una cosa de almacenamiento en caché del navegador. reinició IE 6 y todo está bien. salud.
topwik

2
El problema con esta solución es que también disolverá los caracteres de nueva línea ... Por ejemplo, cualquier separación de texto en párrafos se perderá.
Chris W.

4

Uso white-space: pre-wrapy algunos prefijos para saltos de línea automáticos dentro de pres.

No lo use word-wrap: break-wordporque esto solo, por supuesto, divide una palabra por la mitad, lo que probablemente es algo que no desea.


3

La mejor forma de navegador cruzado funcionó para mí para obtener saltos de línea y muestra el código o texto exacto: (Chrome, Internet Explorer, Firefox)

CSS:

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

HTML:

<xmp> your text or code </xmp>

Me funcionó muy bien :-)
Wesley Tuzza

77
xmp ha quedado en desuso desde HTML 3.2, se ha eliminado por completo de HTML5 y, para empezar, nunca funcionó correctamente. No se implementó de manera consistente entre los distintos navegadores.
PeterToTheThird

Usando espacios en blanco: pre-wrap; y ajuste de palabra: palabra de interrupción; en mi css, mantiene la sangría de fragmentos (json), la línea previa elimina esto. (Chrome)
Peter Visser

1

Lo siguiente me ayudó:

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

Gracias


3
Creo que es mejor usarlo white-space: pre-wrap;porque respeta los espacios en blanco
Ivan Ferrer Villa

-1

El elemento <pre>significa "texto preformateado" y está destinado a mantener el formato del texto (o lo que sea) entre sus etiquetas. Por lo tanto, en realidad no se pretende tener un ajuste automático de palabras o saltos de línea dentro de la <pre>etiqueta

El texto en un elemento se muestra en una fuente de ancho fijo (generalmente Courier), y conserva espacios y saltos de línea .

fuente: w3schools.com , énfasis hecho por mí mismo.


Simplemente indica el hecho de que es posible ajustar automáticamente el texto dentro de una etiqueta previa, aunque no es la intención de la etiqueta previa ajustar automáticamente.
rob_st

Esta es la única respuesta correcta a la pregunta del autor. Cualquier otra respuesta o posible "solución" fomenta el mal uso del elemento <pre>. Esencialmente, si desea poner el tipo dentro de un elemento <pre> y hacer que se ajuste, use una etiqueta <p> en su lugar y póngale el estilo que desee con una clase CSS.
Markus

No estoy seguro de por qué la gente considera útil dar este tipo de consejo "Soy más inteligente que tú". No, una etiqueta <p> no es un reemplazo adecuado: no conserva espacios en blanco ni saltos de línea. Una etiqueta <pre> es útil para preservar saltos de línea, pero a veces es necesario agregar un ajuste adicional, de la misma manera que cualquier editor de código puede preservar los saltos de línea y agregar un ajuste a las líneas largas.
dwk
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.