step仅对type="number"和type="range"生效;合法值由(v−min)%step≈0判定,非整除判断;step="any"跳过步长校验但不豁免其他验证;浮点误差需用整数单位或后端截断规避。

step 属性只在 type="number" 和 type="range" 下生效
给 type="text" 或 type="tel" 加 step 完全没用,浏览器直接忽略,控制台也不会报错。必须明确写成 <input type="number" step="0.5"> 才会参与校验逻辑。常见错误是以为“只要输的是数字,step 就管用”,结果用户随便输入 1.23 也能提交——其实根本没触发 stepMismatch 校验。
合法值由 min + n × step 决定,不是 v % step === 0
浏览器判断一个值 v 是否合法,用的是 (v - min) % step ≈ 0(浮点安全比较),而不是简单看 v 能不能被 step 整除。这意味着:
-
min="1.5" step="0.2"→ 合法值是 1.5、1.7、1.9… -
min="1" step="0.2"→ 理论上第一个合法值是 1.2(因为 1 不满足 (1−1)%0.2===0?等等,1−1=0,0%0.2=0,所以 1 本身合法),但部分浏览器对起点处理不一致,Chrome 可能接受,Safari 可能静默跳到 1.2 - 省略
min时,默认起点是 0,step="0.1"的合法值就是 0、0.1、0.2…,哪怕你希望从 5 开始选
step="any" 不等于“没限制”,而是跳过 stepMismatch 校验
step="any" 的作用很明确:告诉浏览器“别检查步长合法性”。它和完全不写 step 不同:
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
- 不写
step→type="number"默认按step="1"校验,输入 99.99 会被拦住 -
step="any"→ 允许任意精度输入(如 3.1415926),validity.stepMismatch永远为false - 但注意:
step="any"不影响min/max或pattern,也不阻止用户输错格式(比如 "12.34.56" 会让valueAsNumber变成NaN)
浮点精度会让 step="0.1" 表现不可靠
0.1 在 IEEE 754 中无法精确表示,导致计算偏差。例如:
- 用户输入 0.3,浏览器内部算出的是 0.30000000000000004
-
(0.30000000000000004 - 0) % 0.1≠ 0 → 触发validity.stepMismatch - 解决办法只有两个:用整数单位(如 cents 代替 dollars,配
step="1"),或改用step="any"+ 后端截断 - JS 手动校验别写
v % step === 0,改用Math.abs((v - min) % step)
真正容易被忽略的是:浏览器只在提交或调用 checkValidity() 时才跑这整套逻辑,输入过程中不会拦截。想实时限制,得自己监听 input 事件并修正 value —— 但这会破坏原生体验,慎用。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










