pre
tags are super-useful for code blocks in HTML and for debugging output while writing scripts, but how do I make the text word-wrap instead of printing out one long line?
The answer, from this page in 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+ */
}
pre-line
collapses all whitespace (not just at the beginning of the line). developer.mozilla.org/en-US/docs/Web/CSS/white-space has a table summarizing the behavior of white-space
values. –
Lawton word-wrap: break-word
does not do what the question is asking for, it causes line wraps to happen even in between words. You can delete that line. On modern browsers, you don't need any of the -moz
or other prefixes. –
Danadanae word-wrap: break-word
is the only way I can get Gmail Notifier Pro to break the lines (and it doesn't break words in half). This means the program uses an older IE engine, it seems. See here for a confirmation this is the white-space
replacement in IE 5.5-7 (not 5.5+, says Mozilla): developer.mozilla.org/pt-BR/docs/Web/CSS/overflow-wrap. –
Cubitiere white-space: pre-wrap
alone works fine in all browsers. –
Polynuclear This works great to wrap text and maintain white-space within the pre
-tag:
pre {
white-space: pre-wrap;
}
word-wrap: break-word;
. –
Radioactive I've found that skipping the pre tag and using white-space: pre-wrap on a div is a better solution.
<div style="white-space: pre-wrap;">content</div>
style="white-space: pre-wrap; font-family:monospace;"
–
Conclude <pre>
for code blocks. –
Legit Most succinctly, this forces content to wrap inside of a pre
tag without breaking words.
pre {
white-space: pre-wrap;
word-break: keep-all
}
word-wrap: break-word;
fixes the issue. –
Inapposite I combined @richelectron and @user1433454 answers.
It works very well and preserves the text formatting.
<pre style="white-space: pre-wrap; word-break: keep-all;">
</pre>
This is what I needed. It kept words from breaking but allowed for dynamic width in the pre area.
word-break: keep-all;
I suggest forget the pre and just put it in a textarea.
Your indenting will remain and your code wont get word-wrapped in the middle of a path or something.
Easier to select text range in a text area too if you want to copy to clipboard.
The following is a php excerpt so if your not in php then the way you pack the html special chars will vary.
<textarea style="font-family:monospace;" onfocus="copyClipboard(this);"><?=htmlspecialchars($codeBlock);?></textarea>
For info on how to copy text to the clipboard in js see: How do I copy to the clipboard in JavaScript? .
However...
I just inspected the stackoverflow code blocks and they wrap in a <code> tag wrapped in <pre> tag with 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;
}
Also the content of the stackoverflow code blocks is syntax highlighted using (I think) http://code.google.com/p/google-code-prettify/ .
Its a nice setup but Im just going with textareas for now.
<pre>
has any semantic meaning (unlike <code>
), it simply means that newlines and multiple spaces should be preserved. –
Danadanae You can either:
pre { white-space: normal; }
to maintain the monospace font but add word-wrap, or:
pre { overflow: auto; }
which will allow a fixed size with horizontal scrolling for long lines.
This is what you need to wrap text inside pre tag:
pre {
white-space: pre-wrap; /* css-3 */
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+ */
}
-moz-pre-wrap
any more (they shouldn't, per specs). –
Pallbearer Use white-space: pre-wrap
and vendor prefixes for automatic line breaking inside pre
s.
Do not use word-wrap: break-word
because this just, of course, breaks a word in half which is probably something you do not want.
Try using
<pre style="white-space:normal;">.
Or better throw CSS.
You can combine white-space: pre-wrap;
with overflow-wrap: anywhere;
if your text contains very long words.
A word will be broken even if there is no white-space available to break the line.
pre {
white-space: pre-wrap;
overflow-wrap: anywhere;
}
<pre>
HelloHelloHelloHelloHelloHelloHelloHello HelloHelloHelloHelloHelloHelloHelloHello HelloHelloHelloHelloHelloHelloHelloHello HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello
</pre>
The <pre>
-Element stands for "pre-formatted-text" and is intended to keep the formatting of the text (or whatever) between its tags. Therefore it is actually not inteded to have automatic word-wrapping or line-breaks within the <pre>
-Tag
Text in a element is displayed in a fixed-width font (usually Courier), and it preserves both spaces and line breaks.
source: w3schools.com, emphasises made by myself.
<pre>
, in fact, is only guaranteed to render in a monospaced font available on the system. If you want to force the specific use of Courier, just add the font-family
to the CSS styling of <pre>
. Assuming that you like Courier, of course. Which I don't. –
Pallbearer The Best Cross Browser Way worked for me to get line breaks and shows exact code or text: (chrome, internet explorer, Firefox)
CSS:
xmp{ white-space:pre-wrap; word-wrap:break-word; }
HTML:
<xmp> your text or code </xmp>
xmp
is deprecated and removed in HTML5 (see @PeterToTheThird's answer). xmp
was also an evil source for some exploits. –
Pallbearer The following helped me:
pre {
white-space: normal;
word-wrap: break-word;
}
Thanks
white-space: pre-wrap;
because it respects white spaces –
Danndanna in case your using prism or any code formatting library, then you will need to modify booth pre and code tags as follow:
pre {
overflow-x: auto !important;
white-space: pre-wrap !important; /* Since CSS 2.1 */
white-space: -moz-pre-wrap !important; /* Mozilla, since 1999 */
white-space: -pre-wrap !important; /* Opera 4-6 */
white-space: -o-pre-wrap !important; /* Opera 7 */
word-wrap: break-word !important; /* Internet Explorer 5.5+ */
}
code{
white-space: normal !important;
}
!important
has its caveats, but it's worth mentioning in your answer (since nobody else does!). Additionally, it would be nice if you could explain why, in this case, !important
is... important! :-) –
Pallbearer <pre>
does it's work, but for code there is <code>
tag.
<kbd>
; and to show terminal output, you get <samp>
; and there are a few more... it's all about semantics. Which are important in HTML! –
Pallbearer © 2022 - 2024 — McMap. All rights reserved.
white-space:pre-line;
(and all browser compatible flavors) seems more adequate in some cases (without tabs for instance) as it takes away the space at the beginning of the line (if there are some) – Taiga