必须用samp而非code或pre的场景是:内容为程序直接生成的原始文本、真实出现在终端/控制台/GUI中、上下文明确为“输出”而非说明或模拟示例。

什么时候必须用 samp 而不是 code 或 pre
只在内容同时满足三个条件时才该用 samp:它是程序运行后**直接生成的原始文本**、**真实出现在终端/控制台/GUI中**、上下文明确是“输出”而非说明或示例。比如 git status 回显的 nothing to commit, working tree clean ✅;而 API 返回的 {"error": "timeout"} ❌——那是响应体,得用 pre 套 code。
常见误判点:
- 把
console.log("done")的输出done包进samp,但没说明“这是 Chrome DevTools Console 里实际打印出来的”,语义就断裂了 - 教程里写“运行后会看到如下输出”,然后贴一段人工编写的模拟结果,这不算真实输出,不该用
samp - 把命令本身(如
ls -la)和它的输出混在一起用一个samp包裹,应拆开:kbd标命令,samp标结果
samp 多行输出必须套 pre,否则换行和空格全丢
samp 是内联元素,浏览器会把换行符、多个空格、Tab 合并为单个空格。所以像 Python 的 print("A\nB") 输出,写成 <samp>A\nB</samp> 会显示成 A B(同一行)。
正确做法是用 pre 包裹 samp:
立即学习“前端免费学习笔记(深入)”;
<pre><samp>Traceback (most recent call last): File "test.py", line 1, in <module> 1/0 ZeroDivisionError: division by zero</samp></pre>
注意:pre 本身无语义,只是保留空白;samp 才负责传达“这是程序输出”的含义。两者组合才是语义 + 格式双达标。
samp 默认不强制等宽字体,CSS 必须显式声明
浏览器对 samp 的默认样式极弱,仅可能设 font-family: monospace,但这个行为容易被全局 CSS 覆盖(比如重置库清掉了内联元素字体,或父容器设置了 sans-serif)。
实操建议:
- 检查开发者工具中
samp元素的“计算样式”,确认font-family真的是monospace或系统等宽栈 - 统一加 CSS:
samp { font-family: ui-monospace, 'SFMono-Regular', Consolas, 'Liberation Mono', monospace; white-space: pre-wrap; } - 避免只用
"Courier New"这类 Windows 专属字体,优先用跨平台系统级等宽栈 - 不要依赖
samp自带样式上线,显式声明才可靠
samp 不能嵌套 code,但可含 strong 或 em
W3C 明确禁止 code 嵌套在 samp 内。因为 code 表示源码片段,samp 表示运行结果,混用等于说“输出里还夹着代码”,语义冲突。
但 samp 可以安全包含短语级元素,比如强调错误关键词:
<samp>Error: <strong>Permission denied</strong>: /tmp/cache</samp>
这种写法合法,且对屏幕阅读器友好——它仍被识别为一段程序输出,其中“Permission denied”被加强语义。但以下写法错误:
<samp>Run <code>npm install</code> first</samp>
这里 npm install 是用户要执行的命令,不是输出,应拆到外面用 kbd 或 code 单独标。


















