前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库CSS :in-range pseudo-class input range
CSS层叠与选择器

in-range 和 out-of-range 伪类适用于哪些控件?

:in-range 匹配当前值在 min 和 max 范围内的输入框,:out-of-range 匹配超出范围的。它们只对设置了 min 或 max 属性的数字、日期类 <input> 有效。

前端进阶之旅 · 一题精讲更新于 2026.09.29
CSS#层叠与选择器#表单
先看核心答案读代码示例
理解线索

范围验证的判断逻辑

  1. :in-range值 >= min 且 <= max 时匹配
  2. :out-of-range值 < min 或 > max 时匹配
  3. 前提条件元素必须设置了 min 或 max,否则两个都不匹配

没有填任何值的输入框不算超出范围。空的 <input type="number" min="1"> 不匹配 :out-of-range,要和 :required 配合才能检测空值。

核心回答

先记住这个答案

:in-range 和 :out-of-range 是表单验证伪类,用来判断输入框的当前值是否在 min 和 max 规定的范围内。比如 <input type="number" min="1" max="100">,用户输入 50 时匹配 :in-range,输入 150 时匹配 :out-of-range。这两个伪类只对有范围概念的输入类型有效,纯文本的 <input type="text"> 写了也不会匹配。

  • 需要 min 或 max 属性才生效
  • 只对数字和日期类输入框有效
  • min、max 决定范围边界
  • 空值不匹配 :out-of-range

哪些输入类型支持范围伪类

不是所有 <input> 都支持 :in-range。只有那些有数值或日期概念的类型才有范围可言。

数字和日期输入的范围验证CSS
/* 数值在范围内时绿色边框 */
input[type="number"]:in-range {
  border-color: #2ecc71;
}

/* 超出范围时红色边框和背景 */
input[type="number"]:out-of-range {
  border-color: #e74c3c;
  background-color: #fdf2f2;
}

支持的类型包括 number、 range、 date、 datetime-local、 month、 week、 time。这些类型都可以设置 min 和 max 属性来定义有效范围。 <input type="text"> 即使设置了 min 和 max 属性也不会匹配这两个伪类,因为文本输入没有数值范围的概念。想限制文本长度要用 minlength 和 maxlength,但那些不会触发 :in-range。

和 valid/invalid 的区别

:out-of-range 和 :invalid 经常同时匹配,但它们不是一回事。:invalid 的判断范围更广,包括格式错误、必填为空、范围超出等所有验证失败的情况。:out-of-range 只关心值有没有超出 min 和 max 的限制。

比如 <input type="number" required min="1">,用户什么都没填时,它匹配 :invalid(因为 required 没满足)但不匹配 :out-of-range(空值不算超范围)。用户输入了 0 时,两个都匹配。用户输入了 5 时,匹配 :valid 和 :in-range。

同时有 step 约束时
<input type="number" min="0" max="10" step="2"> 里输入 3,值在范围内但不满足 step 约束。这时匹配 :in-range(值在 0~10 之间)但匹配 :invalid(不是 2 的倍数)。这个细节面试偶尔会问到。

空值的特殊处理

一个容易混淆的行为:输入框为空时,既不匹配 :in-range 也不匹配 :out-of-range。空值不是 0,浏览器认为它「没有值」,不参与范围判断。

如果想在空值时也给出提示,需要和 :required 配合。用 :required:invalid 可以捕获必填但未填的状态,:out-of-range 只负责已填但超范围的情况。

回答前,多想一步

容易答错的地方

以为只设置了 min 就不能匹配 in-range
只设置 min 不设置 max 也能生效。:in-range 会认为值大于等于 min 就在范围内(上限无穷大)。反过来只设置 max 也一样,值小于等于 max 就匹配(下限无穷小)。
以为 input type="text" 也能用
文本输入框、密码框、邮箱输入框这些类型没有数值范围的概念。即使写了 min 和 max 属性,:in-range 和 :out-of-range 也不会生效。
试着用自己的话回答

面试官还会怎么问?

input type="range" 会触发 out-of-range 吗?

正常情况下不会。滑块控件的值天然被限制在 min 和 max 之间,用户没法拖出范围。但如果用 JavaScript 的 value 属性强行设置一个超范围的值,滑块会被钉在最近的端点,值会被浏览器修正,所以 :out-of-range 几乎不会在滑块上触发。

怎么同时显示「超范围」和「具体超了多少」?

CSS 只能判断在不在范围内,不能读取具体的数值差。想显示「最大值为 100,你输入了 150」这样的提示,需要 JavaScript 读取 validity.rangeOverflow 以及 validity.rangeUnderflow 和元素的 validationMessage 来构造提示文案。

step 导致的不合法和超范围有什么区别?

step 约束失败(比如 step="2" 但输入了 3)不会触发 :out-of-range,因为值本身在 min 到 max 的范围内。它触发的是 :invalid。在 JavaScript 的 Validity API 里,对应的是 validity.stepMismatch,和 validity.rangeOverflow 是不同的标志位。

从一道题,走向一组知识

把知识连起来

层叠与选择器

伪类和伪元素有什么区别?冒号怎么写?

:in-range 是状态伪类,不会像 ::before 这样的伪元素生成内容。

层叠与选择器

revert 用在可继承属性上,值会回到父元素的继承值还是浏览器默认值?

校验提示继承父级文字样式时,可用 revert 等值回退声明;它不改变范围校验结果。

参考资料

  • CSS:层叠与选择器参考资料

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 哪些输入类型支持范围伪类
  3. 和 valid/invalid 的区别
  4. 空值的特殊处理
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑