¿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?

adambox
fuente

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+ */
}
adambox
fuente
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;
}
Richard McKechnie
fuente
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>
Mason240
fuente
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í .

Erin Delacroix
fuente
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;
usuario1433454
fuente
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.

ekerner
fuente
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>
vovahost
fuente
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.

Bobby Jack
fuente
¡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.

Eduardo Campañó
fuente
é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.

FryingggPannn
fuente
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>
feacco
fuente
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

prashant2402
fuente
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.

rob_st
fuente
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