step属性仅对number、range、date等原生支持步进的input类型生效,对text等无效;number类型中它控制输入值必须为step的整数倍,失焦或提交时自动校验并修正,但需注意min/max与step的配合及浮点精度问题。

step属性只对特定表单控件生效
step 属性不是所有 HTML 元素都支持,它仅作用于 <input type="number">、<input type="range">、<input type="date">(及 time、datetime-local)等原生支持步进的类型。对 text、email 或自定义组件无效——强行加 step 不会触发任何校验或约束。
number类型中step控制输入倍数的核心逻辑
当 type="number" 且设置了 step,浏览器会在以下场景强制对齐步长:
- 用户手动输入后失焦时,自动四舍五入到最近的合法值(例如
step="5",输12会跳成10或15,取决于浏览器实现) - 点击上下箭头时,每次增减严格为
step值 - 提交表单时,若值不满足
value % step === 0(需考虑浮点精度),部分浏览器会报错或阻止提交
注意:step 默认是 1;设为 any 表示取消数值约束(但不会禁用小数输入);设为 0.1 时,1.23 可能被截断为 1.2,因浮点误差导致实际校验失败。
常见陷阱:step与min/max组合失效
很多人以为 min="0" max="100" step="7" 就能限制输入为 0, 7, 14, ..., 98,但实际行为更复杂:
-
min和max是边界,step是增量,三者共同定义合法值集合:{min + n × step≤max, n ∈ ℤ, n ≥ 0 } - 若
min不能被step整除(如min="1" step="5"),第一个合法值是6,而非1—— 这常被忽略 - 某些浏览器(如 Safari)在输入框内直接键入
1后失焦,会清空内容或报错,因1不属于{6,11,16,...}
解决办法:确保 min % step === 0,或改用 JS 手动校验 + 修正,不要依赖纯 HTML 约束。
需要真正“倍数”语义?别只靠step
如果业务要求「必须是某数的整数倍」(比如金额只能是 10 的倍数),仅靠 step 不够健壮:
- 用户可粘贴非法值(如
"123.45"),step不拦截 - 移动端软键盘可能不显示数字箭头,失去 step 提示
- 旧版 IE 完全忽略
step
建议组合使用:input 事件监听 + Math.round(value / step) * step 修正,再配合 setCustomValidity() 提示。否则,看似设了 step="10",实际防线很薄。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











