网站

CSS 伪类

CSS 伪类 | MDN

引入

表单是网页里用户最常用的交互区域之一。

输入框、复选框、单选按钮等表单控件,会根据用户的操作进入不同的状态,例如获取焦点、禁用、选中、填写内容等。CSS 输入伪类就是用来选中这些特定状态的表单元素,从而给它们添加不同的样式。

正文

定义

定义

CSS 输入伪类用于选中表单元素的特定输入状态,例如获取焦点、禁用、选中、必填等,从而根据状态设置不同的显示效果。

输入伪类主要用于表单元素,例如 <input><textarea><select> 等。

常见输入伪类

:focus

选中获取焦点的元素,例如鼠标点击输入框或通过 Tab 键选中时。

input:focus {
  border-color: blue;
  outline: 2px solid lightblue;
}

当用户点击输入框时,边框和轮廓会变成蓝色,让用户明确知道当前正在操作哪个输入框。

:disabled

选中被禁用的表单元素,这些元素不能被用户交互。

input:disabled {
  background-color: #f0f0f0;
  color: #999;
  cursor: not-allowed;
}

禁用的输入框通常会显示灰色背景和灰色文字,鼠标移上去会显示不可用的光标。

:enabled

选中可交互的表单元素,和 :disabled 相反。

input:enabled {
  background-color: white;
}

这个伪类用得不多,因为可交互的元素通常就是默认状态。

:checked

选中被选中的复选框或单选按钮。

input[type="checkbox"]:checked {
  accent-color: green;
}
 
input[type="radio"]:checked + label {
  font-weight: bold;
}

第一个例子让选中的复选框显示绿色勾选标记,第二个例子让选中的单选按钮旁边的文字变粗。

:required

选中必填的表单元素,通常是带有 required 属性的输入框。

input:required {
  border-left: 3px solid red;
}

给必填输入框左侧加一个红色边框,提醒用户这个字段不能为空。

:optional

选中非必填的表单元素,和 :required 相反。

input:optional {
  border-left: 3px solid #ccc;
}

可选输入框显示灰色边框,和必填输入框的红色边框形成对比。

:valid

选中内容符合验证规则的表单元素。

input:valid {
  border-color: green;
}

例如邮箱输入框填写了正确格式的邮箱地址后,边框会变成绿色。

:invalid

选中内容不符合验证规则的表单元素。

input:invalid {
  border-color: red;
}

如果邮箱输入框填写了错误格式的内容,边框会变成红色,提示用户输入错误。

:placeholder-shown

选中当前显示占位符的输入框,也就是用户还没有输入内容的状态。

input:placeholder-shown {
  border-color: #ddd;
}

当输入框显示占位符时,边框是浅灰色;一旦用户开始输入,占位符消失,边框颜色会恢复默认。

:read-only

选中只读的表单元素,这些元素可以显示内容但不能被编辑。

input:read-only {
  background-color: #f5f5f5;
  cursor: default;
}

只读输入框通常显示浅灰色背景,鼠标移上去不会显示编辑光标。

:read-write

选中可编辑的表单元素,和 :read-only 相反。

input:read-write {
  background-color: white;
}

可编辑的输入框通常保持白色背景。

例子

增强表单交互体验

<form>
  <label for="email">邮箱(必填)</label>
  <input type="email" id="email" required placeholder="请输入邮箱">
  
  <label for="phone">电话(可选)</label>
  <input type="tel" id="phone" placeholder="请输入电话">
  
  <button type="submit">提交</button>
</form>
/* 获取焦点时的样式 */
input:focus {
  border-color: #2563eb;
  outline: 2px solid #bfdbfe;
}
 
/* 必填字段左侧加红色标记 */
input:required {
  border-left: 3px solid #ef4444;
}
 
/* 可选字段左侧加灰色标记 */
input:optional {
  border-left: 3px solid #d1d5db;
}
 
/* 验证通过时显示绿色边框 */
input:valid {
  border-color: #10b981;
}
 
/* 验证失败时显示红色边框 */
input:invalid {
  border-color: #ef4444;
}
 
/* 禁用状态 */
input:disabled {
  background-color: #f3f4f6;
  color: #9ca3af;
  cursor: not-allowed;
}

这个例子结合了多种输入伪类,让表单的状态反馈更清晰,用户体验更好。

复选框选中样式

<label>
  <input type="checkbox" id="agree">
  我同意服务条款
</label>
/* 选中后文字变色 */
input[type="checkbox"]:checked + label {
  color: #2563eb;
  font-weight: 500;
}
 
/* 选中后复选框变色 */
input[type="checkbox"]:checked {
  accent-color: #2563eb;
}

当用户勾选复选框后,文字会变成蓝色并加粗,复选框本身也会显示蓝色勾选标记。

特点

  • 输入伪类主要用于表单元素
  • 根据用户交互状态自动匹配元素,不需要 JavaScript
  • :focus 用于选中当前获取焦点的元素
  • :disabled:enabled 用于区分可用和禁用状态
  • :checked 用于选中已勾选的复选框或单选按钮
  • :required:optional 用于区分必填和可选字段
  • :valid:invalid 用于根据验证规则反馈输入状态
  • :placeholder-shown 用于判断输入框是否为空
  • :read-only:read-write 用于区分可编辑和只读状态
  • 输入伪类可以结合其他选择器使用,例如 input[type="email"]:focus

注意事项

  • :focus 样式不要完全移除,否则键盘用户无法判断当前焦点位置
  • :invalid 不要在页面加载时就显示错误样式,可以结合 :focus:not(:placeholder-shown) 使用
  • :checked 需要配合 input[type="checkbox"]input[type="radio"] 使用
  • :valid:invalid 依赖表单元素的验证属性,例如 type="email"requiredpattern
  • :disabled 元素不会响应用户交互,也不会提交表单数据
  • 不同浏览器对某些伪类的支持可能有差异,使用前最好测试兼容性

理解

可以把输入伪类理解为表单元素的”状态检测器”。

它让 CSS 能够自动识别用户正在操作哪个表单元素、元素是否被禁用、是否被选中、输入内容是否有效等状态,然后根据这些状态应用不同的样式。

这样做的好处是不需要写 JavaScript,就能让表单根据用户的操作实时反馈视觉效果,提升用户体验。

例如,当用户点击输入框时,边框高亮;当用户填写完邮箱地址后,边框变绿表示格式正确;如果格式错误,边框变红提示用户修改。

输入伪类的核心价值是用纯 CSS 实现表单的状态反馈,让用户明确知道当前操作的是哪个元素、操作是否有效、是否有错误需要修正。

引出

理解了输入伪类之后,可以继续学习 CSS 伪类,了解更多伪类的种类和用法。

也可以结合 CSS 表单样式,学习如何全面设置表单控件的显示效果。

配合 CSS 可访问性,让表单不只美观,也能更好地支持键盘导航和辅助技术。