---
title: "行内代码"
description: "句子里的一段代码，使用代码字体，字号随周围的文本而定，带淡淡的填充或不带填充。它是文本，从不是控件。"
url: "https://tanrei.chnotchy.com/zh-cn/components/inline-code/"
last_updated: 2026-10-23T21:17:12.000Z
---

# 行内代码

> 句子里的一段代码，使用代码字体，字号随周围的文本而定，带淡淡的填充或不带填充。它是文本，从不是控件。

## 概览

行内代码在句子里指出代码中的某样东西：一条命令、一个属性、一个文件、一个值。供人阅读和复制的多行代码用[代码块](https://tanrei.chnotchy.com/zh-cn/components/code-block/)。要按的键用[键盘快捷键](https://tanrei.chnotchy.com/zh-cn/components/keyboard-shortcut/)，它会读出修饰键的名称。

### 用法

在 Web 上，行内代码不是一个元素，而是加在你自己的 `code` 元素上的一个类。文字就在文档里，所以在任何脚本运行之前，搜索、页面内查找和复制都能用。`.tanrei-prose` 里每个不在 `pre` 中的 `code` 不加类也会以同样的方式绘制，所以渲染出来的 Markdown 什么都不用加。

SwiftUI、Compose、Flutter 和 React Native 尚在计划中：本页开头各平台旁边的名称是规格为它们定下的，这些平台目前还没有提供任何实现。

**Web**

```html
<link rel="stylesheet" href="@tanrei/web/tokens.css" />
<link rel="stylesheet" href="@tanrei/web/code.css" />

<!-- Tonal：默认。 -->
<p>请先运行 <code class="tanrei-code" translate="no" spellcheck="false">npm install</code>。</p>

<!-- Plain：只有代码字体，颜色与周围的文本相同。 -->
<code class="tanrei-code" data-variant="plain">comp.button.container.shape</code>

<!-- 由祖先元素为其中的每一段代码做选择。 -->
<table data-tanrei-code="plain">
  <tr><td><code class="tanrei-code">variant</code></td><td><code class="tanrei-code">filled</code></td></tr>
</table>
```

**React**

```tsx
import '@tanrei/web/code.css';

<p>请先运行 <code className="tanrei-code" translate="no" spellCheck={false}>npm install</code>。</p>
```

| 属性 | 在 Web 上 |
| --- | --- |
| `text` | 元素自己的内容 |
| `variant: tonal` | `data-variant="tonal"` |
| `variant: plain` | `data-variant="plain"` |
| `variant: auto`（默认） | 不加属性。由最近的带 `data-tanrei-code="plain"` 或 `"tonal"` 的祖先元素决定；没有这样的祖先元素时为 tonal |

## 规格

行内代码没有自己的字号。它的字号是所在文本的字号乘以一个比例（`comp.inline-code.label.scale`），这个比例让代码字体和正文字体看起来一样大。在正文里是 14 旁边的 13。在标题里则是标题自己的字号。

它绝不会把所在的行撑高。填充与代码字体自身的文本框一样高，上下没有内边距。

一段代码随所在的行换行。它先在空格处断开。不含空格又比一行还长的部分在字符之间断开，并且不加连字符，因为连字符会改变代码。它绝不截断，也绝不滚动。

在链接里，它采用链接的颜色，链接的下划线从它下面穿过。在加粗文本里，它加重一档字重。它绝不倾斜。

它始终从左到右排列，自成一段，在从右到左的句子里也是如此。

- Category: Communication
- Level: base
- Listing: default
- Page: https://tanrei.chnotchy.com/components/inline-code/
- Spec: https://github.com/chnotchy/tanrei/blob/main/specs/inline-code.spec.json

### Availability

| Design system | Has it | Notes |
| --- | --- | --- |
| Tanrei (`tanrei`) | Yes | — |
| Cupertino (Apple HIG-inspired) (`cupertino`) | Yes | — |
| M3 Expressive-like (Material 3 Expressive-inspired) (`m3-expressive-like`) | Yes | — |
| M3-like (Material 3-inspired) (`m3-like`) | Yes | — |

### Platforms

- Web: the class `tanrei-code` on the product's own element, styled by `@tanrei/web/code.css`.

| Platform | Name | Status |
| --- | --- | --- |
| Web | `tanrei-code` | lagging |
| SwiftUI | `TanreiInlineCode` | planned |
| Jetpack Compose | `TanreiInlineCode` | planned |
| Flutter | `TanreiInlineCode` | planned |
| React Native | `InlineCode` | planned |

Names a platform gives in its own idiom:

| Spec | Web | SwiftUI | Jetpack Compose | Flutter | React Native |
| --- | --- | --- | --- | --- | --- |
| `text` (prop) | `textContent` | `text` | `text` | `text` | `children` |
| `variant` (prop) | `data-variant` | `variant` | `variant` | `variant` | `variant` |

Statuses: `planned` — In the inventory. Nothing shippable exists yet. `lagging` — An implementation of an earlier spec exists; it has not caught up with the current one. `alpha` — Implemented with tests. The API may still change. `beta` — Feature complete and at parity. Only fixes are expected. `stable` — Covered by semantic versioning. `deprecated` — Still shipped; scheduled for removal.

### Anatomy

- `container` (optional): The fill behind the text in the tonal form: as tall as the code face's own text box, with small corners and a little room at each end of every piece of the run. Decorative; the plain form has none.
- `label`: The code: its characters exactly as given, in the code face.
- `outline` (optional): An edge around the fill, where a design system gives it a width. The default system draws none.

### Props

| Prop | Type | Default | Description |
| --- | --- | --- | --- |
| `text` | `string` | `""` | The code: the characters exactly as they are to be read and copied ("npm install", "comp.button.container.shape"). Spaces inside it are kept. |
| `variant` | `enum`: `auto`, `tonal`, `plain` | `"auto"` | How the run is set apart. tonal: the code face on a faint fill. plain: the code face alone, in the color of the text around it, for a column or a list whose every entry is code and for text on a colored container. auto, the default, takes what the nearest ancestor chooses for the inline code inside it, and tonal where none does. |

### States

`enabled`

### Accessibility

- Role: `code`
- Labeling: Inline code has no name of its own: it is text, read in its sentence. Its role is code where the platform has one (the web's code element); elsewhere it is plain text. Nothing announces its form.
- Minimum target size: yes

- Not interactive: inline code takes no input and no focus (ICD-11), so there is no target to size; minimumTarget holds trivially. Inside a link it is part of that link's text and target.
- Told from the words around it by its face, not by color (WCAG 1.4.1): the fill is decorative, and the plain form and forced colors (ICD-14) draw none.
- Contrast in the default system: the tonal form's text is on-surface on surface-container-highest, and a link's color on that fill is held at the same ratio — both by the token invariants that hold text roles at 4.5:1 on every surface (7:1 in the high-contrast schemes). The plain form has the contrast of the text it sits in.
- The tonal form's fill is a surface role, so it is correct on a surface. On a colored container (a callout, an inverse tooltip, a filled button) the text color of ICD-3 is not paired with that container's content color: use plain there. A component that hosts text on such a container chooses plain for the inline code inside it (ICD-5).
- Screen readers do not announce the code role by default, so a sentence must make sense when the code is read as words. Symbols are read as the person's settings say; write a name out in the sentence where its spelling matters.
- It reflows (WCAG 1.4.10): a long name breaks rather than scroll the page (ICD-6, ICD-15). No hyphen is added, because a hyphen would change the code.
- Keys to press are a keyboard shortcut, which reads modifier names aloud; inline code would read the characters.

### Behaviour

Requirements in EARS form, each with its stable id.

- **ICD-1** THE inline code SHALL set its text in the family, the weight and the letter spacing of comp.inline-code.label.typescale, at the font size of the text it sits in multiplied by comp.inline-code.label.scale — whatever that text is: a paragraph, a heading of any level, a lead paragraph, a caption, a label, a table cell — and SHALL NOT take the font size or the line height of the code role itself.
- **ICD-2** THE inline code SHALL sit on the baseline of the text it is part of, as a part of that text's line, and SHALL NOT make that line taller or change the distance between lines (PRS-17); its fill, where it has one, SHALL be as tall as the code face's own text box (from its ascent to its descent at the drawn size) and SHALL NOT be padded above or below.
- **ICD-3** WHILE the inline code is drawn tonal (ICD-5) THE inline code SHALL draw behind its text a fill of comp.inline-code.container.color with corners comp.inline-code.container.shape eased by sys.shape.corner-smoothing, extend that fill by comp.inline-code.container.padding-inline before the first and after the last character, draw its text in comp.inline-code.label.color, and, where comp.inline-code.outline.width is above 0, draw an edge of that width in comp.inline-code.outline.color inside the fill; it SHALL draw no elevation.
- **ICD-4** WHILE the inline code is drawn plain (ICD-5) THE inline code SHALL draw no fill, no edge and no padding, and SHALL draw its text in the color of the text it sits in, so that it reads on any container that text reads on.
- **ICD-5** WHILE variant is tonal or plain THE inline code SHALL be drawn in that form; WHILE variant is auto THE inline code SHALL be drawn in the form the nearest ancestor chooses for the inline code inside it (a table whose column is code, a callout, a list of names), and tonal where no ancestor chooses one; WHEN that choice changes while the inline code is shown THE inline code SHALL follow it at once.
- **ICD-6** THE inline code SHALL wrap with the line it sits in: it breaks first at the spaces inside it; a part with no space that is longer than the line SHALL break between any two characters rather than run past the edge of its container; and no hyphen or any other character SHALL be drawn at a break. Each piece of a run that breaks SHALL keep the fill, the corners and both paddings of ICD-3. THE inline code SHALL NOT cut its text and SHALL NOT scroll.
- **ICD-7** THE inline code SHALL draw the characters of text as given: every space is kept, a run of spaces is not collapsed, a line break in text is drawn as one space, and the text is not hyphenated, not capitalised or otherwise transformed, not translated by the platform's translation, not spell-checked and not turned into a link by itself.
- **ICD-8** THE inline code SHALL lay out its text as a left-to-right run of its own, isolated from the text around it, in every layout direction (PRS-26): a path, a call and an operator keep their order inside a right-to-left sentence and reorder nothing beside them; the run takes its place in the sentence by the sentence's own direction.
- **ICD-9** THE inline code SHALL take its layout direction from where it is used — the direction of the nearest ancestor that sets one, and the platform's own where none does — and SHALL have no direction setting of its own; WHEN that direction changes while the inline code is shown THE inline code SHALL draw itself for the new direction at once, without a motion of its own, keeping what it shows.
- **ICD-10** WHERE the inline code sits inside a link THE inline code SHALL draw its text in the link's color in place of comp.inline-code.label.color and the link's underline SHALL run under it; WHERE it sits inside strong text it SHALL gain sys.typescale.emphasis.body of weight over the weight of comp.inline-code.label.typescale, as strong text does (PRS-2); WHERE it sits inside emphasised text it SHALL NOT be slanted.
- **ICD-11** THE inline code SHALL NOT take pointer, touch or keyboard input of its own, SHALL NOT take focus or be a stop in the focus order, and SHALL NOT change anything it draws under a pointer, a press or focus: it has no hovered, focused, pressed, selected or disabled state, draws no state layer and no focus indicator, and emits no event. WHERE it is placed inside an element that takes input (a link, a button, a list item) input over it SHALL reach that element, which draws its own states.
- **ICD-12** THE inline code SHALL expose its text as text, read where it sits in the sentence, with the role of code where the platform has one and no name of its own; it SHALL NOT be announced as anything else and SHALL NOT expose its form. Selecting it SHALL select its characters with the text around it, and copying that selection SHALL yield exactly text: no character stands for the padding of ICD-3.
- **ICD-13** THE inline code SHALL draw all of its text in one color: it takes no syntax roles and SHALL NOT highlight, parse or otherwise interpret what it holds.
- **ICD-14** WHERE the platform draws with a person's own forced colors THE inline code SHALL draw its text in the platform's text color (the link color inside a link) and no fill, and an edge only where comp.inline-code.outline.width is above 0, in that text color: the face tells code from words, so nothing rests on the fill.
- **ICD-15** WHILE the text size is enlarged THE inline code SHALL grow with the text it sits in, keeping the proportion of ICD-1, its padding and its corners; at twice the text size in a container 320 wide it SHALL wrap as ICD-6 says and SHALL NOT cause horizontal scrolling.
- **ICD-16** IF text is empty THE inline code SHALL draw nothing, take no space and expose nothing. WHEN variant names a value this spec does not have THE inline code SHALL be drawn as variant auto, and in debug builds report the unknown value.

### Tokens

As written in the token documents (DTCG): an alias in braces names the token it takes its value from, which each design system resolves. On the web each token is a CSS custom property: `--tanrei` and the name after `tanrei`, joined by hyphens (`tanrei.comp.inline-code.…` → `--tanrei-comp-inline-code-…`).

#### `tanrei.comp.inline-code`

| Token | Type | Value |
| --- | --- | --- |
| `comp.inline-code.container.color` | `color` | `{tanrei.sys.color.surface-container-highest}` |
| `comp.inline-code.container.shape` | `dimension` | `{tanrei.sys.shape.corner.extra-small}` |
| `comp.inline-code.container.padding-inline` | `dimension` | `{tanrei.sys.space.space50}` |
| `comp.inline-code.outline.color` | `color` | `{tanrei.sys.color.outline-variant}` |
| `comp.inline-code.outline.width` | `dimension` | `{tanrei.sys.space.space0}` |
| `comp.inline-code.label.color` | `color` | `{tanrei.sys.color.on-surface}` |
| `comp.inline-code.label.typescale` | `typography` | `{tanrei.sys.typescale.code}` |
| `comp.inline-code.label.scale` | `number` | `0.9286` |

### Web 上绘制方式的不同之处

- `translate="no"` 和 `spellcheck="false"` 是由你或你的 Markdown 渲染器来写的属性。样式表无法设置它们。
- 代码里的连字符是可以换行的位置，先于在字符之间断开。
- 对于换行的一段代码，WebKit 会绘制每一段的填充和圆角，但不绘制两端留出的空间：第一段之后的各段从填充的边缘开始。
- 只有在支持 `white-space-collapse: preserve-spaces` 的浏览器里，一段代码内部的换行才会绘制成一个空格。请把一段代码写在一行里。
- 未知的 `data-variant` 按 `auto` 绘制，调试构建中不报告任何内容。

## 指南

### Tonal 还是 plain

| 变体 | 绘制什么 | 何时使用 |
| --- | --- | --- |
| **Tonal** | 淡淡的填充上的代码字体 | 连续文本中的一个名称 |
| **Plain** | 只有代码字体，颜色与周围的文本相同 | 每一项都是代码的列或列表，以及有颜色的容器上的文本 |

### 推荐

- 句子要写得把代码当作词语读出来时也读得通。屏幕阅读器默认不朗读代码角色。
- 在语义状态的容器或反色表面这类有颜色的容器上使用 plain。tonal 的填充是一个表面角色，只与表面配对。
- 对于表格或一列名称，在祖先元素上统一设置一次形式（`data-tanrei-code="plain"`）。

### 避免

- 不要用行内代码表示强调。它说的是“这是代码”。
- 不要把要按的键放进行内代码。请使用键盘快捷键。
- 不要在里面放超过一行的内容。请使用代码块。

## 无障碍

### 组件负责的部分

- 它就是 `code` 元素，所以具有代码角色，它的文字在句子中所在的位置朗读。
- 它靠字体与周围的词语区分开，而不是靠颜色。在强制颜色模式下填充会消失，但什么都不会丢。
- 它不获得焦点，也不接受输入。在链接或按钮里，落在它上面的按下操作会到达那个元素。
- 在任何文本大小下，长名称都会断开，而不会让页面滚动。
- 选中并复制一个句子时，复制到的代码字符完全一致。

### 需要你做的事

- 在拼写要紧的地方，把名称在句子里写出来，因为符号怎么读取决于用户的设置。
- 给这段代码标上 `translate="no"`，让浏览器的翻译不去动它。
