HTML 数字输入:min、max、step、小数与 valueAsNumber
HTML input type="number" 接收可以比较或增量的数量。min 和 max 设置范围,step 设置有效间隔。允许小数需要同时考虑间隔及其基数;看似数字的电话号码或邮政编码通常需要另一种输入类型。
min · max · step
min 和 max 并不一定能阻止输入超出范围的数字。即使可以输入无效值,普通的表单提交也会被验证阻止。如果该值不能为空,请添加 required。
如果存在,步长基值是一个有效的 min 值,否则是一个有效的 HTML value 属性,如果两者都不存在,则为零。有效值是基于该基值的整数步长。默认间隔为 1,但小数基值可以产生有效的小数值,因此默认值并不普遍禁止小数。
| 配置 | 有效值示例 | 注意 |
|---|---|---|
min="0" step="1" |
0, 1, 2 |
0.5 不符合此区间。 |
min="0" step="0.01" |
1, 1.2, 1.23 |
1.234 不符合。这不会强制显示两位小数。 |
min="0" step="3" |
0, 3, 6, 9 |
从零起点的三的倍数。 |
min="1" step="3" |
1, 4, 7, 10 |
基数为一,因此这些不同于三的倍数。 |
step="any" |
范围内的各种小数值 | 移除步长限制;其他范围和必需约束仍然存在。 |
在一个示例中比较整数和小数输入
将此完整代码保存为 number.html 并在浏览器中打开。无需服务器即可比较验证、提交的字符串以及数量和重量的 JavaScript 数值。此练习将重量定义为 0–100 公斤,步长为 0.01 公斤。
<!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; font-family: sans-serif; }
label { display: block; margin: 16px 0 6px; }
input { width: 12rem; max-width: 100%; box-sizing: border-box; }
pre { white-space: pre-wrap; overflow-wrap: anywhere; }
</style>
</head>
<body>
<h1>输入数量和重量</h1>
<form id="demo">
<label for="quantity">数量(1~10,整数单位)</label>
<input id="quantity" name="quantity" type="number"
min="1" max="10" step="1" value="2" required>
<label for="weight">重量(0~100kg,步长0.01kg)</label>
<input id="weight" name="weight" type="number"
min="0" max="100" step="0.01" value="1.25" required>
<p><button type="submit">查看值</button>
<button type="reset">重置</button></p>
</form>
<pre id="result" aria-live="polite"></pre>
<script>
const form = document.querySelector('#demo');
const quantity = document.querySelector('#quantity');
const weight = document.querySelector('#weight');
const result = document.querySelector('#result');
form.addEventListener('submit', (event) => {
event.preventDefault();
result.textContent = JSON.stringify({
formData: [...new FormData(form).entries()],
numbers: { quantity: quantity.valueAsNumber, weight: weight.valueAsNumber }
}, null, 2);
});
form.addEventListener('input', () => { result.textContent = ''; });
form.addEventListener('reset', () => { result.textContent = ''; });
</script>
</body>
</html>
- 提交初始值。
formData(字符串):"2","1.25";numbers(数值):2,1.25. - 将数量设置为 11 并提交以触发最大值验证。将其设置为 2.5 以进行步长验证,或清空以进行必填验证。将数量恢复为 2。
- 重量为 1.23 可以提交,但 1.234 不符合间隔。固定小数位格式与有效的数字间隔不同。
- 仅将数量的
step="1"更改为step="3",然后重新打开文件。因为min="1",初始值 2 是无效的,但 4 是有效的。之后将步骤恢复到 1。 - 重置会将数量恢复为 2,重量恢复为 1.25,并清除结果。
区分看起来像数字的标识符
电话号码、邮政编码和会员ID通常需要保留其原始字符串,而不是进行算术运算。前导零或连字符可能很重要。考虑将 type="tel" 用于电话,将 type="text" inputmode="numeric" 用于看起来像数字的标识符。inputmode 提示的是键盘类型;它不是数字验证规则。
数字输入不要使用 maxlength 或 pattern 来限制数字位数或正则表达式模式。使用 CSS 设置宽度而不是 size。浏览器在字符输入行为、增量箭头和小数分隔符显示上存在差异,因此不要依赖单一显示效果或阻止行为。
在 JavaScript 和服务器端处理数字
input.value 和普通表单提交的值都是字符串。将 valueAsNumber 用于数字;当为空或不可转换时,它返回 NaN。使用 Number() 转换空字符串会得到零,因此如果空值与零意味着不同的含义,首先要区分空值。
仅依靠浏览器验证并不能使一个值可靠。在服务器端也要验证数值格式、有限性、范围和步进。对于需要小数精度的计算,例如金额,要考虑 JavaScript 二进制浮点误差,并使用最小货币单位的整数或适当的小数方法。
MDN 数字输入参考 解释了属性和步进基规则。




