: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;若为空且 required → 初始为 :invalid
:invalid
required 字段,在 Chrome/Firefox 中默认是 :invalid,但 Safari 可能延迟到首次交互后才激活用视觉反馈帮助用户识别状态,但避免仅靠颜色(考虑色觉障碍):
:invalid 添加红色边框 + 叹号图标(配合 ::after):valid 添加绿色边框
或对勾图标:focus:invalid 在聚焦时强化错误提示:invalid:not(:placeholder-shown) 区分“空必填”和“填错”,提升体验CSS 伪类无法:
:valid/:invalid 适合轻量级视觉反馈,业务级校验仍需 JS 配合 checkValidity() 和 setCustomValidity()