:valid es una pseudo-clase que representa cuando un elemento <input> es válido, basado en la información de sus atributos. Es decir que aplica estilos para validar cuando la información es correcta.
input[type="email"]:valid {
background: green;
}Esto cambia dependiendo del tipo de input y de sus atributos, no es lo mismo validad un number que un email o un url, incluso el hecho de usar required cambia la validación.
Uso
El uso va de verificar desde CSS si el estado es válido o no y a partir de esa condición aplicar los estilos correspondientes.
<input type="email" name="email" placeholder="email" />
<input type="email" name="email" placeholder="email" required />
/* Aplica fondo verde a todos los inputs tipo email válidos */
input[type="email"]:valid {
background: #06D6A0;
}
Debido a que el primer input no tiene el atributo required automáticamente se convierte en un elemento válido. No importa si hay un email o no, la información se va a poder enviar en el formulario.
Como mencione antes, todo depende del tipo de input y sus atributos. He aquí algunos ejemplos de como sería la validación en diferentes formularios:
<div class="wrapper">
<label>URL</label>
<input type="url" placeholder="url" required />
</div>
<div class="wrapper">
<label>Email</label>
<input type="email" placeholder="email" required />
</div>
<div class="wrapper">
<label>Digita un número del 0 al 9</label>
<input type="text" pattern="[0-9]{1}" placeholder="number" required />
</div>
<div class="wrapper">
<label>Digita un número</label>
<input type="number" placeholder="number" required />
</div>
<div class="wrapper">
<label>Digita al menos 3 valores</label>
<input type="text" placeholder="number" required minlength="3" />
</div>input:valid {
background: #06D6A0;
}