DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 $200 免费积分!
:invalid
是一种伪类选择器,它允许对无效表单元素进行样式设置。:invalid
可以添加到任何表单元素,例如 form
、fieldset
或 input
,以根据元素的有效性或包含的子元素的有效性来增强样式。
form:invalid {
outline: 3px dashed red;
}
语法
:invalid {
/* ... */
}
虽然在所有表单元素的语法上都相似,但 form
、fieldset
和 input
之间的验证略有不同。我们将在接下来的部分中花时间探讨这些差异。
表单
form
元素允许使用 :invalid
根据子表单元素(例如 fieldset
或 input
)的有效性进行条件样式设置。如果任何子表单元素无效,则 form
也将被视为无效,并且将应用 :invalid
条件样式。
form:invalid {
outline: 3px dashed red;
}
字段集
类似于 form
,fieldset
也允许使用 :invalid
根据子 input
元素(如单选按钮或复选框输入)的有效性进行条件样式设置。
fiedset:invalid {
outline: 3px dashed red;
}
输入
input
元素允许使用 :invalid
通过验证 input
的 value
进行条件样式设置。
验证检查输入值是否为使用 required
属性所需的,或者输入是否必须与 pattern
属性描述的模式匹配。
将 :invalid
添加到 input
将对所有无效输入类型应用相同的样式。将输入与 [type]
属性选择器配对可实现对特定输入类型的样式设置。
/* All input types */
input:invalid {
outline: 3px dashed red;
}
/* Specific input types */
input[type="text"]:invalid {
outline: 3px dashed red;
}
用法
可访问性注意事项
虽然 :invalid
允许对表单元素进行增强样式设置,但这可能不足以成功地将输入的有效性可访问地传达给辅助设备。
除了设置输入的样式之外,请考虑包含描述无效验证的文本,以便辅助设备可以读取。
验证测试
要对输入启用验证测试,必须通过将 required
属性应用于该字段来将输入设置为必填字段。
<input type="text" id="name" name="name" required />
具有 required
属性的输入,如果未赋予值,将与 :invalid
伪类选择器匹配。
浏览器将为某些输入类型提供额外的验证测试。例如,电子邮件类型输入通常要求在输入值中包含一个“@”符号才能被视为有效。
通过为输入提供一个模式,该模式应与输入值匹配才能被视为有效,可以增强有效性测试。这可以通过在输入上包含 pattern
属性来实现。
pattern
属性必须提供一个模式,通常以 正则表达式 格式,来测试提供的输入值。
<input type="text" id="zipcode" name="zipcode" pattern="[0-9]{5}" inputmode="numeric" required />
链式伪类
:invalid
伪类可以与其他伪类选择器(如 :focus
或 :hover
)链接在一起,以进一步调整样式。
.input:focus:invalid {
outline: 3px dashed red;
}
:has()
一起使用
与 由于功能性伪类选择器 :has()
在浏览器中广泛可用,因此可以将其与有效性伪类选择器结合使用,使其他元素能够从条件样式表单元素中受益。
要为包含无效输入的父元素设置样式
div:has(input:invalid) {
outline: 3px solid red;
}
规范
:invalid
在 CSS 选择器级别 4 规范 中定义为“有效性伪类”,这意味着它用于根据对用户输入的评估来设置交互元素的样式。
这没问题。
巩固您的示例
电子邮件:[email protected]
电子邮件(必填):[email protected] > 变成有效 _
IE10+ 使用伪元素的错误
http://codepen.io/diegoleme/pen/cJyjF
嗨,Chris,您可能需要更新此内容,因为它包含轻微的错误——在“感兴趣点”中,它说我们可以将 :invalid 连接到 :before :after 以在输入上显示一些“内容”,但事实上我们不能在输入上使用 ::after 和 ::before(无论是否连接)。
input[required]:invalid::after,
input[required]:valid::after {
content: ‘not a chance’;
}
Neil
你说得对,Neil。
以下是一些关于为什么它不可能的解释:http://stackoverflow.com/questions/2587669/can-i-use-the-after-pseudo-element-on-an-input-field
我正要提同样的事情:实际上不能在输入元素上使用生成的 content。在我记起为什么它不起作用之前,我花了 20 分钟试图根据这篇文章来做!:)
dfs
gcfbv
需要注意的是,[value=”] 仅捕获元素的初始状态,这使得它作为选择器几乎毫无用处。
你能更新浏览器支持表吗?
根据 caniuse.com,android 和 iOS 现在支持 :invalid 伪类。
@link https://caniuse.cn/#search=%3Ainvalid
IE 会在 :disabled 输入上错误地匹配
:invalid
。为了解决这个问题,我们必须使用
:enabled
伪类提高选择器的特异性。值得注意的是,select 元素上的
:invalid
在 Safari/Mac 上不起作用(至少在 13 版本上不起作用)。此外,对于那些使用它来模拟输入字段占位符灰色的人来说,请注意,Mac 上的 Firefox 开发版对两者渲染的颜色不同。我不知道为什么。相同的十六进制颜色引用,但渲染结果不同。
除了关于将 :after 与 :invalid 连接的部分之外,非常好,但谈论 (input) 元素的 :invalid 伪类的设置或清除 (:valid 设置) 也会非常有帮助,或者至少提供指向此类内容的链接。
谢谢