step 属性仅对 type="number"、"range"、"time"、"date"、"datetime-local"、"month"、"week" 有效;在 type="text" 或 "email" 上无效,type="date" 多数浏览器忽略 step,type="datetime-local" 和 "time" 的 step 单位分别为秒且需为整数,浮点步长存在精度问题,动态修改 step 后需同步重置 value 以确保合规。

step 属性只对哪些 type 生效
它只在 type="number"、type="range"、type="time"、type="date"、type="datetime-local"、type="month"、type="week" 上起作用。给 type="text" 或 type="email" 加 step,浏览器会解析但完全忽略——没箭头、不校验、stepUp() 调用可能静默失败或报错。
常见误用:<input type="text" step="0.01"> 看似想控小数精度,实则无效。必须明确设为 type="number" 才能激活步进逻辑。
type="date" 的 step 大多数浏览器忽略:无论设 step="7" 还是 step="1",日期选择器始终按天跳转,无法实现“每周一”选值。
type="datetime-local" 的 step 单位是秒,且只接受整数(如 step="60" 表示 1 分钟),设 step="30.5" 会被截断为 30。
step="0.1" 输入 0.15 为什么变成 0.2
这不是拦截,而是浏览器的自动矫正行为:当用户手动输入不符合步长规则的值(如 step="0.1" 下输 0.15),失焦或提交时,Chrome/Firefox 会四舍五入到最近的合法值(0.2);Safari 可能直接截断为 0.1。这个动作不可禁用,也不触发 input 事件。
根本原因在于浮点精度:二进制无法精确表示 0.1,旧版 Chrome 甚至会把 step="0.1" 当作 step="1" 处理。
安全做法是换单位:金额用“分”,设 min="100"、step="1"、value="199" 表示 1.99 元。
必须用小数时,统一补零:min="0.00"、max="10.00"、step="0.01",避免 min="0" 和 step="0.01" 混用。
别自己写 parseFloat(val) + 0.1,改用原生 input.stepUp(1),它严格按当前 step 执行,不引入 JS 浮点误差。
动态修改 step 后 value 不对齐怎么办
滑块或数字框的 step 不是设了就生效的独立开关。如果初始 value 本身就不符合 min + n × step 规则(比如 min="0"、step="0.25" 但 value="1.7"),浏览器会静默修正 value 到最近合法值——你拖不动、点不准,往往是因为这个隐式校验已提前把值“锁死”了。
动态改 step 后,必须同步重置 value:
- 用
setAttribute("step", "0.5"),而非直接赋值el.step = "0.5"(后者 DOM 更新后浏览器未必立即重算可选值集合) - 重置
value时,先做合规性校验:Math.round(el.value / newStep) * newStep - 初始化时确保
value是min + n × step的形式(n为整数),例如min="0"、step="0.25",就用value="1.75",别用"1.7"
time 输入框的 step 单位是秒不是分钟
<input type="time"> 的 step 单位是**秒**,不是分钟。写 step="15" 是 15 秒,不是 15 分钟,会导致时间按秒级跳变,失去实用性。
正确换算方式:
- 每 1 分钟可选 →
step="60" - 每 5 分钟可选 →
step="300" - 每 15 分钟可选 →
step="900" - 每 30 分钟可选 →
step="1800" - 每 1 小时可选 →
step="3600"
若希望默认值也对齐步长(比如设为 09:00 而非 09:07),建议显式设置 value,且确保其秒数部分为 0(如 value="09:00" 或 value="14:30"),否则某些浏览器可能自动舍入或显示异常。
注意:step 是用户体验辅助属性,不是数据校验手段。后端或 JavaScript 仍需验证时间是否符合业务要求(如是否为 15 分钟倍数)。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











