Pseudo-classe CSSPseudo-classes

:invalid

Correspond aux champs de formulaire dont la valeur enfreint les règles de validation HTML, par exemple un champ requis vide ou une adresse e-mail incorrecte.

Sur cette page

Exemple

#
CSS
.error {
  display: none;
  color: #fda4af;
}

.field input:user-invalid {
  border-color: #f43f5e;
}

.field input:user-invalid + .error {
  display: block;
}
Aperçu

Saisissez un texte sans le signe @ et cliquez à côté du champ. Le message n’apparaît qu’après cette interaction, et non dès le chargement de la page.

Définition et utilisation

#

La pseudo-classe :invalid relie le CSS à la validation intégrée des formulaires. Un champ y correspond quand sa valeur enfreint l’une des règles écrites en HTML : required sur un champ vide, type="email" sur un texte qui n’est pas une adresse, ainsi que pattern, min ou max. Son contraire est :valid.

L’état change en continu, à chaque caractère saisi. <form> et <fieldset> correspondent aussi à :invalid s’ils contiennent au moins un champ incorrect, ce qui permet par exemple d’atténuer le bouton d’envoi.

Le piège le plus important : un champ vide avec required est incorrect dès le chargement de la page. Des bordures rouges avant même que l’utilisateur ait écrit quoi que ce soit ressemblent à une réprimande. La solution est :user-invalid, qui ne s’active qu’après une interaction : après une modification de la valeur et la sortie du champ, ou après une tentative d’envoi du formulaire. Elle fonctionne dans tous les grands navigateurs depuis 2023. L’ancienne méthode est :not(:placeholder-shown):invalid.

Syntaxe

#
Syntaxe
sélecteur:invalid { propriété: valeur; }

Utilisations courantes

#
  • input:invalid

    Tous les champs incorrects d’un coup. Le champ requis vide est rouge, bien que personne n’y ait encore touché.
  • input:valid

    Le contraire : les champs avec une valeur correcte. Corrigez le second champ en une adresse complète pour voir le changement.
  • input:user-invalid

    La bordure rouge n’apparaît qu’après une interaction. Rendez la valeur d’un champ incorrecte et cliquez à côté.
  • input:not(:placeholder-shown):invalid

    Ancienne méthode : l’erreur n’apparaît que dans les champs non vides. Le champ requis vide reste neutre.
  • form:invalid

    Le formulaire correspond aussi à :invalid dès qu’il contient au moins un champ incorrect.

Utilisations courantes en pratique

#

input:invalid

Tous les champs incorrects d’un coup. Le champ requis vide est rouge, bien que personne n’y ait encore touché.
input:invalid { border-color: #f43f5e; }

input:valid

Le contraire : les champs avec une valeur correcte. Corrigez le second champ en une adresse complète pour voir le changement.
input:valid { border-color: #10b981; }

input:user-invalid

La bordure rouge n’apparaît qu’après une interaction. Rendez la valeur d’un champ incorrecte et cliquez à côté.
input:user-invalid { border-color: #f43f5e; }

input:not(:placeholder-shown):invalid

Ancienne méthode : l’erreur n’apparaît que dans les champs non vides. Le champ requis vide reste neutre.
input:not(:placeholder-shown):invalid { border-color: #f43f5e; }

form:invalid

Le formulaire correspond aussi à :invalid dès qu’il contient au moins un champ incorrect.
form:invalid {
  outline: 2px dashed #f43f5e;
  outline-offset: 4px;
}

Compatibilité des navigateurs

#

Largement disponible

Fonctionne dans tous les navigateurs modernes, y compris sur mobile. Vous pouvez l’utiliser sans crainte.

  • Chrome
  • Edge
  • Firefox
  • Safari

Bonnes pratiques

#
  • N’affichez pas d’erreurs avant que l’utilisateur commence à agir. Mettez en valeur les champs incorrects via :user-invalid, et réservez :invalid par exemple à l’atténuation du bouton d’envoi.
  • La couleur seule ne suffit pas, car tout le monde ne la distingue pas. Ajoutez un message texte ou une icône à côté du champ.
  • La validation en HTML et en CSS est un confort pour l’utilisateur, pas une protection. Les données doivent de toute façon être vérifiées côté serveur.

Entrées associées

#

Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.