HTML 提供元素,用來識別程式碼、使用者輸入、程式輸出及變數。
這些元素描述內容的意思,而不只是控制外觀。
| 元素 | 意思 |
|---|---|
<code> | 電腦程式碼片段 |
<pre> | 空白字元具有意義的預先格式化文字 |
<kbd> | 使用者輸入 |
<samp> | 程式或電腦系統的範例輸出 |
<var> | 變數或佔位值 |
例如:
<p>
執行 <code>npm test</code>。
如果成功,終端機會顯示 <samp>All tests passed.</samp>
</p>使用具有語意的元素區分程式碼、輸入及輸出,再另外透過 CSS 控制外觀。
34.1 使用 <code> 標示行內程式碼
使用 <code> 標示一般文字中的程式碼片段:
<p>
使用 <code>document.querySelector()</code> 選取元素。
</p>適合的例子包括:
- 函式名稱。
- HTML 元素名稱。
- CSS 宣告。
- 程式運算式。
- 檔案名稱。
- 其他電腦可讀取的片段。
<p>
將網頁儲存為 <code>index.html</code>。
</p>
<p>
CSS 宣告 <code>display: grid;</code> 會建立網格容器。
</p>瀏覽器通常使用等寬字型顯示程式碼,但預設外觀不是這個元素的主要用途。
不要只為讓一般文章使用等寬字型而加入 <code>。
34.2 使用 <pre><code> 建立程式碼區塊
多行程式碼範例應結合 <pre> 及 <code>:
<pre><code>const greeting = "Hello";
console.log(greeting);</code></pre>兩個元素具有不同作用:
<pre>保留空白字元及換行。<code>識別內容為電腦程式碼。
單用 <code> 不會保留原始格式:
<code>const greeting = "Hello";
console.log(greeting);</code>在一般空白處理規則下,換行會被折疊,而不是顯示為另一行。
<pre> 也可以包含非程式碼內容,例如純文字示意圖或已格式化的程式輸出。它不會自動表示「程式碼區塊」。
34.3 <pre> 中的空白字元
<pre> 內的空白字元通常會影響顯示內容:
<pre><code>if (ready) {
start();
}</code></pre>縮排 HTML 原始碼時應小心:
<pre><code>
if (ready) {
start();
}
</code></pre>這會在 <code> 內加入額外空格及開頭換行。
HTML 剖析會忽略緊接 <pre> 開始標籤後的一個換行字元,但這項規則不適用於巢狀 <code> 開始標籤後的換行。
為了得到可預測的格式,應在 <code> 後立即開始程式碼,並將 </code> 放在最後一個字元之後。
CSS 可以改變空白處理方式,因此應檢查程式碼區塊的樣式。
34.4 轉義程式碼範例中的 HTML
將標記放在 <code> 內,不會阻止瀏覽器將它當成 HTML 剖析。
以下寫法不會按字面顯示段落元素的原始碼:
<!-- 如果要按字面顯示 HTML 原始碼,這種寫法並不正確。 -->
<code><p>Hello</p></code>應將標記字元轉義:
<code><p>Hello</p></code>完整範例:
<pre><code><button type="button">
儲存
</button></code></pre>常用字元參照包括:
| 要顯示的字元 | HTML 原始碼 |
|---|---|
< | < |
> | > |
& | & |
" | " |
元素文字中的引號通常不需要轉義,但在屬性值內可能需要。
如果要顯示字面文字 <,應轉義它的 &:
<code><</code>程式碼標記不是安全容納未轉義 HTML 的容器。
34.5 使用 <kbd> 標示使用者輸入
使用 <kbd> 標示使用者提供的輸入:
<p>
按 <kbd>Enter</kbd> 提交指令。
</p>鍵盤快捷鍵可以分別標示每個按鍵:
<p>
按 <kbd><kbd>Ctrl</kbd> + <kbd>S</kbd></kbd> 儲存。
</p>外層 <kbd> 表示完整輸入組合,內層元素表示個別按鍵。
<kbd> 不限於實體鍵盤輸入,也可以描述其他使用者輸入,例如語音指令:
<p>
說出 <kbd>開始錄音</kbd> 即可開始。
</p>應選擇符合實際應用程式及平台的說明和例子。不同作業系統的快捷鍵可能不同。
34.6 使用 <samp> 標示程式輸出
使用 <samp> 標示程式或電腦系統的輸出:
<p>
終端機顯示 <samp>Build completed successfully.</samp>
</p>多行輸出可以配合 <pre>:
<pre><samp>Checking files...
No errors found.
Build complete.</samp></pre>應區分操作指示與結果:
<p>
輸入 <kbd>python --version</kbd>。
輸出可能是 <samp>Python 3.x.x</samp>。
</p>在這個例子中:
<kbd>識別使用者輸入的內容。<samp>識別系統返回的內容。
討論同一指令的語法,而不是要求使用者輸入時,可以改用 <code>。
34.7 使用 <var> 標示變數
使用 <var> 標示程式設計、數學或說明文字中的變數:
<p>
函式返回 <var>result</var>。
</p>它也可以識別讀者必須替換的佔位值:
<p>
開啟 <code>/users/<var>user-id</var>/profile</code>,
並將 <var>user-id</var> 替換為使用者識別碼。
</p>瀏覽器通常以斜體顯示 <var>,但它不是通用斜體元素。
完整原始碼通常不需要為每個變數加入 <var>。應使用 <code> 標示程式碼範例,並在識別變數或佔位值有助說明時才使用 <var>。
34.8 識別程式語言
HTML 沒有為 <code> 提供專用的程式語言屬性。
常見慣例是使用類別:
<pre><code class="language-javascript">const total = 12;
console.log(total);</code></pre>語法高亮工具可能識別以下類別:
language-htmllanguage-csslanguage-javascriptlanguage-python
這些類別名稱本身不會產生語法高亮。
不要使用 lang 識別程式語言:
<!-- lang 的錯誤用法。 -->
<code lang="javascript">const total = 12;</code>lang 識別的是英文或日文等自然語言,不是程式語言。
34.9 語法高亮與可讀性
語法高亮是可選功能。可閱讀的程式碼區塊不一定需要它。
實用樣式包括:
pre {
max-width: 100%;
overflow-x: auto;
padding: 1rem;
border: 1px solid #767676;
border-radius: 0.5rem;
background: #f5f7fa;
white-space: pre;
tab-size: 2;
}
code,
kbd,
samp {
font-family: ui-monospace, monospace;
}應考慮:
- 提供足夠的文字對比度。
- 不要只用顏色傳達重要意思。
- 在有需要時保留縮排。
- 避免讓可見行號混入複製的程式碼。
- 在狹窄螢幕上測試較長範例。
可以接受自動換行的範例:
pre.wrap {
white-space: pre-wrap;
overflow-wrap: anywhere;
}自動換行可以改善內容的顯示適配,但也可能令原始碼結構較難理解。應根據範例選擇處理方式。
34.10 無障礙功能與動態程式碼內容
具有語意的程式碼元素有助描述內容,但不保證輔助技術能清晰讀出程式語法。
支援情況各有不同,標點符號的讀法也可能取決於使用者設定。
應在範例旁提供說明:
<p>
這個例子選取第一個按鈕,並將它停用。
</p>
<pre><code>const button = document.querySelector("button");
button.disabled = true;</code></pre>水平捲動區塊應讓鍵盤使用者在有需要時能夠進入及捲動。可取得焦點並具有有意義標籤的 <pre> 是其中一種方式:
<pre tabindex="0" role="region" aria-label="JavaScript 範例"><code>console.log("Hello");</code></pre>應按需要使用,而不是為每個簡短範例加入不必要的 Tab 停留點。
透過 JavaScript 插入程式碼時,應使用 textContent 提供字面文字:
const example = document.getElementById("code-example");
example.textContent = '<button type="button">儲存</button>';不要使用 innerHTML 插入不可信的程式碼字串:
// 如果 sourceCode 包含不可信標記,這種寫法不安全。
example.innerHTML = sourceCode;<code> 不會清理內容。語法高亮工具也必須安全處理輸入。
34.11 完整範例:程式碼、輸入與輸出
以下獨立網頁示範 HTML 程式碼區塊、鍵盤指令、範例輸出及變數佔位值。
範例只作為文字顯示,不會執行。
id: hong-kong-html-computer-code
name: 電腦程式碼標記 — 範例
type: html
content: |-
<!doctype html>
<html lang="zh-Hant-HK">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta
name="description"
content="示範如何使用 HTML 標示程式碼、使用者輸入、程式輸出及變數。"
>
<title>電腦程式碼標記 | HTML 範例</title>
<style>
*,
*::before,
*::after {
box-sizing: border-box;
}
body {
margin: 0;
color: #222;
background: #f5f7fa;
font-family: system-ui, sans-serif;
line-height: 1.8;
}
main {
max-width: 46rem;
margin-inline: auto;
padding: 2rem 1rem;
}
h1,
h2 {
color: #005ea8;
line-height: 1.4;
}
section {
min-width: 0;
margin-block: 1.5rem;
padding: 1.25rem;
border: 1px solid #767676;
border-radius: 0.5rem;
background: white;
}
section > h2 {
margin-block-start: 0;
}
code,
kbd,
samp {
font-family: ui-monospace, monospace;
}
p code {
padding: 0.1em 0.25em;
border-radius: 0.2rem;
background: #eaf2f8;
}
pre {
max-width: 100%;
overflow-x: auto;
padding: 1rem;
border: 1px solid #767676;
border-radius: 0.4rem;
background: #f5f7fa;
font-size: 1rem;
line-height: 1.6;
white-space: pre;
tab-size: 2;
}
kbd {
padding: 0.1em 0.35em;
border: 1px solid #767676;
border-radius: 0.2rem;
background: #f5f7fa;
}
:focus-visible {
outline: 3px solid #005ea8;
outline-offset: 3px;
}
</style>
</head>
<body>
<main>
<h1>電腦程式碼標記</h1>
<p>
以下例子區分程式碼、使用者輸入、
程式輸出及可替換的值。
</p>
<section aria-labelledby="html-heading">
<h2 id="html-heading">HTML 原始碼</h2>
<p>
這個例子建立一個可見標籤為「儲存」的按鈕。
下方標記只作為文字顯示,不會呈現為按鈕。
</p>
<pre
tabindex="0"
role="region"
aria-label="HTML 按鈕原始碼"
><code class="language-html" translate="no"><button type="button">
儲存
</button></code></pre>
<p>
<code>type="button"</code> 屬性識別
預設不會提交表單的按鈕。
</p>
</section>
<section aria-labelledby="input-heading">
<h2 id="input-heading">使用者輸入</h2>
<p>
如果已安裝 Python,而且可以透過
<code>python</code> 執行,
請在終端機輸入
<kbd translate="no">python --version</kbd>,
然後按 <kbd translate="no">Enter</kbd>。
</p>
</section>
<section aria-labelledby="output-heading">
<h2 id="output-heading">範例輸出</h2>
<p>
終端機會顯示已安裝的版本。
以下只是示範用的佔位文字:
</p>
<pre><samp translate="no">Python 3.x.x</samp></pre>
</section>
<section aria-labelledby="variable-heading">
<h2 id="variable-heading">可替換的值</h2>
<p>
在 <code translate="no">/users/<var>user-id</var>/profile</code> 中,
將 <var translate="no">user-id</var>
替換為相關使用者的識別碼。
</p>
</section>
</main>
</body>
</html>在這個範例中:
<pre><code>保留並識別多行原始碼。- HTML 字元經過轉義,讓範例按字面顯示。
<kbd>識別指令及按鍵操作。<samp>識別示範用的程式輸出。<var>識別可替換的值。translate="no"要求翻譯工具保留電腦可讀取的文字。- 程式碼區塊具有焦點提示,並可以水平捲動。
- 不需要 JavaScript 或語法高亮函式庫。
34.12 常見錯誤
| 錯誤 | 較好的做法 |
|---|---|
| 只使用等寬字型,沒有語意標記 | 按需要選擇 <code>、<kbd> 或 <samp> |
以為 <code> 會保留換行 | 配合 <pre> 使用 |
| 將原始 HTML 直接貼入程式碼範例 | 轉義標記字元 |
以為 <pre> 會阻止 HTML 剖析 | 在其中也應轉義標記 |
| 意外在程式碼周圍加入縮排 | 控制區塊內的空白字元 |
使用 lang 識別程式語言 | 使用適當的類別慣例 |
將 <var> 當成通用斜體元素 | 只用於變數及佔位值 |
| 只用顏色提供說明 | 加入清晰文字及語意結構 |
| 長程式碼在小螢幕上無法存取 | 提供適當捲動或自動換行 |
透過 innerHTML 插入不可信字串 | 使用 textContent 顯示字面程式碼 |
| 以為程式碼標記會令範例執行 | 另外安全地實作執行功能 |
本章總結: 使用 <code> 標示電腦程式碼、<pre> 保留有意義的空白字元、<kbd> 標示使用者輸入、<samp> 標示系統輸出,以及 <var> 標示變數或佔位值。應轉義要顯示的標記,保持範例可讀,並且不要將程式碼元素視為不可信內容的安全邊界。















