step仅对number、range、date等特定type生效,type="text"等无效;number类型下定义合法值间隔但不阻止非法输入,提交时才触发stepMismatch;需手动调用checkValidity并setCustomValidity处理提示。

step 属性只对特定 type 生效,不是所有 input 都能用
step 不是通用校验开关,它只在 type="number"、type="range"、type="date"、type="datetime-local"、type="month"、type="week" 和 type="time" 上起作用。比如 type="text" 或 type="email" 写了 step 完全无效,浏览器既不校验也不约束输入。
常见误用是想用 step="0.5" 限制小数位数却配在 type="text" 上,结果毫无反应。必须搭配 type="number" 才能触发步进逻辑和表单验证。
number 类型下 step 控制可选值范围,但不阻止手动输入非法值
step 在 type="number" 中定义的是“合法值的间隔”,比如 step="0.5" 意味着允许 0、0.5、1.0、1.5……但用户仍可直接输入 0.3 或 2.7 —— 浏览器不会实时拦截,只在表单提交时触发 ValidityState.stepMismatch 错误。
-
min="0" max="10" step="0.5":合法值为 0, 0.5, 1.0, ..., 10.0;输入 3.2 会通过checkValidity()返回false -
step="any":关闭步进限制,允许任意数值(包括 NaN 以外的所有数字字符串) -
step默认值是 1;设为step="0.01"时,1.234会被视为非法(因为超出两位小数精度)
step 与 stepMismatch 错误的检测和提示要自己补全
原生 step 不提供错误文案或自动高亮,出错时仅让 input.validity.stepMismatch === true,但 input.validationMessage 可能为空(尤其在非英文环境或某些 Chromium 版本中)。
立即学习“前端免费学习笔记(深入)”;
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
实操建议:
- 监听
input或blur事件,手动调用input.checkValidity() - 若
input.validity.stepMismatch为true,用input.setCustomValidity("请输入 0.5 的整数倍")覆盖默认提示 - 注意:调用
setCustomValidity("")是重置校验状态的必要操作,否则后续合法输入仍报错
date/time 类型的 step 行为和兼容性差异大
type="date" 下 step 单位是“天”,step="7" 表示只能选每周第一天(如周一),但实际支持度差:Firefox 完全忽略 step,Safari 不支持 step 于 date 类型,只有 Chrome/Edge 有限实现。
type="time" 的 step 单位是秒,step="300"(5 分钟)在 Chrome 中有效,但在 Safari 中会被静默忽略 —— 这类跨浏览器不一致是真实痛点,不能依赖 step 做强约束。
真正需要精确时间粒度时,更稳妥的做法是用 type="text" + 自定义输入框 + JS 格式化和校验,而不是赌 step 的兼容性。
step 的设计初衷是辅助输入控件(如上下箭头、滑块)生成合理选项,不是替代业务逻辑校验。它轻量、声明式,但也脆弱——尤其在移动端软键盘、国际化日期格式、或用户粘贴数据时,几乎不起作用。


















