:in-range 和 :out-of-range 仅对合法数字值且 min/max 为纯数字字符串的 number/range/date 输入生效;空值或非法值不匹配二者,且不阻止提交,仅为视觉提示。

:in-range 和 :out-of-range 是 CSS 原生伪类,只对带有 min、max 属性的 (以及 range、date 等支持范围的输入类型)生效。它们不触发 JavaScript 校验,也不改变表单提交行为——纯视觉反馈,且仅在浏览器已解析并应用了 min/max 值的前提下才起作用。
为什么给 number 输入框加了 min/max 却没触发 :in-range?
常见原因是:值为空、值非法(如字母)、或未被浏览器识别为有效数字。这两个伪类只在输入值是**合法数字且可与 min/max 比较**时才计算。
-
value=""或value="abc"→ 不匹配:in-range也不匹配:out-of-range(浏览器视为“无有效值”,跳过范围判断) -
value="5"+min="10"→ 匹配:out-of-range -
value="15"+min="10" max="20"→ 匹配:in-range -
value="25"+min="10" max="20"→ 匹配:out-of-range
注意:min 和 max 必须是字符串形式的数字(如 "10"),且不能含单位或空格;否则会被忽略,伪类失效。
如何用 :in-range/:out-of-range 实现即时视觉反馈?
直接写 CSS 规则即可,无需 JS。但要确保样式足够明显,且兼容主流浏览器(Chrome 10+、Firefox 29+、Safari 15.4+ 支持良好;Edge 基于 Chromium 后也支持)。
input[type="number"] {
border: 2px solid #ccc;
}
input[type="number"]:in-range {
border-color: #4CAF50;
}
input[type="number"]:out-of-range {
border-color: #f44336;
background-color: #fff8f8;
}
关键点:
- 必须显式声明
type="number",type="text"即使加了min/max也不触发 - 伪类优先级低,若与其他规则(如
:focus)冲突,需提高 specificity 或用!important(不推荐,优先调整顺序) - 不适用于实时输入过程中的中间态(比如输到
"1"时还没到"15"),只对最终解析后的值生效
:out-of-range 能替代 required 或 JS 校验吗?
不能。它只是样式钩子,不影响 checkValidity() 结果,也不阻止表单提交。
-
input.checkValidity()返回true,即使当前是:out-of-range状态(只要不是required且为空) - 用户仍可点击提交按钮,浏览器不会拦截 —— 这和
:invalid不同(后者在required未填时会触发) - 若需阻断提交,必须配合 JS 监听
submit并调用event.preventDefault(),再手动检查input.valueAsNumber是否在范围内
也就是说::out-of-range 是提示,不是守门员。
最容易被忽略的是:它完全依赖 HTML 属性值的合法性与浏览器解析结果。一旦 min 写成 min="10px" 或 max 被 JS 动态设为非数字字符串,整个机制就静默失效,连报错都不会有。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











