safari 完全忽略 step="any",强制按步长 1 四舍五入数值;须改用具体 step 值(如 "0.01")配合 inputmode="decimal",或改用 type="text" 自行校验。

step="any" 在 Safari 中根本不起作用
直接说结论:step="any" 在 Safari(包括 macOS 和 iOS 所有当前版本)中被完全忽略,输入框仍按默认步长 1 限制数值——哪怕你输入 3.14,失焦后也会被强制四舍五入成 3 或 4。这不是 bug,是 Safari 对 HTML 规范的保守实现:它只支持 step 为正整数或小数字符串(如 "0.01"),明确不识别 "any" 这个关键字。
替代方案:用 step="0.01" + inputmode="decimal"
想让 Safari 支持小数输入,必须显式指定步长值,不能依赖 "any":
-
step设为具体小数,比如step="0.01"(对应两位小数精度),Safari 会据此校验并修正输入值 - 配合
inputmode="decimal"可在 iOS/Android 软键盘唤起数字+小数点布局,提升体验 - 注意:
step值必须与min/max的精度匹配,例如min="0" max="10" step="0.001"是安全的;但若min="0.1"却用step="0.01",Safari 可能因内部对齐计算出错导致输入被清空
验证是否真被 Safari 修正:监听 input 和 change 事件
Safari 会在用户输入后自动“修正”值,这个过程不可见但会影响业务逻辑:
-
input事件中拿到的是用户刚输的原始字符串(如"2.999") -
change事件触发时,valueAsNumber已被 Safari 四舍五入处理(如变成3) - 因此,关键校验逻辑(如价格、精度要求高的参数)应放在
change后,或手动用parseFloat(this.value)取原始值再做判断 - 别依赖
valueAsNumber在input阶段的值——它在 Safari 中可能和显示值不一致
更稳妥的做法:放弃 <input type="number">,改用 type="text"
当精度控制复杂(如动态步长、科学计数法、允许空值或负零)、或需兼容旧版 Safari(≤15.6)时,硬扛 number 类型反而增加维护成本:
- 用
type="text"+inputmode="decimal"+ 正则过滤(如/^-?\d*\.?\d*$/)可完全绕过浏览器步长校验 - 自行解析
parseFloat()并结合业务规则做范围/精度判断,控制力更强 - 注意移除
pattern属性——它在 Safari 的number输入框中会被无视,但在text中生效,容易造成行为不一致
真正麻烦的不是写几行代码,而是 Safari 的步长校验发生在 DOM 更新之后、事件派发之前,且不提供钩子拦截。一旦设计时假设 step="any" 全局有效,后期排查输入跳变问题会卡在最意想不到的环节。











