停止在表单中使用 :valid,这个新 CSS 特性更适合你

网页表单设计中,开发者通常会利用 CSS 提供即时的验证反馈,例如使用伪类选择器 :valid 或 :invalid 来标记表单字段是否有效。但这种方法存在一个明显的问题:

表单字段在用户尚未输入时,就已显示为有效或无效状态,这会误导用户,严重影响用户体验。

本文将介绍一种全新的、更友好的 CSS 特性,帮助开发者解决这个难题——:user-valid 和 :user-invalid


传统 :valid 和 :invalid 存在的问题

使用传统的伪类 :valid 和 :invalid 时,一旦页面加载完成,只要表单元素满足或不满足验证规则,相关样式就会立即应用,即使用户尚未输入任何内容。

例如:

  • 一个邮箱输入框,用户还未输入任何文字,就已经显示绿色边框表示有效,令人困惑。

  • 另一个必填项在加载页面时就显示红色边框提示错误,给用户带来消极的初始印象。

此外,仅依靠颜色进行提示,显然也不符合 Web 可访问性原则,会给色觉障碍用户造成额外负担。


新方案::user-valid 和 :user-invalid

为解决上述问题,CSS 引入了两个新的伪类选择器:

  • :user-valid

  • :user-invalid

它们的优势在于:

  • 仅在用户交互之后才应用样式(例如用户输入内容或离开字段后)

  • 避免在页面首次加载时出现误导性的反馈

  • 显著提升用户体验与表单的可用性


为什么应当切换到 :user-valid 和 :user-invalid

与传统方法相比,这种新的方式使得表单反馈变得:

  • 更清晰直观

  • 更尊重用户交互流程

  • 更易于实现符合可访问性标准的设计

对于尚不支持这两个新选择器的浏览器,也可以通过替代方案(如:placeholder-shown)达到类似效果。


实际应用示例与实现方法

以下是具体实现方案与推荐用法。

第一步:给表单字段添加 required 属性

首先,确保表单字段具有 HTML 原生验证能力:

<input type="email" placeholder="请输入邮箱" required />

提醒:这一设置让浏览器明确字段何时为无效,但此时不要过早给予视觉反馈。

第二步:使用 :user-valid 和 :user-invalid

通过如下 CSS 实现用户交互后的验证反馈:

/* 默认状态:保持中立外观 */
input {
  border: 1px solid #ccc;
}

/* 用户交互后且输入有效 */
input:user-valid {
  border: 2px solid green;
  background-color: #e6ffe6;
}

/* 用户交互后且输入无效 */
input:user-invalid {
  border: 2px solid red;
  background-color: #ffe6e6;
}

现在,视觉反馈只有在用户真正互动之后才会展现。


兼容性方案:不支持 :user-valid 时的降级方案

对于不支持 :user-valid 的浏览器,可以使用 :placeholder-shown 结合传统伪类实现类似的延迟反馈效果:

/* 用户未输入时显示占位符的中立状态 */
input:placeholder-shown {
  border: 1px solid #ccc;
  background-color: white;
  color: #666;
}

/* 用户输入有效且占位符消失 */
input:valid:not(:placeholder-shown) {
  border: 2px solid green;
  background-color: #e6ffe6;
}

/* 用户输入无效且占位符消失 */
input:invalid:not(:placeholder-shown) {
  border: 2px solid red;
  background-color: #ffe6e6;
}

:placeholder-shown 可准确识别用户是否已输入,从而避免初始加载时的视觉误导。


小结:为用户提供更友好的表单体验

表单设计的核心是给用户带来清晰、直观且有益的交互反馈:

  • 避免用户还未操作即给予视觉提示。

  • 等待用户实际交互后再应用验证反馈。

  • 提升表单易用性与用户满意度。

因此,建议开发者停止使用传统的 :valid 与 :invalid 进行即时反馈,转而采用 :user-valid 和 :user-invalid 来实现更精确、更符合用户期望的交互效果。

前端AI·探索:涵盖动效、React Hooks、Vue 技巧、LLM 应用、Python 脚本等专栏,案例驱动实战学习,点击原文了解更多详情。

图片

最后:

python 技巧精讲

React Hook 深入浅出

CSS技巧与案例详解

vue2与vue3技巧合集

VueUse源码解读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@大迁世界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值