<code> vs <pre> vs <samp> for inline and block code snippets</samp></pre></code>

时间:2011-01-06 03:55:44

标签: html semantic-markup

我的网站将有一些内联代码(“使用foo()函数时...”)和一些块代码段。这些往往是XML,并且有很长的行,我更喜欢浏览器包装(即,我不想使用<pre>)。我还想在块片段上添加CSS格式。

似乎我不能同时使用<code>,因为如果我在其上放置CSS块属性(使用display: block;),它将破坏内联片段。

我很好奇人们在做什么。使用<code>表示块,<samp>表示内联?使用<code><blockquote>或类似的东西?

我想让实际的HTML尽可能简单,避免使用类,因为其他用户会维护它。

9 个答案:

答案 0 :(得分:321)

对于可以换行的内联代码使用<code>,对于不能换行的块代码使用<pre><code><samp>用于示例输出,因此我会避免使用它来表示示例代码(读者将输入)。这就是Stack Overflow的功能。

(更好的是,如果你想要易于维护,让用户将文章编辑为Markdown,那么他们就不必记得使用<pre><code>。)

HTML5在“the pre element”

中同意这一点
  

pre元素表示预格式化文本块,其中结构由印刷约定而不是元素表示。

     

可以使用pre元素的一些示例:

     
      
  • 包括计算机代码片段,其结构根据该语言的惯例表示。
  •   
     

[...]

     

为了表示计算机代码块,pre元素可以与代码元素一起使用;为了表示计算机输出块,pre元素可以与samp元素一起使用。类似地,kbd元素可以在pre元素中使用,以指示用户要输入的文本。

     

在下面的代码段中,提供了一个计算机代码示例。

<p>This is the <code>Panel</code> constructor:</p>
<pre><code>function Panel(element, canClose, closeHandler) {
  this.element = element;
  this.canClose = canClose;
  this.closeHandler = function () { if (closeHandler) closeHandler() };
}</code></pre>

答案 1 :(得分:71)

我完全错过的东西:<pre>的非包装行为可以用CSS控制。所以这给出了我想要的确切结果:

code { 
    background: hsl(220, 80%, 90%); 
}

pre {
    white-space: pre-wrap;
    background: hsl(30,80%,90%);
}
Here's an example demonstrating the <code>&lt;code&gt;</code> tag.

<pre>
Here's a very long pre-formatted formatted using the &lt;pre&gt; tag. Notice how it wraps?  It goes on and on and on and on and on and on and on and on and on and on...
</pre>

http://jsfiddle.net/9mCN7/

答案 2 :(得分:36)

我个人使用<code>,因为这是最正确的语义。然后,为了区分内联代码和块代码,我要添加一个类:

<code class="inlinecode"></code>

用于内联代码或:

<code class="codeblock"></code>

代码块。取决于哪种不太常见。

答案 3 :(得分:14)

使用(过时的)<xmp>标记显示HTML代码,按原样

<xmp>
    <input placeholder='write something' value='test'>
</xmp>

很遗憾这个标签已被弃用,但是它仍然适用于浏览器,它是一个坏标签。没有必要逃避它内部的任何东西。多么快乐!

答案 4 :(得分:13)

对于正常内联<code>使用:

<code>...</code>

并且对于需要阻止<code>的每个地方,使用

<code style=display:block;white-space:pre-wrap>...</code>

或者,为明细衬砌块<code>(无类别)定义<codenza>标记

<script>
</script>
<style>
  codenza, code {}     /*  noop mnemonic aide that codenza mimes code tag  */
  codenza {display:block;white-space:pre-wrap}
</style>`

测试: (注意:以下是使用data: URI协议/方案的scURIple,因此%0A nl格式代码必需保留,当剪切并粘贴到URL栏时用于测试 - 所以view-source: ctrl - U )在下面的每个行之前看起来很好%0A

data:text/html;charset=utf-8,<html >
<script>document.write(window.navigator.userAgent)</script>
<script></script>
<style>
  codenza, code {}     /*  noop mnemonic aide that codenza mimes code tag  */
  codenza {display:block;white-space:pre-wrap}
</style>
<p>First using the usual &lt;code> tag
<code>
  %0A     function x(arghhh){ 
  %0A          return "a very long line of text that will extend the code beyond the boundaries of the margins, guaranteed for the most part, well maybe without you as a warrantee (except in abnormally conditioned perverse environs in which case a warranty is useless)"
  %0A     }
</code>
and then 
<p>with the tag blocked using pre-wrapped lines
<code style=display:block;white-space:pre-wrap> 
  %0A     function x(arghhh){ 
  %0A          return "a very long line of text that will extend the code beyond the boundaries of the margins, guaranteed for the most part, well maybe without you as a warrantee (except in abnormally conditioned perverse environs in which case a warranty is useless)"
  %0A     }
</code>
<br>using an ersatz tag
<codenza>
  %0A     function x(arghhh){ 
  %0A          return "a very long line of text that will extend the code beyond the boundaries of the margins, guaranteed for the most part, well maybe without you as a warrantee (except in abnormally conditioned perverse environs in which case a warranty is useless)"
 %0A     }
</codenza>
</html>

答案 5 :(得分:4)

考虑TextArea

人们通过Google发现这一点,并寻找更好的方法来管理其代码段的显示,还应考虑<textarea>,它可以对宽度/高度进行大量控制,滚动等。注意@vsync提到了已弃用的内容标记<xmp>,我发现<textarea readonly>是显示HTML的绝佳替代品,无需在其中转义任何内容(除非</textarea>可能出现在其中)。

例如,要显示包含受控换行的单行,请考虑<textarea rows=1 cols=100 readonly> 您的html或其他字符,包括制表符和CrLf&#39> </textarea>

&#13;
&#13;
<textarea rows=5 cols=100 readonly>Example text with Newlines,
tabs & space,
  html tags etc <b>displayed</b>.
    However, note that &amp; still acts as an escape char..
      Eg: &lt;u&gt;(text)&lt;/u&gt;
</textarea>
&#13;
&#13;
&#13;

比较所有...

&#13;
&#13;
<h2>Compared: TEXTAREA, XMP, PRE, SAMP, CODE</h2>
<p>Note that CSS can be used to override default fixed space fonts in each or all these.</p>
    
    
<textarea rows=5 cols=100 readonly>TEXTAREA: Example text with Newlines,
tabs & space,
  html tags etc <b>displayed natively</b>.
    However, note that &amp; still acts as an escape char..
      Eg: &lt;u&gt;(text)&lt;/u&gt;</textarea>

<xmp>XMP: Example text with Newlines,
tabs & space,
  html tags etc <b>displayed natively</b>.
    However, note that &amp; (&) will not act as an escape char..
      Eg: &lt;u&gt;(text)&lt;/u&gt;
</xmp>

<pre>PRE: Example text with Newlines,
tabs & space,
  html tags etc <b>are interpreted, not displayed</b>.
    However, note that &amp; still acts as an escape char..
      Eg: &lt;u&gt;(text)&lt;/u&gt;
</pre>

<samp>SAMP: Example text with Newlines,
tabs & space,
  html tags etc <b>are interpreted, not displayed</b>.
    However, note that &amp; still acts as an escape char..
      Eg: &lt;u&gt;(text)&lt;/u&gt;
</samp>

<code>CODE: Example text with Newlines,
tabs & space,
  html tags etc <b>are interpreted, not displayed</b>.
    However, note that &amp; still acts as an escape char..
      Eg: &lt;u&gt;(text)&lt;/u&gt;
</code>
&#13;
&#13;
&#13;

答案 6 :(得分:3)

这是一个纯文本、非 JavaScript 化的 HTML 解决方案,它使用起来非常简单,而且优于使用 <pre><code> 元素,或者是笨手笨脚的 JavaScript总是矫枉过正的解决方案。我已经使用这个技巧20年了!它适用于所有新旧浏览器。今天的孩子们只是没能学会旧的方法。

它允许您的用户快速剪切和粘贴代码示例。它还允许您快速、轻松地将代码放入 HTML 元素中,而无需转义使用 < 时通常必须执行的所有 ><code> 字符。< /p>

使用 <textarea> 元素共享代码,如下所示:

<textarea class="code" contenteditable="true" spellcheck="false" aria-label='Code Sample'>
  My Sample Bookmark:
  <a href="#bookmark1" id="b1" title="View my bookmark" target="_blank" rel="noreferrer nofollow noopener" accesskey="a" tabindex="0" aria-label="Bookmark">Got to My Bookmark</a>
</textarea>

...使用一些简单的 CSS 样式...

<style>
        textarea.code {
            display: block;
            width: 90%;
            min-height: 5em;
            overflow-y: auto;
            overflow-x: hidden;
            font-family: monospace;
            border: 1px solid #bbb;
            padding: 1em;
            white-space:pre-wrap;
        }
</style>

请注意,它看起来像常规的等宽 <code>,但它是块级的,支持 <pre> 等文本格式,长文本现在换行,代码框大小可控,并允许更灵活地显示大用户可以更轻松地访问 HTML 或脚本块。

顺便说一句......你仍然可以使用<pre><code>。我仍然为较小的例子做。并且不要担心使用 <textarea> 的语义或可访问性问题,因为它是一个被替换的元素并且具有更通用的用途。如果您担心,只需在您的 <textarea> 中添加一个 ARIA 标签,就像我上面所做的那样。

答案 7 :(得分:2)

考虑Prism.js:https://prismjs.com/#examples

它使<pre><code>正常工作并且具有吸引力。

答案 8 :(得分:0)

这对我来说可以在前端显示代码:

<style>
.content{
    height:50vh;
    width: 100%;
    background: transparent;
    border: none;
    border-radius: 0;
    resize: none;
    outline: none;
}
.content:focus{
    border: none;
    -webkit-box-shadow: none;
    -moz-box-shadow: none;
    box-shadow: none;
}
</style>

<textarea class="content">
<div>my div</div><p>my paragraph</p>
</textarea>

观看实时演示:https://jsfiddle.net/bytxj50e/