Back

当你的表单需要"说话"时,请使用 Output 元素

当你的表单需要"说话"时,请使用 Output 元素

你构建了一个带有范围滑块的表单,但用户看不到当前值。或者你创建了一个价格计算器,需要在用户更改数量时更新总价。你可能会使用 <span><div>,配合一些 JavaScript,然后收工。

但 HTML 已经为这个目的专门设计了一个元素:<output>

本文将解释何时以及为何使用 HTML output 元素来显示表单中的计算值或派生值,它与通用容器有何不同,以及避免细微错误需要了解的关键细节。

核心要点

  • <output> 元素是一个语义化的、与表单关联的容器,专门用于显示从用户输入计算或派生的值。
  • for 属性在输入控件和结果之间创建语义关系,但需要 JavaScript 来执行实际计算。
  • <output> 元素中的值不会随表单提交——如果需要将计算值发送到服务器,请使用隐藏输入框。
  • 为了可靠的屏幕阅读器播报,应添加显式的 ARIA live region 属性,而不是依赖隐式行为。

<output> 元素的实际作用

<output> 元素表示计算或用户操作的结果。它是一个专门为实时表单反馈设计的表单关联元素——用于显示总计、预览、验证结果或任何基于用户输入变化的派生值。

基本语法如下:

<form>
  <input type="range" id="quantity" min="1" max="10" value="5">
  <output for="quantity">5</output>
</form>

for 属性接受以空格分隔的 ID 列表,指示哪些表单控件对输出值有贡献。这在输入控件和派生结果之间创建了语义关系。

为什么不直接使用 <span>?

你可以在任何元素中显示计算值。但 <output> 提供了特定的优势:

语义清晰性。 该元素明确传达其内容是从其他表单控件派生的。这有助于其他开发者理解你的代码,也帮助浏览器理解你的意图。

表单关联。<input><select> 一样,<output> 元素属于表单元素家族。即使放置在 <form> 标签之外,它也可以通过 form 属性与表单关联。

可标记性。 你可以将 <label><output> 关联,这是通用元素无法一致支持的。

完全的 CSS 控制。 与某些表单元素不同,<output> 完全可样式化——没有浏览器强加的外观限制。

你需要了解的属性

for 属性

for 属性记录哪些控件对输出有贡献。它接受以空格分隔的元素 ID:

<input type="number" id="price">
<input type="number" id="qty">
<output for="price qty">$0.00</output>

这种关系纯粹是语义性的——它不会创建任何自动行为。你仍然需要 JavaScript 来执行计算。

name 属性

name 属性让你可以在脚本中轻松引用该元素:

<output name="total" for="price qty">$0.00</output>

关键细节: 尽管有 name 属性,<output> 元素的值不会随表单提交。如果需要将计算值提交到服务器,请将其复制到隐藏输入框中:

<output name="total">$50.00</output>
<input type="hidden" name="submitted_total" value="50.00">

form 属性

当元素位于 <form> 标签之外时,使用此属性将 <output> 与表单关联:

<form id="calculator">
  <input type="number" id="amount">
</form>

<output form="calculator" for="amount">0</output>

与 JavaScript 配合使用

HTMLOutputElement 暴露了一个 value 属性用于获取和设置显示内容:

const slider = document.getElementById('quantity');
const output = document.querySelector('output');

slider.addEventListener('input', () => {
  output.value = slider.value;
});

设置 output.value 会更新元素的文本内容。如果需要重置,defaultValue 属性存储初始值。

关于无障碍访问的说明

HTML 规范将 <output> 映射到 role="status",这意味着具有 live region 行为。然而,屏幕阅读器的支持在不同浏览器和辅助技术组合中差异很大

如果需要可靠地播报动态变化,不要仅依赖隐式映射。使用显式的 ARIA live region 属性:

<output aria-live="polite" aria-atomic="true">结果: 42</output>

在目标环境中使用实际的屏幕阅读器进行测试以验证行为。

何时使用 <output>

在显示以下内容时使用 HTML output 元素:

  • 表单计算(总计、小计、派生值)
  • 范围滑块值(人类可读格式)
  • 字符计数或验证反馈
  • 基于表单输入的实时预览

对于静态内容或与用户交互无关的值,请跳过使用它。

结论

<output> 元素为你提供了一个语义化的、与表单关联的容器,用于计算和派生值。它不会自动提交值——你需要为此使用隐藏输入框。为了让屏幕阅读器可靠地播报可访问的输出,请添加显式的 ARIA 属性,而不是依赖隐式行为。

当你的表单需要”说话”时,<output> 就是正确的工具。只需理解它自动做什么和不做什么。

常见问题

可以。output 元素没有像某些表单控件那样的浏览器强加的样式限制。你可以应用任何 CSS 属性,包括字体、颜色、边框、内边距和布局规则。它默认表现为内联元素,但你可以根据需要更改其 display 属性。

可以。output 元素在所有现代浏览器中都有出色的支持,包括 Chrome、Firefox、Safari 和 Edge。自 Internet Explorer 10 以来就得到支持。对于更旧的浏览器,它会优雅降级并将其内容显示为纯文本。

output 元素提供了 span 所缺乏的语义含义。它告诉浏览器和辅助技术,内容是来自表单输入的计算结果。它还支持 for 属性来记录输入关系,可以与 label 关联,并参与表单验证 API。

使用 defaultValue 属性。当你设置 output.value 时,原始内容会保留在 defaultValue 中。调用 form.reset() 会自动将所有 output 元素恢复到其 defaultValue。你也可以手动将 output.value 设置为等于 output.defaultValue 来重置特定元素。

Complete picture for complete understanding

Capture every clue your frontend is leaving so you can instantly get to the root cause of any issue with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data.

Check our GitHub repo and join the thousands of developers in our community.

OpenReplay