:has() para decisiones de layout y estado
Selecciona el elemento actual cuando se cumple una condición interna.
Durante años CSS no podía seleccionar un padre según su contenido. :has() resuelve eso y habilita patrones que antes requerían JavaScript.
La forma mental correcta es: elemento:has(condición). Si la condición se cumple, se estiliza el elemento principal.
En .card:has(img) no seleccionas la imagen, seleccionas la tarjeta por su contenido. En formularios, form:has(:invalid) permite feedback global de estado.
- Sintaxis:
elemento:has(selector). - Casos típicos: tarjetas con/sin media, menús con submenú, formularios con errores.
- Puedes combinar
:has()con:not():article:not(:has(img)). - Acota el alcance por componente:
.checkout-form:has(:invalid)suele ser mejor que reglas globales. - Compatibilidad: soporte sólido en navegadores modernos; revisa Can I Use.
.card:has(img) {
grid-template-columns: 160px 1fr;
border-color: #f59e0b;
}
.form-row:has(input:focus) {
outline: 2px solid #2563eb;
}
form:has(:invalid) .btn-submit {
opacity: 0.6;
pointer-events: none;
}
nav li:has(ul) > a::after {
content: "▾";
margin-left: 0.35rem;
}