Since November 2023, this feature works across the latest devices and browser versions. This feature might not work in older devices or browsers.
The :user-valid CSS pseudo-class represents any validated form element whose value validates correctly based on its validation constraints. However, unlike :valid it only matches once the user has interacted with it.
This pseudo-class is applied if the form control is valid and any of the following has occurred:
Once this pseudo-class has been applied, the user-agent re-validates whether the control is valid at every keystroke when the control has focus.
The result is that if the control was valid when the user started interacting with it, the validity styling is changed only when the user shifts focus to another control. However, if the user is trying to correct a previously-flagged value, the control shows immediately when the value becomes valid. Required items are flagged as invalid only if the user changes them or attempts to submit an unchanged invalid value.
:user-valid {
/* ... */
}
In the following example, the green border and ✅ only display once the user has interacted with the field. Try changing the email address to another valid email to see it in action.
<form>
<label for="email">Email *: </label>
<input
id="email"
name="email"
type="email"
value="[email protected]"
required />
<span></span>
</form>
input:user-valid {
border: 2px solid green;
}
input:user-valid + span::before {
content: "✓";
color: green;
}
| Desktop | Mobile | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on IOS | Samsung Internet | WebView Android | WebView on iOS | |
:user-valid |
119 | 119 | 884 | 105 | 16.5 | 119 | 884 | 79 | 16.5 | 25.0 | 119 | 16.5 |
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/CSS/:user-valid