step校验公式为(value−min)%step≈0,而非value%step;min是等差数列首项,错误设置会导致合法值序列整体偏移,且跨浏览器行为不一致,必须显式声明并与step小数位对齐。

step 和 min 不是“各自管一段”,它们共同定义合法值的起点和步进序列——浏览器校验时只认 (value - min) % step ≈ 0,而不是 value % step ≈ 0。设错 min 会导致整个序列偏移,哪怕 step 写对了也没用。
为什么 value="5" 在 min="1" step="2" 下可能被浏览器悄悄改掉
浏览器不会把 5 当作“第 2 个合法值”,而是先算 (5 - 1) % 2 === 0 → 成立,所以 5 合法;但若 value="4",(4 - 1) % 2 = 1 → 不合法,Chrome 会在失焦时自动把它改成 5(最近合法值),Safari 可能保留但提交时报 stepMismatch。
-
min是等差数列的首项,不是“下限提示”——它参与所有校验计算 - 如果业务要支持 2、4、6…,必须设
min="2"或min="0",不能设min="1" - 显式写
min="0.01"就该配step="0.01",别写step="0.1",否则 0.05 这类值会被拒绝
min 带小数时,浏览器默认 step 会“猜”,但不可靠
Chrome 看到 min="0.1" 可能自动推 step="0.1",Firefox 却坚持用默认 step="1",结果同一段 HTML 在两个浏览器里允许输入的值完全不同。
- 跨浏览器一致性的唯一办法:显式声明
step,且小数位数与min对齐 -
min="0"+step="0.1"→ 合法值从 0 开始:0、0.1、0.2… -
min="0.05"+step="0.05"→ 合法值是 0.05、0.10、0.15…,别指望它兼容 0.1 的“四舍五入”逻辑
JS 校验时别直接用 value % step
浮点误差会让 0.3 % 0.1 返回 0.09999999999999998,导致本该通过的校验失败。
- 正确做法:
Math.abs((value - min) % step) - 监听
input事件时,建议立刻做对齐:const aligned = Math.round((value - min) / step) * step + min - 调试时直接查
input.validity.stepMismatch,比肉眼判断更准
最易被忽略的一点:浏览器不保证 min + n × step 恰好等于你写的 max,尤其当三者小数位数不统一时——比如 min="0"、step="0.1"、max="0.3",理论上应有 0、0.1、0.2、0.3,但某些浏览器因浮点误差只生成到 0.2。真要精确控制终点,优先用整数单位缩放。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











