:required伪类仅对带required属性的原生表单控件(如input、textarea、select)生效,不识别aria-required或自定义组件;需确保属性存在且未被CSS隐藏或优先级覆盖。

怎样让:required真正生效
必须确保对应表单控件(如 、、)带有 required 属性,否则 :required 伪类不会匹配任何元素。它不识别 aria-required="true" 或后端校验逻辑。
常见错误是只写 HTML 结构但漏掉属性:
<input type="email"><!-- ❌ 不会触发 :required --><input type="email" required><!-- ✅ 正确 -->
:required能用在哪些元素上
支持范围比直觉中窄:仅对原生支持 required 属性的表单元素有效,包括:
-
(除type="hidden"、"button"、"submit"、"reset"、"image"外) -
(需至少一个没有selected属性,或显式设required)
避免仅靠颜色传达“必填”含义,务必配合图标、文字或位置提示。 最常见原因不是语法错,而是: 调试时直接在 DevTools 里检查元素是否带 (虽支持 required,但浏览器行为不一致)等均不可靠。样式建议与兼容性注意点
:required 在所有现代浏览器中都支持(Chrome 10+、Firefox 4+、Safari 5.1+、Edge 12+),但要注意:
:invalid 混淆::required 只看属性是否存在,不检查当前值是否为空或合法;:invalid 才反映实时校验状态border 直接加粗——某些屏幕阅读器用户依赖视觉边框区分必填项,加粗可能干扰其识别节奏input:required + label::after { content: " *"; color: #d32f2f; }
为什么加了
:required却没反应
display: none 或 visibility: hidden 隐藏——伪类仍匹配,但样式不可见input[type="text"] 的声明比 input:required 更具体)::slotted() 或 :host 中正确穿透(:required 不自动穿透到 slot 内部)required 属性未正确绑定为布尔属性(例如写成 :required="isRequired" 但 isRequired 是字符串 "false")required="" 属性,再看 computed styles 里 :required 规则是否被列出——没列出,说明选择器根本没匹配上。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











