:valid 和 :invalid 伪类不执行校验,仅响应 html 原生验证状态;依赖 required、type、pattern、min/max 等属性触发,适用于视觉反馈,不能替代 javaScript 校验。

css 中的 :valid 和 :invalid 伪类,本身**不执行校验逻辑**,而是依赖 HTML 表单元素的原生验证状态来响应样式变化。也就是说,它们只是“观察者”,真正决定是否合法的是 HTML 的 required、type(如 email、url、number)、pattern、min/max 等约束属性。
确保表单控件启用原生验证
只有设置了验证相关属性的表单元素,:valid 和 :invalid 才会生效:
- 必填项:添加
required属性,空值即为:invalid - 类型校验:使用
type="email"、type="url"、type="number"等,浏览器会自动按格式判断 - 自定义模式:用
pattern配合正则,例如pattern="[0-9]{6}"限制 6 位数字 - 数值范围:对
input[type="number"]设置min="1"、max="100"
:valid 与 :invalid 的触发时机
这两个伪类在以下情况动态切换:
- 页面加载时,若字段有值且符合所有约束 → 初始为
:valid;若为空且required→ 初始为:invalid - 用户输入过程中,浏览器实时重新评估(部分浏览器有防抖,不会每键触发)
- 提交表单时,所有字段强制验证,未通过的立即变为
:invalid - red”>注意:未聚焦的空
required字段,在 chrome/firefox 中默认是:invalid,但 safari 可能延迟到首次交互后才激活
实用样式建议
用视觉反馈帮助用户识别状态,但避免仅靠颜色(考虑色觉障碍):
立即学习“前端免费学习笔记(深入)”;
- 给
:invalid添加红色边框 + 叹号图标(配合::after) - 给
:valid添加绿色边框或对勾图标 - 配合
:focus:invalid在聚焦时强化错误提示 - 慎用
:invalid:not(:placeholder-shown)区分“空必填”和“填错”,提升体验
不能替代 javascript 校验
CSS 伪类无法: