Guía educativa de selectores de estados de formularios
El estado pertenece al control y al navegador
Relaciona atributos, propiedades, restricciones y acciones del usuario sin simular los estados nativos.
Modelo mental
Algunos estados proceden del HTML inicial; otros cambian con propiedades o después de una interacción relevante.
:default / :checkedInicial no significa actual
:default conserva la elección indicada por HTML; :checked refleja qué radio, checkbox u option está seleccionado ahora.
:valid / :user-validValidez inmediata o posterior
:valid y :invalid reflejan las restricciones ya; :user-valid y :user-invalid esperan la interacción que determina el navegador.
indeterminateNo existe un atributo indeterminate
En un checkbox, indeterminate es una propiedad del objeto HTMLInputElement y debe establecerse mediante JavaScript.
Disponibilidad
Compara si el control participa en la interacción y si su valor puede modificarse.
:enabled
Controles de interfaz habilitados.
Especificidad(0, 1, 0)
:enabled
Comportamiento
- Depende de si el elemento admite el estado disabled.
- Un campo readonly sigue estando habilitado.
Ejemplos
input:enabledCoincide: <input name="active" />
<input name="locked" disabled />Errores frecuentes
- No significa que el valor sea editable.
- No se aplica a cualquier elemento sin atributo disabled.
:disabled
Controles de interfaz deshabilitados.
Especificidad(0, 1, 0)
:disabled
Comportamiento
- Un fieldset deshabilitado puede transmitir el estado a sus controles.
- Los controles deshabilitados no participan normalmente en el envío.
Ejemplos
button:disabledCoincide: <button disabled>Unavailable</button>
<button>Continue</button>Errores frecuentes
- No equivale a aria-disabled.
- No debe usarse solo para cambiar la apariencia.
:read-only
Elementos cuyo contenido no puede alterar el usuario.
Especificidad(0, 1, 0)
:read-only
Comportamiento
- readonly mantiene el control enfocable y enviable.
- Su aplicabilidad es más amplia que el atributo readonly.
Ejemplos
input:read-onlyCoincide: <input value="Fixed" readonly />
<input value="Editable" />Errores frecuentes
- No equivale a disabled.
- No significa que JavaScript no pueda cambiar el valor.
:read-write
Elementos cuyo contenido puede alterar el usuario.
Especificidad(0, 1, 0)
:read-write
Comportamiento
- Incluye campos editables y hosts contenteditable aplicables.
- El estado depende de la editabilidad, no del foco.
Ejemplos
textarea:read-writeCoincide: <textarea>Editable</textarea>
<textarea readonly>Fixed</textarea>Errores frecuentes
- No significa que el control sea :valid.
- Un input disabled no es editable.
:placeholder-shown
Campos que muestran actualmente su placeholder.
Especificidad(0, 1, 0)
:placeholder-shown
Comportamiento
- Deja de coincidir cuando el control tiene valor.
- Observa el estado del campo, no el pseudoelemento del texto.
Ejemplos
input:placeholder-shownCoincide: <input placeholder="Name" />
<input placeholder="Name" value="Ada" />Errores frecuentes
- No equivale a campo vacío en todos los controles.
- No debe confundirse con ::placeholder.
Soporte y compatibilidad
Consulta el estado Baseline específico de :placeholder-shown.
Elecciones
Distingue valores predeterminados, seleccionados e indeterminados.
:default
Opciones o botones que representan la elección inicial.
Especificidad(0, 1, 0)
:default
Comportamiento
- Puede seguir coincidiendo después de cambiar la selección actual.
- Se deriva del estado predeterminado definido por HTML.
Ejemplos
input:defaultCoincide: <input type="radio" name="plan" checked />
<input type="radio" name="plan" />Errores frecuentes
- No equivale a :checked.
- No selecciona cualquier valor recomendado.
Soporte y compatibilidad
Consulta el estado Baseline específico de :default.
:checked
Radios, checkboxes y opciones seleccionados actualmente.
Especificidad(0, 1, 0)
:checked
Comportamiento
- Cambia con la interacción real del usuario.
- En radios, marcar uno desmarca otro del mismo grupo.
Ejemplos
input:checkedCoincide: <input type="checkbox" checked />
<input type="checkbox" />Errores frecuentes
- No conserva necesariamente la elección inicial.
- No cubre el estado mixto.
:indeterminate
Controles cuyo estado no es afirmativo ni negativo.
Especificidad(0, 1, 0)
:indeterminate
Comportamiento
- En checkboxes se activa mediante la propiedad indeterminate.
- También puede aplicar a radios sin elección y progress sin value.
Ejemplos
input:indeterminateCoincide: <input type="checkbox" data-indeterminate />
<script>checkbox.indeterminate = true;</script>Errores frecuentes
- No existe un atributo HTML indeterminate.
- No equivale a unchecked.
Soporte y compatibilidad
Consulta el estado Baseline de :indeterminate y su aplicabilidad.
Validación
Observa obligatoriedad y validez antes y después de la interacción.
:required
Controles validables que exigen un valor.
Especificidad(0, 1, 0)
:required
Comportamiento
- Procede del atributo required cuando es aplicable.
- Puede combinarse con estados de validez.
Ejemplos
input:requiredCoincide: <input required />
<input />Errores frecuentes
- No todos los tipos de control admiten required.
- El asterisco visual no crea el estado.
:optional
Controles validables que no son obligatorios.
Especificidad(0, 1, 0)
:optional
Comportamiento
- Es el opuesto de :required dentro de los controles aplicables.
- Un campo opcional vacío suele ser válido.
Ejemplos
input:optional<input required />
Coincide: <input />Errores frecuentes
- No coincide con cualquier elemento sin required.
- Opcional no significa irrelevante.
:valid
Controles que satisfacen sus restricciones nativas.
Especificidad(0, 1, 0)
:valid
Comportamiento
- Puede coincidir desde la carga inicial.
- Se actualiza mientras cambia el valor.
Ejemplos
input:validCoincide: <input type="email" value="ada@example.com" required />
<input type="email" value="ada@" required />Errores frecuentes
- No espera a que el usuario abandone el campo.
- La validez nativa no sustituye toda validación de negocio.
:invalid
Controles que incumplen una restricción nativa.
Especificidad(0, 1, 0)
:invalid
Comportamiento
- Puede coincidir antes de cualquier interacción.
- El formulario también puede ser inválido si contiene un control inválido.
Ejemplos
input:invalid<input type="email" value="ada@example.com" required />
Coincide: <input type="email" value="ada@" required />Errores frecuentes
- No conviene mostrar un error agresivo solo por este estado inicial.
- No equivale a aria-invalid.
:user-valid
Controles válidos después de interacción relevante.
Especificidad(0, 1, 0)
:user-valid
Comportamiento
- El navegador decide cuándo el usuario ha comprometido el valor.
- Deja de coincidir si el valor vuelve a ser inválido.
Ejemplos
input:user-validCoincide: <input type="email" value="ada@example.com" required />
<!-- matches after relevant user interaction -->Errores frecuentes
- No es una clase touched controlada por la aplicación.
- No sustituye un mensaje accesible cuando sea necesario.
Soporte y compatibilidad
Está ampliamente disponible; su tiempo de activación pertenece al navegador.
:user-invalid
Controles inválidos después de interacción relevante.
Especificidad(0, 1, 0)
:user-invalid
Comportamiento
- Un intento de envío puede activarlo y enfocar el primer error.
- Permite retrasar la señal visual respecto a :invalid.
Ejemplos
input:user-invalidCoincide: <input type="email" value="ada@" required />
<!-- matches after relevant user interaction -->Errores frecuentes
- No se debe forzar en la carga inicial.
- CSS no sincroniza por sí solo aria-invalid.
Soporte y compatibilidad
Está ampliamente disponible; combina el estilo con feedback accesible.
Rangos
Compara los mismos min y max con valores dentro y fuera del intervalo.
:in-range
Controles con valor dentro de min y max.
Especificidad(0, 1, 0)
:in-range
Comportamiento
- Solo aplica a controles que admiten límites de rango.
- El valor también debe superar el resto de restricciones.
Ejemplos
input:in-rangeCoincide: <input type="number" min="1" max="10" value="5" />
<input type="number" min="1" max="10" value="14" />Errores frecuentes
- No compara longitudes de texto.
- Estar en rango no garantiza toda la validez.
:out-of-range
Controles con valor menor que min o mayor que max.
Especificidad(0, 1, 0)
:out-of-range
Comportamiento
- Se actualiza al modificar el número o fecha.
- Implica una causa concreta de invalidez.
Ejemplos
input:out-of-range<input type="number" min="1" max="10" value="5" />
Coincide: <input type="number" min="1" max="10" value="14" />Errores frecuentes
- Un valor con formato incorrecto no es necesariamente out-of-range.
- No se aplica sin límites relevantes.