CodeForge

Maquetación Web Dinámica / Pseudo-clases y pseudo-elementos: el arsenal secreto

:has() — el selector de padre que lo cambió todo

Teoría18 min20 XP

Durante 25 años, CSS solo miró hacia ABAJO: el padre estiliza al hijo, jamás al revés. "Estiliza la tarjeta SI contiene una imagen" era imposible — territorio de JavaScript. :has() rompió esa frontera en 2023 y es, sin exagerar, la adición más importante al CSS en una década. Hoy piensas en ambas direcciones.

La pregunta invertida

has.css

Se lee al revés que todo lo demás: A:has(B) selecciona A (el padre), no B. Y el argumento acepta combinadores: :has(> img) (hijo directo), :has(+ p) (¡hermano siguiente! — "el h2 seguido de un párrafo").

El caso estrella: validación visual sin JS

Disecciona el selector clave — .campo:has(input:invalid:not(:placeholder-shown)) — porque es una clase magistral de este módulo entero: el CAMPO (padre) reacciona si su input es inválido (:invalid, validación nativa del módulo 2) PERO solo si el usuario ya escribió algo (:not(:placeholder-shown) — el truco para no gritarle en rojo a un formulario recién abierto).

Patrones :has() del mundo real

patrones.css

¿Qué selecciona .campo:has(input:invalid:not(:placeholder-shown))?

Mini-reto

Agrégale al formulario de tu periódico la validación visual completa del ejemplo (borde rojo + mensaje al escribir mal, borde verde al corregir). Y el patrón galería: al hacer hover sobre una noticia, las demás se atenúan. Dos efectos "de JavaScript", cero JavaScript.

Qué sigue

Cierras las pseudo-CLASES. Entran los pseudo-ELEMENTOS: ::before y ::after — los dos hijos fantasma que todo elemento regala, y con los que se decora, se enumera... y se dibuja.