0Pricing
CSS Academy · Lección

Pseudo-clase relacional :has()

Seleccione elementos padre según sus hijos mediante la potente pseudo-clase relacional :has().

Pseudo-clase relacional :has() es una lección gratuita de CSS Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de CSS Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de CSS Academy incluye 4 lecciones en total.

¿Qué es :has()?

La pseudoclase :has() selecciona un elemento si contiene un descendiente que coincide con el argumento. A menudo llamada el «selector de padre», permite aplicar estilos a un elemento padre según sus elementos hijos, una capacidad que CSS nunca había tenido.

Sintaxis básica

.card:has(img) selecciona cualquier elemento .card que contenga un descendiente img. El argumento es una lista de selectores relativos: cualquier selector CSS válido que describa elementos en relación con el elemento sujeto.

Aplicación de estilos a elementos padre

Aplique estilos a un contenedor de formulario cuando contenga una entrada no válida: form:has(:invalid) { border-color: red; }. Aplique estilos a una sección que contenga un encabezado: section:has(h2) { padding-top: 2rem; }. El elemento padre cambia de apariencia según el estado del elemento hijo.

Selección de elementos hermanos

:has() puede seleccionar hermanos anteriores, algo que + y ~ no pueden hacer. h2:has(+ p) selecciona elementos h2 seguidos inmediatamente por p. li:has(~ .active) selecciona elementos li que tienen un hermano posterior .active.

Estilos según el estado de los formularios

Reaccione a la validez nativa de los formularios sin JavaScript: input:has(~ .error-msg) aplica estilos a una entrada que tiene un mensaje de error hermano. label:has(+ input:required) aplica estilos a las etiquetas cuyo campo de entrada asociado es obligatorio, todo únicamente con CSS.

Estado de la navegación

Resalte los contenedores de navegación según el elemento hijo activo: nav:has(.active) aplica estilos a toda la navegación cuando cualquier elemento hijo tiene la clase active. Es útil para indicar, a nivel del contenedor, qué sección de navegación está activa.

Combinación con otras pseudoclases

.grid:has(.card:focus-within) aplica estilos a toda la cuadrícula cuando cualquier tarjeta recibe el foco del teclado. .dropdown:has(:hover) mantiene abierto un menú desplegable mientras se pasa el puntero sobre cualquier descendiente, de forma más sencilla que las cadenas complejas de combinadores de hermanos.

Equivalente a una consulta de medios en CSS

.sidebar:has(nav) aplica una distribución diferente a .sidebar:not(:has(nav)). Permite crear una distribución condicional sin JavaScript: la presencia o ausencia de determinados elementos hijos determina la distribución del elemento padre, lo que permite usar CSS realmente adaptable y consciente del contenido.

Consideraciones de rendimiento

Usar :has() con selectores de argumento amplios, como :has(*), puede ser costoso, ya que el navegador debe comprobar todos los elementos. Mantenga específicos los argumentos de :has(). Cuando sea posible, prefiera :has(> .specific-child) (hijo directo) a :has(.specific-child) (cualquier descendiente).

Compatibilidad con navegadores

:has() es compatible con Chrome 105+, Safari 15.4+ y Firefox 121+. Cuenta con compatibilidad completa de línea base desde finales de 2023. No existe ningún polyfill (requeriría JavaScript para simularlo); úselo con mejora progresiva en navegadores antiguos cuando la funcionalidad no sea esencial.

Sustitución de patrones de JavaScript

Patrones que antes requerían detectores de eventos de JS: «añadir una clase al padre cuando el hijo recibe el foco», «mostrar una superposición cuando existe modal-trigger» y «aplicar estilos diferentes a una cuadrícula cuando tiene exactamente tres elementos». :has() gestiona todos estos casos de forma declarativa.

Comprobación de conocimientos

¿Qué hace que :has() sea único frente a combinadores CSS existentes como + y ~?

Resumen

:has() es la primera pseudoclase relacional verdadera de CSS y permite seleccionar elementos padre y hermanos anteriores. Permite aplicar estilos determinados por el contenido, reaccionar al estado de los formularios, resaltar la navegación y resolver muchos patrones que antes requerían manipular el DOM con JavaScript, todo de forma declarativa en CSS.

Preguntas frecuentes

¿La lección «Pseudo-clase relacional :has()» es gratis?

Sí — el texto completo de «Pseudo-clase relacional :has()» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de CSS Academy, actualiza a CoddyKit PRO. El curso de CSS Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Pseudo-clase relacional :has()»?

Seleccione elementos padre según sus hijos mediante la potente pseudo-clase relacional :has(). Practicas CSS Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar CSS Academy?

No se requiere experiencia previa. CSS Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «Pseudo-clase relacional :has()»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de CSS Academy?

Sí. Cada lección de CSS Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Anidamiento nativo de CSS
  2. Pseudo-clase relacional :has()
  3. @scope para estilos con ámbito
  4. API View Transitions
← Volver a CSS Academy