step属性仅对type="number"、type="range"、type="datetime-local"生效;type="date"等日期类型忽略step;type="text"上设置完全无效。

step 属性只在 type="number"、type="range"、type="datetime-local" 等特定类型下起作用,对 type="text" 完全无效;设了不等于管用,value 初始值必须和 min、step 数学对齐,否则浏览器会静默修正——点不动、跳错值、spinner 失灵,八成卡在这儿。
哪些 type 支持 step 属性?
只有以下类型响应 step:
-
type="number":控制数值增减单位和校验逻辑 -
type="range":影响拖动时的“跳变点”,但不影响视觉精度 -
type="datetime-local":仅接受整数秒(如step="60"表示 1 分钟),小数会被截断 -
type="date"、type="month"、type="week":step被浏览器忽略,日期始终按天/月/周移动
常见误写:<input type="text" step="0.01"> —— DOM 里能看到属性,但 spinner 不出现、增减无效、校验不触发,等同于没写。
为什么 step="0.1" 输入 0.3 却报错?
这不是 bug,是浏览器用 (value - min) % step === 0 做校验,而 0.1 在二进制浮点中无法精确表示,导致 0.3 - 0 除以 0.1 的余数不是 0。
立即学习“前端免费学习笔记(深入)”;
- 用户手动输入
0.3,提交时触发validity.stepMismatch - 点击 ↑ 两次从
0.1变成0.30000000000000004,旧版 Chrome 甚至会静默把step="0.1"当作step="1" - 安全写法:统一小数位,如
min="0.00"、max="10.00"、step="0.01";或换整数单位,金额用“分”,min="100"、step="1"
动态改 step 后 spinner 失灵怎么办?
DOM 更新 step 后,浏览器不会自动重算合法值集合,旧 value 很可能已越界。
- 别直接写
input.step = "0.25",改用input.setAttribute("step", "0.25") - 必须立刻重置
value:input.value = (Math.round(parseFloat(input.value) / 0.25) * 0.25).toFixed(2) - 快速连续切换时,加
requestAnimationFrame延迟重置,避免状态残留 - 调用
input.checkValidity()主动校验,必要时input.reportValidity()显示提示
实现 ± 按钮时,为什么别自己写 parseFloat(val) + 0.1?
JS 浮点运算会引入误差,比如 0.1 + 0.2 === 0.30000000000000004,而原生方法严格按当前 step 执行。
- 优先用
input.stepUp(1)和input.stepDown(1) - 按钮点击后可补一句
input.value = parseFloat(input.value).toFixed(2)格式化显示 - 键盘方向键(含 Shift + ↑ 十倍步进)已由
step原生支持,无需额外监听
最易被忽略的一点:移动端 iOS Safari 的数字键盘不随 step 变化,始终只提供整数键;Android Chrome 长按小数点后只能输一位——step="0.001" 在这种环境下基本无意义。真正可控的精度,得靠服务端校验或 JS 截断 + toFixed()。



















