:valid仅对具备原生验证能力的表单元素生效,如type="email"/"url"/"number"、required、pattern等约束的input,以及textarea、select、checkbox、radio;text/hidden等无约束时恒为valid;需触发blur或submit才更新状态,JS需用checkValidity()主动校验。
表单元素哪些能用
判断合法性
只对带原生表单验证能力的元素生效,不是所有
都行。关键看有没有浏览器内置校验逻辑:比如
、
、
、
、
、
这类约束。像
或
没加任何验证属性时,浏览器认为它“永远合法”,
会一直匹配。
常见错误现象:
加了
却没反应——其实是有效的,但得先触发验证(比如失焦或提交),否则初始状态是
+
并存,容易误判。
和
支持
,只要加了
和
也支持,但逻辑不同:单个
有
时,勾选才
;
组需至少一个被选中
元素、自定义组件(如 Vue 的
封装)完全不响应
样式为什么没生效或延迟出现
根本原因在于浏览器只在“约束验证”(constraint validation)触发后才更新
状态。它不是实时监听输入值变化,而是依赖用户交互或 JS 主动调用
。
典型场景下,输入过程中不会立刻变绿勾:比如用户在
里打
,此时仍显示
(因为未失焦,未触发校验);直到 blur 或 submit 才重算。
立即学习
“
前端免费学习笔记(深入)
”;
想实现“边输边验”,必须配合 JS:监听
事件,手动调用
,再用 class 控制样式
避免用
做空值过滤——
在有默认 value 时可能不匹配,逻辑不可靠
某些安卓 WebView 或旧版 Safari 对
更新时机有延迟,建议加
缓动,别依赖瞬时样式切换
绿色勾图标的实现细节和兼容性注意点
用
配合
插入 ✅ 最常见,但要注意伪元素默认是 inline,且不继承父级颜色/尺寸。直接写
不一定生效。
使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
下载
容易踩的坑:
没设
在 input 上,
会相对 body 定位,飘走
在
上,右侧有浏览器自带上下箭头,
容易重叠,建议用
预留空间
IE 完全不支持
伪类,如果需兼容,得用 JS 动态加 class(如
)
部分屏幕阅读器不会把
内容当可访问内容,纯图标无文字时,建议加
或用背景图替代
为什么有时
和 JS 的
结果不一致
本质是验证时机和上下文不同。
是 CSS 层面对当前 DOM 状态的快照,而
是 JS 主动触发一次完整校验流程,会强制检查所有约束,包括那些尚未触发的(比如未失焦的必填字段)。
例如:一个空的
,页面加载完,CSS 认为它
(因未触发验证),但 JS 调用
会立刻返回
。
不要在 CSS 里依赖
做关键业务逻辑判断,比如禁用提交按钮——应该用 JS 监听
+
+
综合控制
返回的是整个表单是否通过,而单个元素的
只管自己,别混用
如果用了
,JS 设置的错误信息会覆盖原生校验结果,此时
状态由该方法返回值决定(空字符串才合法)
真正要稳,就得接受一点:CSS 伪类只是视觉反馈的快捷方式,不是验证引擎。复杂规则、跨字段联动、异步校验,都得交给 JS。
:valid:validtype="email"type="url"type="number"requiredminlengthpatterntype="text"type="hidden":validinput[type="text"]required:blank:validtextareaselect:validrequiredinput[type="checkbox"]input[type="radio"]checkboxrequired:validradiocontenteditable:valid:valid:validcheckValidity()input[type="email"]a@:validinputel.checkValidity():valid:not(:placeholder-shown):placeholder-shown:validtransition:valid::aftercolor: greeninput:valid {
position: relative;
}
input:valid::after {
content: "✓";
color: #4caf50;
position: absolute;
right: 8px;
top: 50%;
transform: translateY(-50%);
font-size: 14px;
}position: relative::afterinput[type="number"]::afterpadding-right:validis-valid::afteraria-hidden="true":validcheckValidity():validcheckValidity()input[required]:validel.checkValidity()false:validinputblursubmitform.checkValidity():validsetCustomValidity("xxx"):valid