Evalúa el coste computacional y la complejidad de selección que genera la regla relacional :has() en el motor de renderizado de tu página.
En el Equipo Editorial | Utilidades.io desarrollamos esta herramienta para ayudar a los desarrolladores frontend a medir el impacto de las reglas CSS condicionales. El selector :has() representa uno de los mayores avances en el desarrollo CSS moderno, ya que permite aplicar estilos a un elemento en función de sus elementos descendientes o contiguos, actuando como un auténtico "selector de padres".
Sin embargo, con este poder sobreviene un coste de rendimiento en el motor de renderizado del navegador. A diferencia de las reglas descendentes tradicionales donde la coincidencia se verifica de arriba hacia abajo o de derecha a izquierda, :has() obliga al navegador a inspeccionar ramas completas del DOM y recalcular estilos cuando ocurre una mutación.
:has(> .hijo) en lugar de selecciones descendentes globales como :has(.hijo). Esto limita la inspección solo al primer nivel..card:has(.title):has(.img) incrementa exponencialmente las comprobaciones en el árbol DOM.:has() sobre selectores universales o etiquetas raíz muy amplias como main:has(...) o div:has(...).El selector :has() es un pseudo-clase CSS conocido como el "selector de padre" que permite aplicar estilos a un elemento en función de sus descendientes o hermanos. Afecta al rendimiento porque requiere que el motor del navegador revise la estructura interna del DOM hacia abajo o lateralmente para determinar el estilo del contenedor ascendente.
La herramienta simula un árbol DOM con el número de nodos, profundidad y regla de selección especificados. Analiza la cantidad de comprobaciones ascendentes y descendentes necesarias para resolver la regla CSS y estima la carga computacional en milisegundos y el porcentaje de impacto en el renderizado.
Sí, actualmente :has() cuenta con un soporte superior al 90% en todos los navegadores modernos. Sin embargo, para evitar problemas de rendimiento (recalculo de estilos), se recomienda acotar su alcance utilizando combinadores directos como :has(> .hijo) en lugar de selecciones descendentes profundas.