HTML 教程 / 使用 placeholder 为表单字段添加提示
要在空的 HTML 表单字段中显示简短提示,请使用属性 placeholder。字段名称使用 label,实际初始值使用 value。将占位符与值分开,可以防止示例文本作为用户数据提交。
label、placeholder 和 value 之间的区别
一个 label 用于标识一个字段,例如“电子邮件”或“消息”。placeholder 是一个小提示,当字段的值为空时会显示在字段中。input 上的 value 属性用于设置其初始值。
| 功能 | 目的 | 输入后 | 与提交数据的关系 |
|---|---|---|---|
label |
为字段命名 | 保持可见 | 标签文本不是输入的值。 |
placeholder |
提供一个简短的示例或格式提示 | 当字段有值时隐藏 | 该信息本身不会被发送。 |
value |
设置字段的初始值 | 显示为可编辑文本 | 如果用户未更改,初始值可以被发送。 |
例如,“电子邮件”可以用作字段标签,而“例如 alex@example.com”用作输入提示。在空白联系表单中使用value给出示例地址,可能会给人真实地址的印象,因此请为此示例使用placeholder。另一方面,显示已保存地址的账户更改表单则需要一个真实的初始值。
向字段添加提示文本
将placeholder="填写提示"添加到输入字段的起始标签中。此示例显示电子邮件地址作为提示,当字段为空时显示。
<label for="email">电子邮件</label>
<input type="email" id="email" name="email"
placeholder="例如 alex@example.com">
让 label 的 for 属性值与输入字段的 id 一致,以将它们关联起来。name 在提交的数据中标识该字段。这些属性具有不同的功能:设置 id 并不替代 name 的必要性。有关更多示例,请参阅 label 和 input 正确关联。
HTML 标准支持 placeholder 的输入类型有:text、search、tel、url、email、password 和 number。日期字段不支持此属性。请将重要说明保存在字段外部,即使是数字,也要确保在输入时可见。HTML 对 placeholder 的定义以及按输入类型的 属性表 解释了它的应用范围。
向文本字段添加提示文本
接受多行文本的元素 textarea 也支持 placeholder。要仅显示占位符,请将其开闭标签之间的区域留空。可用使用 textarea、select、option 和 button中的完整示例,比较多行输入与选择列表。
<label for="message">消息</label>
<textarea id="message" name="message" rows="4"
placeholder="例如 我的订单什么时候到?"></textarea>
文本区域的初始值来自其标签之间的文本,而不是 value 属性。在以下示例中,“请告诉我我的订单什么时候到。”是一个实际可编辑的值,而不是占位符。
<textarea name="message">请告诉我我的订单什么时候到。</textarea>
文本区域标签之间的空格或缩进可能是值的一部分。如果看似为空的文本区域未显示其占位符,请检查标签之间是否还有残余文本。HTML文本区域的规范定义了其初始值和占位符行为。
在输入过程中保持重要说明可见
提示文本在用户输入值后会消失,因此它不能替代字段名称或重要说明。将像“电子邮件”这样的名称保留在可见标签中,并在单独的文本中提供用户在输入过程中所需的说明。
<label for="email">电子邮件(必填)</label>
<input type="email" id="email" name="email"
placeholder="例如 alex@example.com"
aria-describedby="email-help" required>
<p id="email-help">请输入您希望收到回复的电子邮件地址。</p>
可访问性属性 aria-describedby 将输入与额外的说明文本关联。将 aria-describedby 的值设置为说明元素的 id。这样,屏幕阅读器等辅助技术就可以将描述与字段关联起来。请同时保留可见说明,如本示例所示。W3C 表单指南教程 展示了这种方法。
完整示例:必填字段电子邮件及可选说明
将以下代码保存为 form-guide.html,使用 UTF-8 编码保存,然后在浏览器中打开。电子邮件字段为必填项,消息为可选项。占位符的颜色选择了适合白色背景的颜色,字段会根据较小屏幕上的表单宽度进行自适应。可通过表单验证:必填项、文本长度与数值范围中的边界值,比较必填要求与格式、范围限制。
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>输入提示示例</title>
<style>
body {
margin: 24px;
color: #222;
font-family: sans-serif;
line-height: 1.6;
}
form { max-width: 440px; }
label { display: block; font-weight: bold; }
input, textarea {
box-sizing: border-box;
width: 100%;
padding: 10px;
border: 1px solid #777;
border-radius: 4px;
font: inherit;
}
input::placeholder, textarea::placeholder {
color: #666;
opacity: 1;
}
.help { margin-top: 4px; }
button { padding: 8px 20px; font: inherit; }
</style>
</head>
<body>
<h1>联系我们</h1>
<form method="get">
<p>
<label for="email">电子邮件(必填)</label>
<input type="email" id="email" name="email"
placeholder="例如 alex@example.com"
aria-describedby="email-help" required>
</p>
<p id="email-help" class="help">请输入您希望收到回复的电子邮件地址。</p>
<p>
<label for="message">消息(可选)</label>
<textarea id="message" name="message" rows="4"
placeholder="例如 我的订单什么时候到?"></textarea>
</p>
<button type="submit">发送</button>
</form>
</body>
</html>
两个字段最初都会显示占位符。一旦输入电子邮件地址,其示例将消失,但“电子邮件(必填)”及其下方说明仍然可见。完全清空字段后,占位符文本将重新显示。
- 将电子邮件字段留空,然后按发送。通过
required检查将阻止正常的浏览器提交。 - 在电子邮件字段中输入
abc,然后再次发送。格式检查type="email"将阻止提交。 - 输入像
alex@example.com这样的正确格式地址,并将消息留空。该表单可以在可选字段为空时发送。
required 检查空值,type="email" 检查电子邮件格式。格式正确的地址并不证明该地址存在。错误信息及其显示方式因浏览器和语言设置而异。
这个示例不包含存储消息的服务器。由于省略了 GET 表单 action,普通提交将指向当前文档的地址。如果文件由 Web 服务器提供,URL 的查询字符串中可以显示提交的值。本地打开文件时的处理可能有所不同。一个可工作的服务需要一个服务器端点和合适的提交方法。
提交的是什么:占位符文本还是值?
占位符文本不会作为输入值提交,但空值仍可能包含在提交的数据中。 例如,一个未禁用且具有 name="email" 的字段,如果为空且没有必填验证阻止提交,在 GET 查询字符串中仍可能产生 email=。没有 name 或带有 disabled 的字段将从常规表单数据中省略。这些区分遵循 HTML 生成表单数据的规则 。
<form id="compare-form">
<label for="default-name">默认值</label>
<input id="default-name" type="text" name="default_name" value="Alex">
<label for="hint-name">提示示例</label>
<input id="hint-name" type="text" name="hint_name" placeholder="例如 Alex">
</form>
在一个单独的 HTML 文件中打开此代码,然后在浏览器的开发者工具控制台中执行以下代码。FormData 会生成一个表单字段名称及其当前值的列表。此代码会检查列表,而不会将其发送到服务器。
Array.from(new FormData(document.getElementById("compare-form")).entries())
如果两个字段都保持不变,结果如下。通过 value 提供的“Alex”将被包含。占位符文本“例如 Alex”不会被包含。
[["default_name", "Alex"], ["hint_name", ""]]
在第二个字段中输入“Sam”,然后再次执行代码:hint_name 的值将为“Sam”。如果用户更改第一个字段,将包含其当前值,而不是原始值。
即使设置了 required,使用 value 预填的示例文字也可能通过简单的非空检查,因此不能把示例地址误当成用户填写的实际值。创建 FormData 对象也不会触发必填字段的验证。在浏览器提交时以及构建数据列表时,将这些检查作为独立的操作处理,并在真正的服务端对输入进行验证。
如果占位符文本缺失或难以阅读
- 检查该字段是否已经有值。 输入的初始值、文本区域的内容、浏览器或脚本的自动填充可能会阻止占位符文本的显示。
- 检查输入类型。对于具有特殊界面的控件,如日期字段,请在字段外提供说明。
- 保持说明简短。在字段中提供一个简短的示例,并在可见的说明文本中提供详细条件。不要在提示文本中使用换行符。
- 检查文本和背景的颜色。颜色过淡或不透明度低可能会影响提示的可见性。在调整样式后,也要检查在移动屏幕上的可读性。
使用 CSS 伪元素 ::placeholder 来设置提示文本的样式。CSS(层叠样式表)控制页面的外观;完整示例使用它来设置提示的颜色和不透明度。有关更多样式示例,请参阅 提示文本样式(韩文)。对于字段名称使用标签,对于简短示例使用提示文本,对于必须保持可见的说明使用单独的描述。





