:in-range 伪类仅在 type="number"(或 "date"/"time")且同时设置合法 min 和 max、用户输入可解析为数字的有效值时生效;空值、type="text"、js 直接赋值均不触发校验。

:in-range 不是自动生效的视觉开关,它只在 type="number" 且同时设置了合法 min 和 max 属性、且用户输入了可解析为数字的有效值时才匹配。空值、type="text"、JS 直接赋值不触发校验——这些是样式不出现的最常见原因。
为什么写了 :in-range 却没反应?
不是选择器写错了,而是浏览器根本没进入范围判定流程:
-
type必须是"number"("date"、"time"也行,但"text"加min/max完全无效) -
min和max必须同时存在,且值为纯数字字符串(如min="0",不能是min=""或min="auto") - 初始
value为空(value="")或非法(value="abc")时,既不匹配:in-range也不匹配:out-of-range—— 浏览器跳过范围计算 - 用 JS 直接设置
input.value = "200"不会更新伪类状态;必须手动触发校验,比如input.dispatchEvent(new Event('input', { bubbles: true }))
:in-range 和 :out-of-range 的边界到底怎么算?
它们只做一件事:判断当前 value 是否落在 [min, max] 闭区间内,不关心格式、step 或 required:
PigX UI Pro 前端开发指南 - Vue 3 + TypeScript + Element Plus。当用户提到 PigX UI、PigX 前端、lgb-mgui 项目、Vue 3 企业级后台开发、Element Plus 后台开发时使用此技能。
-
value="10"+min="10" max="20"→ 匹配:in-range(端点包含) -
value="20"+ 同上 → 仍匹配:in-range -
value="abc"或value=""→ 两个伪类都不匹配(不是:out-of-range!) -
value="10.5"+step="1"→ 仍匹配:in-range(step不影响范围判定,只影响:valid)
怎么让提示真正被用户注意到?
单靠改 border-color 很难在密集表单中起作用,关键要组合反馈:
- 对
:out-of-range加box-shadow和背景色(如background-color: #fff8f8),比单纯变边框更醒目 - 用相邻兄弟选择器显示提示文案:
#age:out-of-range + #age-hint::after { content: "需在 18–65 之间"; color: #e53e3e; } - 务必重置
outline,否则和浏览器默认焦点环打架:outline: none或outline: 2px solid transparent - 别用
display: none隐藏提示元素——会破坏屏幕阅读器可访问性
最易被忽略的一点::in-range 状态无法用 getComputedStyle() 读取,也不能通过 JS 直接查询“是否在范围内”。你只能监听 input 事件,再手动比对 element.valueAsNumber 与 min/max 属性值。它只是 UI 钩子,不是校验代理——后端和 JS 仍得自己检查。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










