<code>
represents only a "fragment of computer code". It was originally thought for simple code snippets like i++
or <code>
.
<pre>
"represents a block of preformatted text, in which structure is represented by typographic conventions rather than by elements". It's original purpose was nothing more than exactly this: provide a text in the same way it was given by the author, e.g.
+----------------------------------+
| |
| WARNING! PREFORMATED TEXT AHEAD! | =o=
| __; ~^
+----------------TT------------°
|| _____________ _____________________
|| | TO GRANDMA > | TOTALLY NOT A TRAP >
oÖo || |°°°°°°°°°°°° °°°°°°°°°°°°°°°°°°°°°
| ö || | | .mm,
~"""~"""~"""~"""~"""~"""~~"""~"""~"""~"""~"""~"""~"""~"""~"""~""..MWMWc...~"""~""
You don't need to use each with each other. <pre>
has its own roles, like <code>
has its own. However, <pre>
is a way to signalize that the white-space in the given fragment is important, a role that <code>
is missing.
However, back to your question: note the exact wording:
The following example shows how a block of code could be marked up using the pre
and code
elements.
<pre><code class="language-pascal">var i: Integer;
begin
i := 1;
end.</code></pre>
A class is used in that example to indicate the language used.
It says could, not should. You're free to do this how you want. It's not recommended by the W3C in any way, however, I personally recommend you to use <pre><code>...
.
Further explanation
Whenever white-space is part of your code and the structure of your code, you should state that this structure should be kept. As the structure in code is given by typographic conventions (tabs, linefeeds, spaces) I personally recommend you to use <pre><code>
, even if it's arguably more code and another node in the DOM. But whenever missing white-space will render your code imperfect it's necessary.
Apart from that you can easily differ between inline code and code-blocks without checking element.className
, and some JS syntax highlighter work pretty well with <pre><code>...
and strip the <code>
automatically.
Also, if you use a general rule for <code>
with white-space:pre;
, you cannot use it for inline snippets without additional classes. If you were to create a class instead, you've won nothing compared to <pre><code>
.
References
<code>
while does apply a fixed-width font, it does not apply any line-break honoring as<pre>
will. e.g. applying<code>
to formatted code will break the formatting. This is somewhat of an oversight in the original definition of<code>
, and now we're stuck with it for backwards compatibility. – Isoldapre
andcode
elements." – Raggcode
is also useful for inline code strings. But that doesn't makepre
a better solution than CSS for block formatting. – Intercostalwhite-space: pre;
in the css snippet? – Jaramillowhite-space
? :) – Jaramillo