前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
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 :required :optional input validation
CSS层叠与选择器

required 和 optional 伪类怎么用?匹配哪些表单元素?

:required 匹配设置了 required 属性的表单控件,:optional 匹配没有设置的。它们跟着 HTML 属性走,和用户有没有填内容无关。给必填项标红星、给选填项用浅色边框,不需要额外的类名。

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

两个伪类的触发条件

  1. :required元素有 required 属性时匹配
  2. :optional元素没有 required 属性时匹配
  3. 适用范围<input>、<select>、<textarea> 三类表单控件

<div> 这类非表单元素不会匹配 :required 也不会匹配 :optional,即使给它加了 required 属性也没用。

核心回答

先记住这个答案

:required 匹配 HTML 中写了 required 属性的表单控件,比如 <input required>。:optional 刚好相反,匹配没有写 required 的。这两个伪类只看属性有没有,和用户有没有填内容没关系。用它们可以在纯 CSS 里区分必填项和选填项的视觉样式。

  • :required 匹配有 required 的控件
  • :optional 是 :required 的取反
  • 和用户输入无关,只看 HTML 属性
  • :optional 表示控件无需填写

给必填项和选填项不同的样式

表单设计中,必填项通常用红色星号或加粗边框来提醒用户。以前要在 HTML 里手动加类名或在 JavaScript 里判断,现在直接用 :required 和 :optional 就行。

必填项加边框颜色CSS
/* 必填项左边加一条红色竖线 */
input:required {
  border-left: 3px solid #e74c3c;
}

/* 选填项用默认边框 */
input:optional {
  border-left: 3px solid #ddd;
}

只要 HTML 里写了 <input required>,左边就会自动出现红色竖线。不需要 JavaScript,也不需要额外的类名。动态用 JavaScript 添加或移除 required 属性时,样式会实时更新。

和其他验证伪类配合使用

:required 经常和 :valid、:invalid 搭配,实现更细致的验证反馈。比如必填项为空时显示红色,填了有效内容后变绿色。

必填项的三种状态CSS
/* 必填且为空(无效) */
input:required:invalid {
  border-color: #e74c3c;
}

/* 必填且有效 */
input:required:valid {
  border-color: #2ecc71;
}

/* 选填且有效 */
input:optional:valid {
  border-color: #95a5a6;
}

:required:invalid 在页面加载时就会匹配(因为空的必填项天然无效),这可能会让用户还没开始填就看到一片红色。解决办法是加上 :not(:placeholder-shown) 条件,只有用户开始输入后才显示验证状态。或者用 :focus 来限制只在聚焦时才变色。

适用范围和限制

:required 和 :optional 只对表单控件生效,具体是 <input>(大多数类型)、<select> 和 <textarea> 这三类元素。<input type="hidden"> 和 <input type="range"> 虽然也是 <input>,但 required 属性对它们没有实际的验证约束意义。

给 <div> 或 <span> 加 required 属性不会让它匹配 :required,因为这些元素不是表单控件,浏览器不会把 required 当作有效属性来处理。

回答前,多想一步

容易答错的地方

以为 required 跟用户输入有关
:required 只看 HTML 属性,和输入框里有没有内容完全无关。一个 <input required> 即使用户已经填了内容,:required 依然匹配。要根据有没有填内容来区分,应该用 :valid 和 :invalid。
以为 optional 是默认样式的意思
:optional 不是「没有任何伪类匹配」的意思,它是主动匹配没有 required 属性的表单控件。如果你写了 input:optional { ... } 的样式,它会应用到所有非必填输入框上。
试着用自己的话回答

面试官还会怎么问?

用 JavaScript 动态添加 required 属性后,伪类会更新吗?

会。:required 和 :optional 实时跟踪 DOM 属性。用 element.setAttribute('required', '') 或 element.required = true 添加属性后,样式会立刻从 :optional 变成 :required。

怎么避免页面一加载必填项就显示红色?

用 :user-invalid 伪类代替 :invalid。:user-invalid 只在用户实际和表单交互过之后才匹配(比如输入又删除、或者点过提交按钮),避免了页面加载时就满屏红色的问题。不过 :user-invalid 浏览器支持较晚,兼容性不够时可以用 :not(:placeholder-shown):invalid 来近似实现。

select 元素怎么判断 required?

<select required> 时,如果当前选中的 <option> 的 value 是空字符串,就匹配 :invalid。通常的做法是第一个 <option> 写成 <option value="">请选择</option>,这样用户没选时就是无效状态。

从一道题,走向一组知识

把知识连起来

层叠与选择器

target 伪类是怎么根据 URL 的 hash 来匹配元素的?

:target 与 :required 都是由页面状态决定的伪类,但一个看 URL 片段,一个看控件约束。

层叠与选择器

before 和 after 伪元素的 content 属性能设置哪些值?

::before 生成的必填星号只是视觉提示,required 约束仍要写在真实控件上。

参考资料

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

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

本题目录
  1. 先记住这个答案
  2. 给必填项和选填项不同的样式
  3. 和其他验证伪类配合使用
  4. 适用范围和限制
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

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

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